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

问题描述 投票:6回答:1

我尝试做什么 我正在尝试使用Keras和Tensorflow-GPU作为后端在Python 2.7中训练卷积神经网络(CNN)进行图像检测,因为我需要将它与ROS动力学一起使用,它只支持Python 2.7(而不是3.5)。我的模型是Sequential(代码见下)。

我在用什么 Pycharm-Community 2018.1.4 Keras 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版本中,相同的架构给出了完全不同的结果。

python-2.7 tensorflow model keras python-3.5
1个回答
2
投票

我找到了我的问题的解决方案(感谢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)

或者从division导入__future__以获得已经在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中创建相同体系结构的新模型(!)并使用model.load_weights('my_weights')将权重加载到该模型中,但是因为只需加​​载模型本身就可以非常精细地工作。

© www.soinside.com 2019 - 2024. All rights reserved.