Keras卷积神经网络

3

我现在正在尝试使用keras构建一个基本的卷积神经网络,使用mnist数据集进行简单分类。最终我想要放入自己的图像,但我只想先构建一个简单的网络来确保结构正常。所以我下载了mnist数据作为mnist.pkl.gz,将其解压并加载到元组中,最终转换为numpy数组。以下是我的代码:

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矩阵中进行馈送,但看起来这样做行不通。有人能告诉我如何将图像转换成theano 4d张量以在此代码中使用吗?谢谢

2个回答

4
您是正确的,代码需要一个tensor4。传统的结构是(batch, channel, width, height)。在这种情况下,图像是单色的,所以channel=1。看起来您正在使用批量大小为10,并且MNIST图像的宽度和高度均为28像素。
您可以简单地将数据重塑为所需格式。如果x的形状为(10, 784),那么x.reshape(10, 1, 28, 28)就会具有所需的格式。

3
代码期望的是一个四维的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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接