Если вы используете adam
, модель tf.keras
работает лучше. (keras
и tf.keras
использует две разные версии оптимизаторов)
Скорее всего, это связано с momentum
для сходимости этих данных. Это очень медленно, возможно, вам нужно будет тренироваться для большего количества эпох с более высокой скоростью обучения.
Вот ответ, почему следует избегать adadelta: Как правильно установить параметры алгоритма Adadelta в Tensorflow?
import tensorflow as tf
(x_train,_), (x_test,_) = tf.keras.datasets.mnist.load_data()
x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.
x_train = x_train.reshape((len(x_train), 784))
x_test = x_test.reshape((len(x_test), 784)) # None, 784
# import keras
import tensorflow.keras as keras
my_autoencoder = keras.models.Sequential([
keras.layers.Dense(64, input_shape=(784, ), activation='relu'),
keras.layers.Dense(784, activation='sigmoid')
])
my_autoencoder.compile(optimizer='adam', loss='binary_crossentropy')
my_autoencoder.fit(x_train, x_train, epochs=10, shuffle=True, validation_data=(x_test, x_test))
Epoch 1/10
1875/1875 [==============================] - 5s 3ms/step - loss: 0.1372 - val_loss: 0.0909
Epoch 2/10
1875/1875 [==============================] - 5s 3ms/step - loss: 0.0840 - val_loss: 0.0782
Epoch 3/10
1875/1875 [==============================] - 5s 3ms/step - loss: 0.0773 - val_loss: 0.0753
Epoch 4/10
1875/1875 [==============================] - 5s 3ms/step - loss: 0.0754 - val_loss: 0.0742
Epoch 5/10
1875/1875 [==============================] - 5s 3ms/step - loss: 0.0747 - val_loss: 0.0738
Epoch 6/10
1875/1875 [==============================] - 5s 3ms/step - loss: 0.0744 - val_loss: 0.0735
Epoch 7/10
1875/1875 [==============================] - 5s 3ms/step - loss: 0.0741 - val_loss: 0.0734
Epoch 8/10
1875/1875 [==============================] - 5s 3ms/step - loss: 0.0740 - val_loss: 0.0733
Epoch 9/10
1875/1875 [==============================] - 5s 3ms/step - loss: 0.0738 - val_loss: 0.0731
Epoch 10/10
1875/1875 [==============================] - 5s 3ms/step - loss: 0.0737 - val_loss: 0.0734
<tensorflow.python.keras.callbacks.History at 0x7f8c83d907b8>
NB: keras
и tf.keras
имеют несколько разные реализации для Model
, поэтому внутри они вызывают разные функции, производительность может отличаться, это неудивительно.
На самом деле проблема заключается в оптимизаторе, а не в модели, чтобы проверить это, вы можете попробовать обучить модель keras
с tf
AdaDelta, она также покажет плохие результаты.
import keras
# import tensorflow.keras as keras
my_autoencoder = keras.models.Sequential([
keras.layers.Dense(64, input_shape=(784, ), activation='relu'),
keras.layers.Dense(784, activation='sigmoid')
])
my_autoencoder.compile(tf.keras.optimizers.Adadelta(), loss='binary_crossentropy')
my_autoencoder.fit(x_train, x_train, epochs=10, shuffle=True, validation_data=(x_test, x_test))
Train on 60000 samples, validate on 10000 samples
Epoch 1/10
60000/60000 [==============================] - 6s 101us/step - loss: 0.6955 - val_loss: 0.6946
Epoch 2/10
60000/60000 [==============================] - 6s 99us/step - loss: 0.6936 - val_loss: 0.6927
Epoch 3/10
60000/60000 [==============================] - 6s 100us/step - loss: 0.6919 - val_loss: 0.6910
Epoch 4/10
60000/60000 [==============================] - 6s 96us/step - loss: 0.6901 - val_loss: 0.6892
Epoch 5/10
60000/60000 [==============================] - 6s 94us/step - loss: 0.6883 - val_loss: 0.6873
Epoch 6/10
60000/60000 [==============================] - 6s 95us/step - loss: 0.6863 - val_loss: 0.6851
Epoch 7/10
60000/60000 [==============================] - 6s 101us/step - loss: 0.6839 - val_loss: 0.6825
Epoch 8/10
60000/60000 [==============================] - 6s 101us/step - loss: 0.6812 - val_loss: 0.6794
Epoch 9/10
60000/60000 [==============================] - 6s 99us/step - loss: 0.6778 - val_loss: 0.6756
Epoch 10/10
60000/60000 [==============================] - 6s 101us/step - loss: 0.6736 - val_loss: 0.6710
<keras.callbacks.callbacks.History at 0x7f8c805bbe10>
keras
и tf.keras
вызывает два разных оптимизатора, когда параметр оптимизатора передается в виде строки.
import tensorflow as tf
# import tensorflow.keras as keras
my_autoencoder = tf.keras.models.Sequential([
tf.keras.layers.Dense(64, input_shape=(784, ), activation='relu'),
tf.keras.layers.Dense(784, activation='sigmoid')
])
my_autoencoder.compile('adadelta', loss='binary_crossentropy')
my_autoencoder.fit(x_train, x_train, epochs=1, shuffle=True, validation_data=(x_test, x_test))
my_autoencoder.optimizer
<tensorflow.python.keras.optimizer_v2.adadelta.Adadelta at 0x7f8c7fc3ce80>
import keras
# import tensorflow.keras as keras
my_autoencoder = keras.models.Sequential([
keras.layers.Dense(64, input_shape=(784, ), activation='relu'),
keras.layers.Dense(784, activation='sigmoid')
])
my_autoencoder.compile('adadelta', loss='binary_crossentropy')
my_autoencoder.fit(x_train, x_train, epochs=1, shuffle=True, validation_data=(x_test, x_test))
my_autoencoder.optimizer
<keras.optimizers.Adadelta at 0x7f8c7fc3c908>
Итак, путаницы можно избежать, импортировав оптимизатор отдельно.