Theano中的Pickle multy层CNN,Lenet5

时间:2017-02-09 08:55:49

标签: deep-learning theano conv-neural-network image-recognition

我是深度学习的新手,我遇到了问题。 我正在使用Theano进行图像识别,我想用训练模型创建一个预测系统。 我引用了LeNet5 Convolutional Neural Networks (LeNet)并训练了我自己的数据,现在我想使用训练好的模型来预测新图像。 在Classifying MNIST digits using Logistic Regression中,它描述了训练模型的方法,但它只是一个逻辑回归,而不是多层次的CNN。我以同样的方式保存了每一层,但我无法用它进行预测。 请帮我! 这是我的代码:

def predict():
"""
An example of how to load a trained model and use it
to predict labels.
"""

# load the saved model
#x = Data
x = T.matrix('x')
Data = x.reshape((1, 1, 32, 32))
layer0
layer1
layer2_input = layer1.output.flatten(2)
layer2
layer3

# compile a predictor function
predict_model = theano.function([layer0.input],
    layer0.output)
    #inputs=[layer0.input],
    #outputs=layer3.y_pred)

# We can test it on some examples from test test
#dataset='facedata_cross_6_2_6.pkl.gz'
#datasets = load_data(dataset)
#test_set_x, test_set_y = datasets[2]
#test_set_x = test_set_x.get_value()
#reshape=np.reshape(test_set_x[26],(28,28))
#plt.imshow(reshape)

predicted_values = predict_model(Data)
print("Predicted values for the first 10 examples in test set:")
print(predicted_values)

1 个答案:

答案 0 :(得分:2)

保存模型的方法有很多种。我经常使用的是每个层的重量和偏差(顺序取决于你):

f = file('Models/bestmodel.pickle','wb')
cPickle.dump(layer0.W.get_value(borrow=True),f,protocol=cPickle.HIGHEST_PROTOCOL)
cPickle.dump(layer1.W.get_value(borrow=True),f,protocol=cPickle.HIGHEST_PROTOCOL)
cPickle.dump(layer2.W.get_value(borrow=True),f,protocol=cPickle.HIGHEST_PROTOCOL)
...
cPickle.dump(layer0.b.get_value(borrow=True),f,protocol=cPickle.HIGHEST_PROTOCOL)            
cPickle.dump(layer1.b.get_value(borrow=True),f,protocol=cPickle.HIGHEST_PROTOCOL)
cPickle.dump(layer2.b.get_value(borrow=True),f,protocol=cPickle.HIGHEST_PROTOCOL)
...
f.close()

然后对于预测系统,创建一个相同的模型架构并使用保存的模型作为初始值(与您保存的顺序相同):

f=file('Models/bestmodel.pickle','rb')
layer0.W.set_value(cPickle.load(f), borrow=True)
layer1.W.set_value(cPickle.load(f), borrow=True)
layer2.W.set_value(cPickle.load(f), borrow=True)
...
layer0.b.set_value(cPickle.load(f), borrow=True)
layer1.b.set_value(cPickle.load(f), borrow=True)
layer2.b.set_value(cPickle.load(f), borrow=True)
...
f.close()