目标
····掌握keras卷积网络相关API
····掌握卷积网络的构建
卷积网络简介:
卷积神经网络由一个或多个卷积层、池化层以及全连接层等组成。与其他深度学习结构相比,卷积神经网络在图像等方面能够给出更好的结果。这一模型也可以使用反向传播算法进行训练。相比较其他浅层或深度神经网络,卷积神经网络需要考量的参数更少
而经典卷积网络AlexNet模型与LexNet模型更为优秀,以后在做介绍。
实践:
使用keras内置数据集CIFAR100类别分类
这个数据集有100种内别,做分类测试很好用
用于构建CNN模型的API
Conv2D:卷积层
MaxPool2D:池化层
Flatten:压平数据为一维
Dense: 全连接层
- 读取Keras内置数据集并处理
读取数据集:
从datasets中获取相应的数据集,直接有训练集和测试集
需要进行形状处理以及归一化
class CNNMnist(object):
def __init__(self):
(self.train, self.train_label), (self.test, self.test_label) = \
keras.datasets.cifar100.load_data()
self.train = self.train.reshape(-1, 32, 32, 3) / 255.0
self.test = self.test.reshape(-1, 32, 32, 3) / 255.0
- 模型编写,设计卷积网络
两层卷积层+两个神经网络层
网络设计:
第一层
卷积:32个filter、大小55、strides=1、padding=“SAME”
激活:Relu
池化:大小2x2、strides2
第二层
卷积:64个filter、大小55、strides=1、padding=“SAME”
激活:Relu
池化:大小2x2、strides2
全连接层
注意:经过每一层图片数据大小的变化需要确定,CIFAR100输入的每批次若干图片数据大小为[None, 32 * 32],如果要进过卷积计算,需要变成[None, 32, 32, 3]
具体如下:
3. 建立卷积模型
model = keras.Sequential([
keras.layers.Conv2D(32, kernel_size=5, strides=1,
padding='same', data_format='channels_last', activation=tf.nn.relu),
keras.layers.MaxPool2D(pool_size=2, strides=2, padding='same'),
keras.layers.Conv2D(64, kernel_size=5, strides=1,
padding='same', data_format='channels_last', activation=tf.nn.relu),
keras.layers.MaxPool2D(pool_size=2, strides=2, padding='same'),
keras.layers.Flatten(),
keras.layers.Dense(1024, activation=tf.nn.relu),
keras.layers.Dense(100, activation=tf.nn.softmax),
])
- 编译并且训练
编译:优化器optimizers用adam,损失函数使用sparse_categorical_crossentropy, 精确率使用acc内置函数
训练:每批次batchsize为标准32,训练回合epochs设置3000次,超参数实际根据你的数据集来
def compile(self):
CNNMnist.model.compile(optimizer=keras.optimizers.Adam(),
loss=tf.keras.losses.sparse_categorical_crossentropy,
metrics=['accuracy'])
return None
def fit(self):
CNNMnist.model.fit(self.train, self.train_label, epochs=3000, batch_size=32)
return None
def evaluate(self):
test_loss, test_acc = CNNMnist.model.evaluate(self.test, self.test_label)
print(test_loss, test_acc)
return None
if __name__ == '__main__':
cnn = CNNMnist()
cnn.compile()
cnn.fit()
cnn.predict()
print(CNNMnist.model.summary())