我正在尝试Theano Logistic回归模型的一个非常基本的例子,在训练网后,我想测试一些图像,看看它们是如何被分类的。可以在http://deeplearning.net/tutorial/code/logistic_sgd.py找到培训和测试的代码。事实上,我试图修改的唯一部分是predict()函数,如下所示:
def predict():
"""
An example of how to load a trained model and use it
to predict labels.
"""
# load the saved model
classifier = cPickle.load(open('best_model.pkl'))
# compile a predictor function
predict_model = theano.function(
inputs=[classifier.input],
outputs=classifier.y_pred)
# We can test it on some examples from test test
#dataset='mnist.pkl.gz'
#datasets = load_data(dataset)
#test_set_x, test_set_y = datasets[2]
#test_set_x = test_set_x.get_value()
img = Image.open('index.png','r')
shared_x = theano.shared(numpy.asarray(img,dtype=theano.config.floatX))
predicted_values = predict_model(shared_x.get_value())
print ("Predicted values for the first 10 examples in test set:")
print predicted_values
我按照http://blog.eduardovalle.com/2015/08/25/input-images-theano/发现的一些提示,但显然我遇到了问题,因为我得到的是:
ValueError:形状不匹配:x有28个cols(和28个行),但y有784个 rows(和10个cols)应用导致错误的节点:Dot22(x,W) 输入类型:[TensorType(float64,matrix),TensorType(float64, 矩阵)]输入形状:[(28,28),(784,10)]输入步幅:[(224, 8),(80,8)]输入值:['未显示','未显示']
那么将图像(在我的情况下为28x28)提供给Theano进行预测的正确方法是什么?
答案 0 :(得分:0)
该模型需要批量图像的批次作为输入。
输入需要是每个图像有一行的矩阵。有784列是28x28像素图像的扁平(或重塑)版本(注意28 * 28 = 784)。
而不是
img = Image.open('index.png','r')
shared_x = theano.shared(numpy.asarray(img,dtype=theano.config.floatX))
predicted_values = predict_model(shared_x.get_value())
使用
img = Image.open('index.png','r')
img = numpy.asarray(img, dtype=theano.config.floatX)
img = img.flatten()
x_batch = numpy.expand_dims(img, 0)
predicted_values = predict_model(x_batch)
没有必要使用共享变量,因为你只是将它包含的numpy数组传递给Theano函数。