向Theano提供图像会导致ShapeMismatch错误

时间:2015-11-19 18:40:53

标签: image theano predict

我正在尝试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进行预测的正确方法是什么?

1 个答案:

答案 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函数。