我正在尝试在Keras中创建一个损失函数,这实际上是一个暹罗网络,但是在尝试这样做时却收到了以上错误。
该暹罗网络应该获得两个输入,分别作为numpy数组作为self.y_pred和self.y_true输入到SiameseNetwork对象。然后,密集的暹罗网络造成损失或“相似性”。在尝试编译父模型之前,下面的代码可以正常工作。输入形状为(1,1920)。
SiameseNetwork代码:
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
尝试使用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'