Невозможно построить собственную модель Keras с потерями - PullRequest
1 голос
/ 07 февраля 2020

Я столкнулся с этой проблемой после запуска примера VAE в документации , которую нельзя построить до подгонки данных.

По-видимому, это dr aws следующая ошибка: ValueError: Expected a symbolic Tensors or a callable for the loss value. Please wrap your loss computation in a zero argument `lambda`.

Вот простое MWE:

import tensorflow as tf
from tensorflow.keras import layers

class Test(tf.keras.Model):

    def __init__(self, input_dim=784, name='test', **kwargs):
        super(Test, self).__init__(name=name, **kwargs)
        self.dense1 = layers.Dense(input_dim)
        self.dense2 = layers.Dense(input_dim, activation='relu')

    def call(self, inputs):
        y1 = self.dense1(inputs)
        y2 = self.dense2(inputs)
        loss = tf.keras.backend.mean(y2)
        self.add_loss(loss)
        return y1

(x_train, _), _ = tf.keras.datasets.mnist.load_data()
x_train = x_train.reshape(60000, 784).astype('float32') / 255

train_dataset = tf.data.Dataset.from_tensor_slices(x_train)
train_dataset = train_dataset.shuffle(buffer_size=1024).batch(64)

test = Test()
test.compile(optimizer='adam', loss='mse')

# test.build(input_shape=(64,784)) # --> gives error if uncommented.
# test.summary() # --> gives error if uncommented.
test.fit(x_train, x_train, epochs=3, batch_size=64)  # --> works well.
test.summary() # --> now it works fine.

Если я удалю self.add_loss из модели, то модель сможет построить правильно.

Есть ли способ build модели до fit связать ее с пользовательской потерей self.add_loss()? Спасибо!

1 Ответ

0 голосов
/ 02 апреля 2020

Кажется, это известная проблема. Попробуйте проверить это здесь https://github.com/tensorflow/tensorflow/issues/26274

Передача образца входных данных в тестовом экземпляре сделала свое дело. Добавление строки ниже.

test = Test()
test(x_train[:1])

Вот рабочий код, смоделированный с использованием google colab

import tensorflow as tf
from tensorflow.keras import layers

class Test(tf.keras.Model):

    def __init__(self, input_dim=784, name='test', **kwargs):
        super(Test, self).__init__(name=name, **kwargs)
        self.dense1 = layers.Dense(input_dim)
        self.dense2 = layers.Dense(input_dim, activation='relu')

    def call(self, inputs):
        y1 = self.dense1(inputs)
        y2 = self.dense2(inputs)
        loss = tf.keras.backend.mean(y2)
        self.add_loss(loss)
        return y1

(x_train, _), _ = tf.keras.datasets.mnist.load_data()
x_train = x_train.reshape(60000, 784).astype('float32') / 255

train_dataset = tf.data.Dataset.from_tensor_slices(x_train)
train_dataset = train_dataset.shuffle(buffer_size=1024).batch(64)
test = Test()
test(x_train[:1]) # this will automatically build the model as per the error indicated. It seems that this is a bug
test.compile(optimizer='adam', loss='mse')
test.summary()
#test.build(x_train[:1]) # --> gives error if uncommented.
# test.summary() # --> gives error if uncommented.
#test.fit(x_train, x_train, epochs=3, batch_size=64)  # --> works well.
#test.summary() #
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...