刚刚开始学习keras,就在这里记录一下学习过程啦。
本文为使用卷积神经网络CNN进行mnist手写字符的识别,希望自己就此走进deep learning的大门吧。
keras文档:https://keras.io/zh/
莫烦python bilibili链接:https://space.bilibili.com/243821484/video
import numpy as np #其实并没有用到numpy。。。
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense,Activation,Convolution2D,MaxPooling2D,Flatten
from keras.optimizers import Adam
关于numpy使用用法可查看numpy文档:https://www.numpy.org.cn/index.html
from keras.datasets import mnist
(X_train,y_train),(X_test,y_test)=mnist.load_data()
训练集为 60,000 张 28x28 像素的灰度图像,测试集为 10,000 同规格的图像,总共 10 类数字标签。
若是第一次使用该语句,会自动从官网下载数据集。
输入的图片是28*28:
img_rows,img_cols=28,28
预处理:
train.shape共有4个参数,分别代表(图像数量,颜色通道,长,宽)
因为是灰度图,所以颜色通道为1,即表示图像的高度为1
除以255表示数据的归一化处理
X_train=X_train.reshape(X_train.shape[0],1,img_rows,img_cols)/255
X_test=X_test.reshape(X_test.shape[0],1,img_rows,img_cols)/255
把类别0-9(共10个类别)转换成one_hot编码,方便后期的训练:
y_train=np_utils.to_categorical(y_train,num_classes=10)
y_test=np_utils.to_categorical(y_test,num_classes=10)
model=Sequential()
Conv layer 1 output shape(32,28,28):
model.add(Convolution2D(
batch_input_shape=(None,1,28,28), #首个网络层需要指定shape
filters=32, #表示输出的维度(卷积核的数目)为32,即生成32张不同feature的图片
kernel_size=5, #卷积核的大小(各个空间维度都是5)
strides=1, #每次卷积核前进的数量(各个空间维度相同,1表示卷积后的大小与原先图像大小一致)
padding='same', #表示保留边界处的卷积结果
data_format='channels_first' #表示图像的通道维的位置在第一个
))
model.add(Activation('relu')) #激活函数
Pooling layer 1(max pooling) output shape(32,14,14):
缩小两个维度(长和宽),不压缩高度。
model.add(MaxPooling2D(
pool_size=2, #两个维度(竖直,水平)上的下采样因子都是2,使图片在两个维度上均变为原长的一半
strides=2, #步长值
padding='same',
data_format='channels_first'
))
Conv layer 2 output shape(64,14,14):
model.add(Convolution2D(64,5,strides=1,padding='same'))
model.add(Activation('relu'))
Pooling layer 2(max pooling)output shape(64,7,7):
model.add(MaxPooling2D(2,2,'same',data_format='channels_first'))
用来将输入“压平”,即把多维的输入一维化,常用在从卷积层到全连接层的过渡;
Flatten不影响batch的大小;
即从(64* 7* 7)———>(3136)
model.add(Flatten())
Fully connected layer 1 input shape (6477)=(3136),output shape(1024):
model.add(Dense(1024))
model.add(Activation('relu'))
Fully connected layer 2 to shape(10) for 10 classes
model.add(Dense(10))
model.add(Activation('softmax')) #使用softmax进行分类
不知道使用什么优化器的时候,就用Adam。。。
adam=Adam(lr=1e-4) #自适应的学习率方法
model.compile(optimizer=adam,
loss='categorical_crossentropy',
metrics=['accuracy']) #指定衡量模型的指标
print('training-----')
model.fit(X_train,y_train,epochs=1,batch_size=64,) #使用fit功能来training;epochs表示训练的轮数;
#batch_size表示进行梯度下降时每个batch包含的样本数。
print('\ntesting-----')
loss,accuracy=model.evaluate(X_test,y_test)
print('\ntest loss: ',loss)
print('\ntest accuracy: ',accuracy)