3

现在我正在尝试构建一个基本的卷积神经网络,以使用 keras 对 mnist 数据集进行简单分类。最终我想把我自己的图像放进去,我只想先建立一个简单的网络,以确保我的结构正常工作。所以我下载了 mnist 数据,因为 mnint.pkl.gz 将其解压缩并将其加载到元组中,并最终加载到凹凸不平的数组中。这是我的代码:

import numpy as np
from keras.models import Sequential

from keras.layers.core import Dense, Dropout, Activation, Flatten
from keras.layers.convolutional import Convolution2D, MaxPooling2D
from keras.optimizers import SGD
from PIL import Image as IM
import theano
from sklearn.cross_validation import train_test_split
import cPickle
import gzip
f=gzip.open('mnist.pkl.gz')
data1,data2,data3=cPickle.load(f)
f.close()

X=data1[0]
Y=data1[1]

x=X[0:15000,:]
y=Y[0:15000]

X_train,X_test,y_train,y_test=train_test_split(x,y,test_size
=0.33,random_state=99)


model=Sequential()
model.add(Convolution2D(10,5,5,border_mode='valid', 
input_shape=   (1,28,28)))
model.add(Activation('tanh'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(10))
model.add(Activation('softmax'))
sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='mean_squared_error', optimizer=sgd)
model.fit(X_train,y_train, batch_size=10, nb_epoch=10)
score=model.evaluate(X_test,y_test,batch_size=10)
print(score)

我收到这样的错误:

'Wrong number of dimensions: expected 4, got 2 with shape 
(10,   784).')

我认为这意味着我需要将它放入具有(样本、通道、行、列)的 theano 4d 张量中,但我不知道该怎么做。此外,当我特别想解决我将加载“.png”文件之后的问题时,我打算将它们放入 numpy 矩阵中以供输入,但看起来这不起作用。谁能告诉我如何将图像放入 theano4d 张量以在此代码中使用?谢谢

4

2 回答 2

4

您是正确的,代码需要一个tensor4. 常规结构是(batch, channel, width, height)。在这种情况下,图像是单色的,所以channel=1看起来您使用的批量大小为 10,而 MNIST 图像的宽度为 28 像素,高度为 28 像素。

您可以简单地将数据重塑为所需的格式。如果x是形状 (10, 784)x.reshape(10, 1, 28, 28)则将具有所需的格式。

于 2015-12-04T08:27:54.880 回答
3

代码需要一个 4 维numpy数组,而不是 Theano 张量(keras 在后台完成所有 Theano 张量操作)。

您的输入 X_train 和 X_test 需要重新整形,如下所示:

X_train = X_train.reshape(-1, 1, 28, 28)
X_test = X_test.reshape(-1, 1, 28, 28)
于 2016-09-25T09:21:47.050 回答