python中keras和tensorflow.keras之间的意外性能差异
我正在基于我在网上找到的一个简单的自动编码器示例,用python构建一个模型。这个例子是为keras编写的。通过推荐的到tensorflow.keras的转换,我修改了程序的导入,希望不需要其他更改 与凯拉斯进口python中keras和tensorflow.keras之间的意外性能差异,python,python-3.x,tensorflow,keras,deep-learning,Python,Python 3.x,Tensorflow,Keras,Deep Learning,我正在基于我在网上找到的一个简单的自动编码器示例,用python构建一个模型。这个例子是为keras编写的。通过推荐的到tensorflow.keras的转换,我修改了程序的导入,希望不需要其他更改 与凯拉斯进口 from keras.layers import Input, Dense from keras.models import Model from keras.datasets import mnist 自动编码器工作正常,您可以在std输出中看到它会聚,恢复的图像有意义。当我使用t
from keras.layers import Input, Dense
from keras.models import Model
from keras.datasets import mnist
自动编码器工作正常,您可以在std输出中看到它会聚,恢复的图像有意义。当我使用tensorflow输入时
from tensorflow.python.keras.layers import Input, Dense
from tensorflow.python.keras.models import Model
from tensorflow.python.keras.datasets import mnist
结果不再收敛,恢复的图像看起来就像噪声
下面是我的问题的最低工作示例。只需在上述两个导入之间进行更改,以再现行为上的差异
import numpy as np
import matplotlib.pyplot as plt
def prepModel(inputShape, outputShape, numNeurons):
input_image = Input(shape=(inputShape,))
#encoded representation of input
encoded = Dense(numNeurons, activation='relu')(input_image)
#decoded lossy reconstruction
decoded = Dense(outputShape, activation='sigmoid')(encoded)
#model to encoded data
autoencoder = Model(input_image, decoded)
encoder = Model(input_image, encoded)
encoded_input = Input(shape=(numNeurons,)) #placeholder
decoder_layer = autoencoder.layers[-1] #last layer of model
decoder = Model(encoded_input, decoder_layer(encoded_input)) #decoder model
autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')
return autoencoder, encoder, decoder
def prepData():
#import / set data
(x_train, _), (x_test, _) = 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), np.prod(x_train.shape[1:])))
x_test = x_test.reshape((len(x_test), np.prod(x_test.shape[1:])))
return x_train, x_test
def runModel(autoencoder, encoder, decoder, x_train, x_test):
#train encoder
autoencoder.fit(x_train, x_train,
epochs=50,
batch_size=256,
shuffle=True,
validation_data=(x_test, x_test))
encoded_images = encoder.predict(x_test)
decoded_images = decoder.predict(encoded_images)
return encoded_images, decoded_images
def plotComparison(x_test, decoded_images):
#Plot original image
n = 10
plt.figure(figsize=(20,4))
for i in range(n):
ax = plt.subplot(2,n,i+1)
plt.imshow(x_test[i].reshape(28,28))
plt.gray()
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)
#plot decompressed image
ax = plt.subplot(2, n, i+1+n)
plt.imshow(decoded_images[i].reshape(28,28))
plt.gray()
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)
plt.show()
x_train, x_test = prepData()
autoencoder, encoder, decoder = prepModel(784, 784, 16)
encoded_images, decoded_images = runModel(autoencoder, encoder, decoder, x_train, x_test)
plotComparison(x_test, decoded_images)
我正在运行python 3.8.3、keras版本2.3.1和tensorflow版本2.2.0。我愚弄了一下,重新缩放输入数据和其他幼稚的技巧都没有用。我已经在另外两台计算机上验证了这种行为。有什么可以解释为什么这两组导入之间的性能如此不同 这似乎是因为
优化器='adadelta'
。如上所述:
keras版本中Adadelta优化器的默认学习速率为
1.0,在tensorflow.keras中为0.001。
因此,要解决此问题,请尝试使用optimizer=tensorflow.keras.optimizers.Adadelta(lr=1.0)
而不是optimizer='Adadelta'
。或者,您也可以使用另一个优化器,如“adam”
补充说明:同样要注意的是,尝试使用tensorflow.keras.
而不是tensorflow.python.keras.
从tensorflow.python或任何其他模块导入(包括
导入tensorflow_core)不受支持,可能会意外中断
这似乎是因为
优化器='adadelta'
。如上所述:
keras版本中Adadelta优化器的默认学习速率为
1.0,在tensorflow.keras中为0.001。
因此,要解决此问题,请尝试使用optimizer=tensorflow.keras.optimizers.Adadelta(lr=1.0)
而不是optimizer='Adadelta'
。或者,您也可以使用另一个优化器,如“adam”
补充说明:同样要注意的是,尝试使用tensorflow.keras.
而不是tensorflow.python.keras.
从tensorflow.python或任何其他模块导入(包括
导入tensorflow_core)不受支持,可能会意外中断