Я пытаюсь создать функцию потерь в Keras, это по сути сиамская сеть, однако я получаю вышеуказанную ошибку, когда пытаюсь это сделать.
Предполагается, что сиамская сеть получит два входа, которые передаются в виде пустых массивов в объект SiameseNetwork как self.y_pred и self.y_true. Плотная сиамская сеть тогда создает потерю или «подобие». Мой код ниже работает до тех пор, пока я не попытаюсь скомпилировать родительскую модель. Форма ввода (1, 1920).
Код сиамской сети:
class SiameseNetwork:
def __init__(self, input_shape):
self.input_shape = input_shape
self.true_input = (1,) + input_shape
self.base_net = self.build_base()
self.input_one = Input(shape=self.input_shape)
self.input_two = Input(shape=self.input_shape)
self.processed_one = self.base_net(self.input_one)
self.processed_two = self.base_net(self.input_two)
self.distance = Lambda(self.euclidean_distance)([self.processed_one, self.processed_two])
self.together = Dense(1, activation=self.reverse_sigmoid)(self.distance)
self.siamese_net = Model([self.input_one, self.input_two], self.together)
self.siamese_net.summary()
loss = self.contrastive_meta_loss
optimizer = RMSprop()
self.siamese_net.compile(loss=loss, optimizer=optimizer)
self.loss = 1.0
self.random_input = np.random.random_sample(self.true_input)
print("Random input shape", self.random_input.shape)
self.y_pred = self.random_input
self.y_true = self.random_input
print('debugging: y_true shape:', self.y_true.shape)
def reverse_sigmoid(self, x):
return K.sigmoid(-x)
def contrastive_meta_loss(self, y_true, y_pred):
margin = 1
square_pred = K.square(y_pred)
margin_square = K.square(K.maximum(margin - y_pred, 0))
return K.mean(y_true * square_pred + (1 - y_true) * margin_square)
def build_base(self):
inputs = Input(shape=self.input_shape)
x = Flatten()(inputs)
x = tf.layers.Dense(1024, activation='relu')(x)
x = tf.layers.Dropout(.1)(x)
x = tf.layers.Dense(1024, activation='relu')(x)
x = tf.layers.Dropout(.1)(x)
x = tf.layers.Dense(1024, activation='relu')(x)
model = Model(inputs, x)
print("Debugging: 110XA25B:")
model.summary()
return model
def euclidean_distance(self, vects):
x, y = vects
sum_sq = K.sum(K.square(x - y), axis = 1, keepdims=True)
return K.sqrt(K.maximum(sum_sq, K.epsilon()))
def siamese_loss(self, fake_y_true, fake_y_pred):
print("Debugging: 110XA1SS:", self.y_true.shape, self.y_pred.shape)
self.loss = self.siamese_net.predict([self.y_true, self.y_pred])
self.siamese_net.fit(x=[y_true, y_pred], y=self.loss, epochs=1, verbose=0)
return self.loss
Traceback + Ошибка при попытке скомпилировать родительскую модель с SiameseNetwork.siamese_loss в качестве функции потери:
Traceback (most recent call last):
File "run_mouse_rewards.py", line 109, in <module>
run()
File "run_mouse_rewards.py", line 45, in run
dqn.initialize()
File "/home/ai/Downloads/ScreenMouse/Organized/ba2c.py", line 232, in initialize
self.actor.compile(loss=self.actor_loss, optimizer = self.optimizer)
File "/home/ai/anaconda3/envs/drl/lib/python3.6/site-packages/tensorflow/python/training/checkpointable/base.py", line 442, in _method_wrapper
method(self, *args, **kwargs)
File "/home/ai/anaconda3/envs/drl/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py", line 449, in compile
output_loss = weighted_loss(y_true, y_pred, sample_weight, mask)
File "/home/ai/anaconda3/envs/drl/lib/python3.6/site-packages/tensorflow/python/keras/engine/training_utils.py", line 647, in weighted
score_array = fn(y_true, y_pred)
File "/home/ai/Downloads/ScreenMouse/Organized/ba2c.py", line 87, in siamese_loss
self.loss = self.siamese_net.predict([self.y_true, self.y_pred])
File "/home/ai/anaconda3/envs/drl/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py", line 1113, in predict
self, x, batch_size=batch_size, verbose=verbose, steps=steps)
File "/home/ai/anaconda3/envs/drl/lib/python3.6/site-packages/tensorflow/python/keras/engine/training_arrays.py", line 329, in model_iteration
batch_outs = f(ins_batch)
File "/home/ai/anaconda3/envs/drl/lib/python3.6/site-packages/tensorflow/python/keras/backend.py", line 3168, in __call__
[x.numpy() for x in outputs])
File "/home/ai/anaconda3/envs/drl/lib/python3.6/site-packages/tensorflow/python/keras/backend.py", line 3168, in <listcomp>
[x.numpy() for x in outputs])
AttributeError: 'Tensor' object has no attribute 'numpy'