Keras卷积神经网络

时间:2015-12-03 23:13:22

标签: theano keras

现在我正在尝试构建一个基本的卷积神经网络,使用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张量以在此代码中使用?感谢

2 个答案:

答案 0 :(得分:4)

您认为代码期望tensor4是正确的。传统结构是(batch, channel, width, height)。在这种情况下,图像是单色的channel=1看起来您使用批量大小为10,MNIST图像宽度为28像素,高度为28像素。

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

答案 1 :(得分: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)