我正在基于网上找到的一个简单的自动编码器示例,在python中建立模型。该示例是为喀拉拉邦编写的。在建议的过渡到tensorflow.keras的过程中,我修改了程序的导入,希望不需要进行其他更改。
随着喀拉拉邦进口
from keras.layers import Input, Dense
from keras.models import Model
from keras.datasets import mnist
自动编码器工作正常,您可以看到它在std输出中收敛,并且恢复的图像有意义。当我使用张量流输入
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。我愚弄了重新缩放输入数据和其他幼稚技巧的举动,但无济于事。我已经在另外两台计算机上验证了该行为。有什么可以解释为什么两组进口产品之间的性能如此不同?
看来是因为optimizer='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或任何其他模块(包括import tensorflow_core)导入,并且可能会突然中断。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句