1

Я новичок в глубоком обучении, и у меня возникла проблема. Я использую Theano для распознавания изображений, и я хочу создать систему прогнозирования с использованием обученной модели. Я ссылался на LeNet5 Convolutional Neural Networks (LeNet) и обучил свои собственные данные, теперь я хочу использовать обученную модель для прогнозирования новых изображений. В Classifying MNIST digits using Logistic Regression он описал способ рассортировать обученные модели, но это всего лишь логистическая регрессия, а не многослойная CNN. Точно так же я сохранил каждый слой, но я не могу использовать его для предсказания. Пожалуйста, помогите мне! Вот мой код:Pickle multy layer CNN в Theano, Lenet5

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) 

ответ

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() 
+0

Это сработало! Человек, вы потрясающий! Спасибо! Я использую код как, # layer0 = pickle.load (open ('best_model_layer0.pkl')) # layer1 = pickle.load (open ('best_model_layer1.pkl')) # layer2 = pickle.load (open (' best_model_layer2.pkl ')) # layer3 = pickle.load (open (' best_model_layer3.pkl ')) Но каждый раз, когда он предсказывает [0]. Ваш код все понял! –

+0

Okey .. рад, что он работает :), если вы считаете, что это признанный ответ, вы можете щелкнуть принятый символ (символ 'v') в моем ответе, чтобы сообщить будущему читателю – malioboro

+0

Да, я хочу, но моей репутации недостаточно :( –