Keras 模型(tensorflow 后端)在 python 3.5 中训练得非常好但在 python 2.7 中训练非常糟糕

Keras model (tensorflow backend) trains perfectly well in python 3.5 but very bad in python 2.7

我想做什么
我正在尝试在 Python 2.7 中使用 Keras 和 Tensorflow-GPU 作为后端来训练用于图像检测的卷积神经网络 (CNN),因为我需要将它与仅支持 [=54= 的 ROS kinetic 一起使用] 2.7(而不是 3.5)。我的模型是顺序模型(代码见下文)。

我在用什么
Pycharm-社区 2018.1.4
凯拉斯 2.2.0
Tensorflow-GPU 1.8.0
60000 张输入图像,100x100 像素(3 个通道),3 类 ("train_set")
20000 张评估图像,尺寸相同 ("evaluation_set")

有效方法
当使用 Python 3.5 在我的 train_set 上训练模型并使用 Python 3.5 对其进行评估时,它工作得很好(train_accuracy:0.99874 , evaluation_accuracy: 0.9993).

什么不起作用
当使用 Python 2.7 在我的 train_set 上训练模型并使用 Python 2.7 对其进行评估时,我的准确性急剧下降(train_accuracy:0.695 , evaluation_accuracy: 0.543),这与猜测 3 类(即 0.3333)差不多。
我也试过在Python 3.5训练模型,然后在Python 2.7加载模型进行评估和预测,但结果和以前一样差。

在所有情况下,我都使用完全相同的代码:

def build_model(training_input):
    model = Sequential()  
    model.add(Conv2D(32, (3, 3)) # Add some layers

    model.compile(optimizer='RMSprop', loss='categorical_crossentropy', metrics=['accuracy'])

def train():
    input_training = np.array(input_training_list)    # input_training_list is a list containing the imagedata
    labels_training = np.array(label_training_list)    # label_training_list is a list containing the labels corresponding to the imagedata
    model = create_model(input_training)
    history = model.fit(input_training, labels_training, epochs=10, shuffle=True, batch_size=20)
    model.save(model_directory + "my_model.h5")

def evaluation():
    input_evaluation = np.array(input_evaluation_list)
    labels_evaluation = np.array(label_evaluation_list)
    model = load_model(model_directory + "my_model.h5")
    loss, acc = model.evaluate(input_evaluation, labels_evaluation, batch_size=1)

我听说很多人使用不同的计算机或不同版本的 Python 在不同的 Sessions() 中加载相同的模型时遇到问题。但是这里相同的架构在两个 Python 版本中给出了完全不同的结果。

我找到了问题的解决方案(感谢 user1735003 提供有关我的数据的提示)。
由于 差异 关于 Python 2.x 和 Python 3.x。在实现我的图像数据时,我使用

for i in range(len(evaluation_files)):
    input_evaluation = np.divide(ndimage.imread(evaluation_files[i]), 255)

但这就是问题所在:在 Python 3.x 中这工作得很好,因为两个整数相除会产生浮点数,但在 Python 2.x 中结果也是一个整数,所以我的 input_evalution 列表只包含零。我需要 除以 255.0(使结果成为浮点数)。

input_evaluation = np.divide(ndimage.imread(evaluation_files[i]), 255.0)

或者从 __future__ 导入 division 以从已经在 python 中的整数除法中获得浮点结果 2.

from __future__ import division

使用 Python 2.x 或 Python 3.x 时存在一些主要差异,您可以在 http://sebastianraschka.com/Articles/2014_python_2_3_key_diff.html 上看到非常好的示例。

我还在 Python 3.5 上训练了我的模型,使用 model.save('my_model') 保存它并使用 keras.models.load_model('my_model') 在 Python 2.7 中加载它,效果非常好。

人们也可以很容易地使用 model.save_weights('my_weights') 保存权重,在 Python 2.7 中创建一个具有相同架构(!)的新模型,然后使用 [=18= 将权重加载到该模型中],但由于仅加载模型本身就可以很好地工作,因此这种方式要容易得多。