目录
基础理论
卷积
卷积核与过滤器的区别
一、获取数据集
二、设定数据集大小、归一化
三、构建卷积神经网络
四、编译&&训练
五、模型评估
六、可视化
1、创建plt图
2、获取各卷积层
3、观察卷积层
总代码
卷积神经网络
可视化
在实际应用中,摄像头捕捉到的图片,主物品往往会偏于一侧的位置,甚至有角度的旋转,这时神经网络模型对这些图片的分类就会不准。这时我们引入:卷积神经网络(CNN)。
通过卷积操作缩小了图像的内容,将模型注意力集中在图像特定的、明显的特征上。
这种计算对于计算机视觉来说是非常理想的,因为通常情况下,能够像这样被突出显示的特征才是区分一个物品和另一个物品的关键。
不同的过滤器有不同的效果:
竖直过滤器(留下竖直线):
水平过滤器(留下水平线):
卷积核是二维的,滤波器是三维的(高维,也可能是四维的)
- 卷积核就是由长和宽来指定的,是一个二维的概念。
- 而过滤器是是由长、宽和深度指定的,是一个三维的概念。
- 过滤器可以看做是卷积核的集合。
- 过滤器比卷积核高一个维度——深度。
# 1、获取数据集
mnist = tf.keras.datasets.fashion_mnist
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
卷积期望一个包含所有数据的单一张量,所以要把训练数据设置为60000x28x28x1的一个4D列表。(如果不这样做,会在训练时得到一个错误,因为卷积操作将不能识别数据形状。)
# 2、设定数据集大小、归一化
training_images=training_images.reshape(60000, 28, 28, 1)
training_images=training_images / 255.0
test_images = test_images.reshape(10000, 28, 28, 1)
test_images=test_images/255.0
# 3、构建卷积神经网络
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(64, (3,3), activation='relu', input_shape=(28, 28, 1)),
# Conv2D:卷积层 64:卷积过滤器数量 (3,3):卷积核大小
tf.keras.layers.MaxPooling2D(2, 2),
# 池化层
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])
# 4、编译&&训练
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(training_images, training_labels, epochs=5)
# 输出模型各层的影响
model.summary()
# 5、模型评估
test_loss = model.evaluate(test_images, test_labels)
可以发现卷积神经网络比起前面的DNN神经网络效果好了不少,但是相应的,时间会比较慢。
import matplotlib.pyplot as plt
# plt图
f, a = plt.subplots(3, 4)
# f:子图像 a:array列表 3:行 4:列
# 各卷积层
from tensorflow.keras import models
layer_outputs = [layer.output for layer in model.layers]
print(layer_outputs)
activation_model = tf.keras.models.Model(inputs = model.input, outputs = layer_outputs)
# 输入层 输出层
# 抽3个图片(FIRST、SECOND、THIRD),观察神经网络的前四层(正好对应四个卷积层)(神经网络共7层)
# test_images[...]:第几张图片 x:第几层
# 第一张图片卷积神经网络处理情况
f1 = activation_model.predict(test_images[FIRST_IMAGE].reshape(1, 28, 28, 1))[x]
a[0,x].imshow(f1[0, : , :, 1]) #1:下标为1的卷积核(第2个卷积核)
# 第二张图片卷积神经网络处理情况
f2 = activation_model.predict(test_images[SECOND_IMAGE].reshape(1, 28, 28, 1))[x]
a[1,x].imshow(f2[0, : , :, 1])
# 第三张图片卷积神经网络处理情况
f3 = activation_model.predict(test_images[THIRD_IMAGE].reshape(1, 28, 28, 1))[x]
a[2,x].imshow(f3[0, : , :, 1])
import tensorflow as tf
print(tf.__version__)
# 1、获取数据集
mnist = tf.keras.datasets.fashion_mnist
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
# 特征训练集 目标训练集 特征测试集 目标测试集
# 2、设定数据集大小、归一化
training_images=training_images.reshape(60000, 28, 28, 1)
training_images=training_images / 255.0
test_images = test_images.reshape(10000, 28, 28, 1)
test_images=test_images/255.0
# 3、构建卷积神经网络
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(64, (3,3), activation='relu', input_shape=(28, 28, 1)),
# Conv2D:卷积层 64:卷积过滤器数量 (3,3):卷积核大小
tf.keras.layers.MaxPooling2D(2, 2),
# 池化层
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])
# 4、编译&&运行
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(training_images, training_labels, epochs=5)
# 输出模型各层的影响
model.summary()
# 5、模型评估
test_loss = model.evaluate(test_images, test_labels)
# 卷积、池化过程可视化
import matplotlib.pyplot as plt
# plt图
f, a = plt.subplots(3, 4)
# f:子图像 a:array列表 3:行 4:列
# 随机选取可视化的图片
FIRST_IMAGE=0
SECOND_IMAGE=7
THIRD_IMAGE=26
# 各卷积层
from tensorflow.keras import models
layer_outputs = [layer.output for layer in model.layers]
print(layer_outputs)
activation_model = tf.keras.models.Model(inputs = model.input, outputs = layer_outputs)
# 输入层 输出层
# 按行可视化
for x in range(0,4):
# 观察卷积层(7个层输出,这里只取了四个卷积层)
f = activation_model.predict(test_images[0].reshape(1, 28, 28, 1))
print(len(f))
# 抽3个图片(FIRST、SECOND、THIRD),观察神经网络的前四层(正好对应四个卷积层)(神经网络共7层)
# test_images[...]:第几张图片 x:第几层
# 第一张图片卷积神经网络处理情况
f1 = activation_model.predict(test_images[FIRST_IMAGE].reshape(1, 28, 28, 1))[x]
a[0,x].imshow(f1[0, : , :, 1]) #1:下标为1的卷积核(第2个卷积核)
# 第二张图片卷积神经网络处理情况
f2 = activation_model.predict(test_images[SECOND_IMAGE].reshape(1, 28, 28, 1))[x]
a[1,x].imshow(f2[0, : , :, 1])
# 第三张图片卷积神经网络处理情况
f3 = activation_model.predict(test_images[THIRD_IMAGE].reshape(1, 28, 28, 1))[x]
a[2,x].imshow(f3[0, : , :, 1])