- CNN的基本结构:
1.图像就是输入层
2.接着是CNN特有的卷积层(convolution),卷积层的自带激活函数使用的是ReLU
3.接着是CNN特有的池化层(pooling),
4.卷积层+池化层的组合可以在隐藏层中出现很多次。也可以灵活组合,卷积+卷积+池化、卷积+卷积等
5.在若干卷积层+池化层之后是全连接层(fully connected layer),其实就是DNN结构,只是输出层使用了Softmax激活函数来做图像识别的分类
6.一般fc就为CNN的全连接层
keras实现CNN+mnist代码:
from keras.models import Sequential
from keras.layers import Conv2D, MaxPool2D
from keras.layers import Dense, Flatten
import keras
from keras.datasets import mnist
from keras.utils import np_utils
#加载数据
#shape[0] 图像垂直尺寸
#shape[1] 图像水平尺寸
#shape[2] 图像的通道数
(X_train, y_train), (X_test, y_test) = mnist.load_data()
img_x, img_y = X_train.shape[1], X_train.shape[2]
#数据预处理
X_train = X_train.reshape(X_train.shape[0], img_x, img_y, 1)
X_test = X_test.reshape(X_test.shape[0], img_x, img_y, 1)
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255
#to_categorical()将类别向量转换为二进制(只有0和1)的矩阵类型表示
y_train = np_utils.to_categorical(y_train, num_classes=10)
y_test = np_utils.to_categorical(y_test, num_classes=10)
#构建模型
#Sequential 惯序模型:单输入单输出,一条路通到底,层与层之间只有相邻关系,没有跨层连接。这种模型编译速度快,操作也比较简单
#函数式模型(Model):多输入多输出,层与层之间任意连接。这种模型编译速度慢。
model = Sequential()
#add()添加新的训练层
model.add(Conv2D(32, kernel_size=(5,5), activation='relu', input_shape=(img_x, img_y, 1)))
model.add(MaxPool2D(pool_size=(2,2), strides=(2,2)))
model.add(Conv2D(64, kernel_size=(5,5), activation='relu'))
model.add(MaxPool2D(pool_size=(2,2), strides=(2,2)))
model.add(Flatten())
model.add(Dense(1000, activation='relu'))
model.add(Dense(10, activation='softmax'))
#模型编译
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
#训练
model.fit(X_train, y_train, batch_size=128, epochs=10)
#评估模型
score = model.evaluate(X_test, y_test)
print('acc', score[1])