1 LeNet-5(卷积神经网络的开篇之作)
1.1 简介
LeNet-5是Y. Lecun(杨丽坤深度学习大佬)1998年提出的,
论文地址:
https://ieeexplore.ieee.org/document/726791?reload=true&arnumber=726791
卷积神经网络的入门结构
上面实际上是经过以下7步得到的
(1)卷积
(2)池化
(3)卷积
(4)池化
(5)卷积
(6)全连接
(7)全连接
下面这两篇文章介绍的特别好:
https://cuijiahua.com/blog/2018/01/dl_3.html
1.2 3大特点
CNN主要有三大特色,分别是局部感知、权重共享和多卷积核。
-
局部感知
局部感知就是我们上面说的感受野,实际上就是卷积核和图像卷积的时候,每次卷积核所覆盖的像素只是一小部分,是局部特征,所以说是局部感知。CNN是一个从局部到整体的过程(局部到整体的实现是在全连通层),而传统的神经网络是整体的过程。 -
权重共享
权值共享:不同的图像或者同一张图像共用一个卷积核,减少重复的卷积核。同一张图像当中可能会出现相同的特征,共享卷积核能够进一步减少权值参数。 -
多卷积核
一种卷积核代表的是一种特征,为获得更多不同的特征集合,卷积层会有多个卷积核,生成不同的特征,这也是为什么卷积后的图片的高,每一个图片代表不同的特征。
2 CIFAR100数据集
这个数据集就像CIFAR-10,除了它有100个类,每个类包含600个图像。,每类各有500个训练图像和100个测试图像。CIFAR-100中的100个类被分成20个超类。每个图像都带有一个“精细”标签(它所属的类)和一个“粗糙”标签(它所属的超类) 以下是CIFAR-100中的类别列表:
3 代码
## LeNet-5识别CIFAR100
import tensorflow as tf
import os
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "2"
class CNNMnist(object):
def __init__(self):
(self.train, self.train_label), (self.test, self.test_label) = \
tf.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
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(32, kernel_size=5, strides=1,
padding='same', data_format='channels_last', activation=tf.nn.relu),
tf.keras.layers.MaxPool2D(pool_size=2, strides=2, padding='same'),
tf.keras.layers.Conv2D(64, kernel_size=5, strides=1,
padding='same', data_format='channels_last', activation=tf.nn.relu),
tf.keras.layers.MaxPool2D(pool_size=2, strides=2, padding='same'),
tf.keras.layers.Conv2D(128, kernel_size=5,strides=1,
padding="same", data_format='channels_last', activation=tf.nn.relu),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(1024, activation=tf.nn.relu),
tf.keras.layers.Dense(100, activation=tf.nn.softmax),
])
def compile(self):
CNNMnist.model.compile(optimizer=tf.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=1, 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.evaluate()
print(CNNMnist.model.summary())