AttributeError:“ tensor”对象在keras后端中没有属性“ numpy”

时间:2019-06-16 09:52:34

标签: tensorflow keras

我正在尝试在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'

0 个答案:

没有答案