简单CNN实现手写数字识别

使用简单的Keras 的序贯模型
大的逻辑结构:model = Sequential() -->model.add() -->model.compile()–>model.fit()–>model.evaluate()

model = Sequtntial()没啥好说的了

model.add():
Conv2D()–>MaxPooling2D()–>Dropout() -->Flatten()–>Dense()

Conv2D():
卷积核数目,kernel_size,activation,input_shape(第一层要)
32,(3,3),‘relu’,input_shape(大段代码: ‘mnist.npz’ (到这步之前以后也要拓展)–>load进来–>reshape–>astype–> /=255–>keras.utils.to_categorical–>得到最终的(x_train, y_train), (x_test, y_test))
input_shape = (img_rows,img_cols,1) if ‘channels last’ (图像的行数,图像的列数,图像的通道数)

**总结:**activation = ‘softmax’ 只用于最后一层全连接层,卷积层一般用relu
送入全连接层之前要加一层Flatten()

model.compile():
loss —>optimizer —>metrics
keras.losses.categroical_crossentropy ,keras.optimizers.Adadleta(),[‘accuracy’]

model.fit():
x_train,y_train -->batch_size—>epoches–>validation_data=(x_test,y_test)

model.evaluate():
x_test,y_test

有了大概的主逻辑框架,下面手动编写代码了

#第一步:
model = model.Senqutial() # mode ?导入
import keras 
#第二步:加层
model.add(Conv2D(32,(3,3),activation='relu',input_shape =input_shape)) #input_shape? 看下面
#input_shape = (img_rows,img_clos,1) if "channels last
#model.add(MaxPooling((2,2)))
model.add(Conv2D(64,(3,3),activation='relu'))
model.add(MaxPooling((2,2)))  #更正:MaxPooling2D,少了2D
model.add(Faltten())
moldel.add(Dense(128,activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(num_classes,activation='softmax')

#第三步:

model.compile(loss=keras.losses.categorical_crossentropy,
							optimizer = keras.optimizer.Adadelta(),
							metrics = ['accuracy'])

#第四步:

model.fit(x_train,y_train,batch_size=batch_size,epoches=epoches,verbose=2,validation_data=(x_test,y_test))

#第五步:

model.evaluate(x_test,y_test,verbose=0)

#模型搭建部分弄好了之后,开始加载数据,数据归一化

(x_tain,y_train),(x_test,y_test) = mnist.loda_data('mnist.npz')
if K.image_data_format() == 'channels first':
	x_train = x_train.reshape([batch_size,1,img_rows,img_cols])
	x_test = x_test.reshape([batch_size,1,img_rows,img_cols])
	input_shape = [1,img_rows,img_cols]
else:
	x_train = x_train.reshape([batch_size,img_rows,img_cols,1])
	x_test = x_test.reshape([batch_size,img_rows,img_cols,1])
	input_shape = [img_rows,img_cols,1]

x_train = x_train.astype('float32')
x_test = x_test.astype('float32')     #更正,第一遍写的这两块的先后顺序弄反了

x_train /=255
x_test /=255



y_train = keras.utils.to_catagorical(y_train,num_classes)
y_test = keras.utils.to_categorical(y_test,num_classes)

上面那些代码都使用到了哪些包,导入进来
from __future__ import print_function
import keras
from keras.datasets import mnist
from keras.model import Sequential
from keras.layers import Conv2D , Dense , MaxPooling2D,Flatten,Dropout
from keras import backend as K
#定义一些参数
num_classes = 10
epoches = 20
batch_size = 64

完整正确版本:

#导入需要的包
from __future__ import print_function
import keras 
from keras.models import Sequential 
from keras.layers import Dense , Conv2D,MaxPooling2D,Flatten,Dropout 
from keras.datasets import mnist 
from keras import backend as K

#定义好一些参数
batch_size = 64
num_classes = 10
epochs = 12

# input image dimensions
img_rows, img_cols = 28, 28

#加载数据
(x_train ,y_train),(x_test,y_test) = mnist.load_data(path='mnist.npz')  #选中,go_to_definiation  ,把下载#的代码去掉

if K.image_data_format() == 'channels_first':
	x_train = x_train.reshape([x_train.shape[0],1,img_rows,img_cols])
	x_test = x_test.reshape([x_test.shape[0],1,img_rows,img_cols])
	input_shape = [1,img_rows,img_cols]
else:
	x_train = x_train.reshape([x_train.shape[0],img_rows,img_cols,1])
	x_test = x_test.reshape([x_test.shape[0],img_rows, img_cols,1])
	input_shape = [img_rows,img_cols,1]

#单精度的数据类型更利于深度学习的计算
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')

#像素值都归一化到0-1之间
x_train /= 255
x_test /= 255

#对标签数据进行独热 编码
y_train = keras.utils.to_categorical(y_train,num_classes)
y_test = keras.utils.to_categorical(y_test , num_classes)

#构造模型了
model = Sequential()   #更正:不是model.Sequential()

model.add(Conv2D(32,kernel_size =(3,3),activation='relu',input_shape = input_shape))
model.add(Conv2D(64,kernel_size=(3,3),activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))   #更正:这里是pool_size 不是kernel_size 
model.add(Flatten())
model.add(Dense(128,activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(num_classes,activation='softmax'))

model.compile(loss = keras.losses.categorical_crossentropy,optimizer = keras.optimizers.Adadelta(),metrics=['accuracy'])  #这里的optimizers 有s

model.fit(x_train,y_train,batch_size = batch_size ,epochs = epochs,verbose=2,validation_data=(x_test,y_test))  #注意是epochs 不是es

score = model.evaluate(x_test,y_test,verbose=0)
print('Test Loss:', score[0])
print('Test Accuarcy:', score[1]) 

在这里插入图片描述
总结:x_train,y_train 经过reshape好形状后[样本数,通道,img_rows,img_cols]
直接就可以给model.fit()了
神经网络第一层得有input_shape ,即图片加上通道的shape

猜你喜欢

转载自blog.csdn.net/weixin_41196817/article/details/82770448
今日推荐