使用keras搭建CNN深度学习网络,使用mnist数据集。
一、导入所需要的包
##导入所需要的包
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense, Activation, Dropout, Convolution2D, MaxPooling2D, Flatten
from keras.optimizers import Adam
二、载入数据集
mnist.load载入数据集,并且将x_train,x_test进行形状处理, y_train,y_test进行独热编码处理。
(x_train, y_train), (x_test, y_test) = mnist.load_data()
##将x_train,x_test(60000,28,28)转为(60000,28,28,1), 固定行28,28,28*28=784
# reshape中的-1代表会转为不确定 /255数据归一化
x_train = x_train.reshape(-1, 28, 28, 1)/255.0
x_test = x_test.reshape(-1, 28, 28, 1)/255.0
##y_train 独热标签 举例 数字5 会转为[0,0,0,0,1,0,0,0,0,0]
y_train = np_utils.to_categorical(y_train, num_classes =10)
y_test = np_utils.to_categorical(y_test, num_classes =10)
三、开始建模
model = Sequential()
##第一个卷积层
##input_shap 输入平面
##filters 卷积核/滤波器
#kernel_size 卷积窗口大小
##strides 步长
## padding_方式 same/valid
## activation 激活函数
model.add(Convolution2D(
input_shape = (28,28,1),
filters = 32,
kernel_size = 5,
strides = 1,
padding = 'same',
activation = 'relu'
))
##第一个池化层
model.add(MaxPooling2D(
pool_size = 2,
strides = 2,
padding = 'same',
))
##第二个卷积层
model.add(Convolution2D(64, 5, strides = 1, padding = 'same', activation = 'relu'))
##第二个池化层
model.add(MaxPooling2D(2,2,'same'))
#把第二个池化层的输出扁平化为1维
model.add(Flatten())
#第一个全连接层
model.add(Dense(1024, activation = 'relu'))
model.add(Dropout(0.5))
##第二个全连接层
model.add(Dense(10, activation= 'softmax'))
#优化器
adam = Adam(lr = 0.004)
model.compile(optimizer = adam,
loss = 'categorical_crossentropy', ##交叉熵 模型收敛速度会快categorical_crossentropy ,mse
metrics = ['accuracy'],
)
四、模型训练和评估
##训练模型
model.fit(x_train, y_train, batch_size = 64, epochs = 10)
##评估模型
loss,acc = model.evaluate(x_test, y_test)
附完整代码
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense, Activation, Dropout, Convolution2D, MaxPooling2D, Flatten
from keras.optimizers import Adam
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape(-1, 28, 28, 1)/255.0
x_test = x_test.reshape(-1, 28, 28, 1)/255.0
y_train = np_utils.to_categorical(y_train, num_classes =10)
y_test = np_utils.to_categorical(y_test, num_classes =10)
model = Sequential()
model.add(Convolution2D(
input_shape = (28,28,1),
filters = 32,
kernel_size = 5,
strides = 1,
padding = 'same',
activation = 'relu'
))
model.add(MaxPooling2D(
pool_size = 2,
strides = 2,
padding = 'same',
))
model.add(Convolution2D(64, 5, strides = 1, padding = 'same', activation = 'relu'))
model.add(MaxPooling2D(2,2,'same'))
model.add(Flatten())
model.add(Dense(1024, activation = 'relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation= 'softmax'))
adam = Adam(lr = 0.004)
model.compile(optimizer = adam,
loss = 'categorical_crossentropy',
metrics = ['accuracy'],
)
model.fit(x_train, y_train, batch_size = 64, epochs = 10)
loss,acc = model.evaluate(x_test, y_test)