AttributeError: объект 'Tensor' не имеет атрибута 'numpy' в бэкэнде keras - PullRequest
0 голосов
/ 16 июня 2019

Я пытаюсь создать функцию потерь в 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...