Keras最简单的转换网络什么也没学

时间:2018-07-26 15:12:35

标签: python tensorflow keras

我写了一些简单的代码来学习Keras:

from tensorflow import keras


def main():
    (x_train, y_train), (x_test, y_test) = keras.datasets.cifar10.load_data()

    model = keras.Sequential()

    model.add(keras.layers.Conv2D(16, 3, padding='same', activation='relu'))
    model.add(keras.layers.Flatten())
    model.add(keras.layers.Dense(10, activation='softmax'))

    model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

    model.fit(x_train, y_train, epochs=4)

    model.summary()


if __name__ == '__main__':
    main()

但是似乎什么也没学。不喜欢它应该学很多,但是至少应该减少损耗并稍微提高精度。但是两者在每个时代都是一样的。

我使用Pytorch编写了完全相同的模型,并且达到了约35%的准确性。 tensorflow + keras中的这个值停留在10%。

tensorflow-gpu v1.9

我想念什么?

2 个答案:

答案 0 :(得分:0)

我认为此问题的默认学习率很高。尝试类似

opt=keras.optimizers.Adam(lr=1.e-5)
model.compile(optimizer=opt, loss='sparse_categorical_crossentropy', 
              metrics=['accuracy'])

答案 1 :(得分:0)

我检查了AdamkerasPyTorch使用的默认学习率,它们都使用1e-3。因此,假设两个模型都使用默认值,学习率就不是问题。

或者,我认为这与权重初始化有关,权重初始化由keras中的每一层显式处理,而不是PyTorch中的每一层处理。

只需将训练行更改为以下内容,

  

model.fit(x_train / 255。,y_train,shuffle = True,   validation_data =(x_test / 255。,y_test),纪元= 4)

您应该观察到培训和验证的准确性均达到60%左右。

我对PyTorch不熟悉,但是我建议您使用keras网络使用的权重来初始化PyTorch网络中的权重。这样,您将有一个公平的比较。