Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中keras和tensorflow.keras之间的意外性能差异_Python_Python 3.x_Tensorflow_Keras_Deep Learning - Fatal编程技术网

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

我正在基于我在网上找到的一个简单的自动编码器示例,用python构建一个模型。这个例子是为keras编写的。通过推荐的到tensorflow.keras的转换,我修改了程序的导入,希望不需要其他更改

与凯拉斯进口

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)不受支持,可能会意外中断