卷积神经网络进行手写字分类并进行可视化
内容总结自吴恩达TensorFlow2.0的课程
简单的卷积神经网络的使用
我们使用的数据集还是之前的mnist数据集。
import tensorflow as tf
%matplotlib inline
print(tf.__version__)
# 加载数据集
mnist = tf.keras.datasets.fashion_mnist
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
# 对数据集进行标准化,便于之后的使用。
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
# 设定我们的模型。
model = tf.keras.models.Sequential([
# 卷积层,64通道,大小为3x3激活函数为relue,因为是第一层需要设置输入的数据维度。
tf.keras.layers.Conv2D(64, (3,3), activation='relu', input_shape=(28, 28, 1)),
# 池化层,最大池化
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')
])
# 使用adam优化,损失函数为交叉熵,优化指标为正确率
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
# 打印模型的具体信息
model.summary()
# 进行训练
model.fit(training_images, training_labels, epochs=5)
# 进行评估
test_loss = model.evaluate(test_images, test_labels)
进行卷积层池化层可视化
查看100个测试集的标志,便于我们之后可视化对象的选取。
print(test_labels[:100])
我们选择了797的数字进行可视化
cmap='inferno’是设定一种颜色的变化
import matplotlib.pyplot as plt
from tensorflow.keras import models
f, axarr = plt.subplots(3,4)
# 对3个图片进行选择
FIRST_IMAGE=0
SECOND_IMAGE=7
THIRD_IMAGE=26
# 每一层有64个通道,可以在0-63之间进行选择。
CONVOLUTION_NUMBER = 1
# 获取每一层的输出信息
layer_outputs = [layer.output for layer in model.layers]
# 形成预测模型
activation_model = tf.keras.models.Model(inputs = model.input, outputs = layer_outputs)
for x in range(0,4):
# 利用我们选择的数据输入到我们的预测模型中,再分别选择第x层进行绘图。输入数据形状为数量、长、宽、通道。
f1 = activation_model.predict(test_images[FIRST_IMAGE].reshape(1, 28, 28, 1))[x]
# 进行画图
axarr[0,x].imshow(f1[0, : , :, CONVOLUTION_NUMBER], cmap='inferno')
# 不显示网格
axarr[0,x].grid(False)
f2 = activation_model.predict(test_images[SECOND_IMAGE].reshape(1, 28, 28, 1))[x]
axarr[1,x].imshow(f2[0, : , :, CONVOLUTION_NUMBER], cmap='inferno')
axarr[1,x].grid(False)
f3 = activation_model.predict(test_images[THIRD_IMAGE].reshape(1, 28, 28, 1))[x]
axarr[2,x].imshow(f3[0, : , :, CONVOLUTION_NUMBER], cmap='inferno')
axarr[2,x].grid(False)