使用卷积神经网络进行深度学习与前面的深度学习的最大的区别就在于神经网络层数多了几层,这里通过代码实例对于神经网络进行分析
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers, optimizers, datasets
import numpy as np
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([
tf.keras.layers.Conv2D(64,(3,3),activation='relu',
input_shape=(28,28,1)),
#详情可以查询https://bit.ly/2UGa7uH
#计算万之后形成
tf.keras.layers.MaxPooling2D(2,2),
#创建一个池化层,它是最大池化层的原因是我们想得到里面的最大值
#因为它是2*2的pool,所以最大的一个会被视作这个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')
])
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy')
model.summary()
#使用model.summary()输出模型的各层情况
model.fit(training_images,training_labels,epochs=5)
test_loss = model.evaluate(test_images,test_labels)
卷积神经网络对应的conv2D函数的意义可以看这篇相应的论文
conv2D函数的意义
其中指定第一个卷积,要求keras为我们生成64个过滤器,这些过滤器是3乘3的矩阵,
激活函数是relu函数,意味着负值会被丢弃,最后输入形状和之前一样为28乘28的矩阵,这个额外的1意味着我们正在用一个字节来计算颜色深度,正如我们之前看到的那样,我们的图像是灰度的(只有黑白两种情况),所以我们只使用一个字节64个过滤器是随机的,从一组已知良好的过滤器开始,方式与你之前看到的模式拟合,并且从该组中工作的过滤器会随着时间推移而学习
tf.keras.layers.Conv2D(64,(3,3),activation='relu',
input_shape=(28,28,1)),
第一次运行之后,输出的形状由原先的28乘28的矩阵变换为26乘26的矩阵,因为对应的filter过滤器为3乘3的矩阵
过滤器:使得本来很错综复杂的问题会被过滤为决定输出
用圆圈圈出来的为第一个能够过滤出来的矩阵,因为原先的矩阵为28乘28的矩阵,左边界,上边界,右边界,下边界取出相应的点之后不能形成对应的3乘3的矩阵,所以使用过滤器过滤之后的矩阵的Output shape为(None,26,26,64)
接下来使用下一层的过滤器
tf.keras.layers.MaxPooling2D(2,2),
这一过滤器将2乘2的矩阵进行压缩,压缩成一个矩阵,取出其中的最大值作为压缩的结果
每四个中取出一个最大值,压缩之后得到对应的矩阵
所以经过max_pooling2d_12层的过滤之后,原先的26乘26的对应矩阵被过滤为13乘13的对应矩阵
接下来再经过一次conv2d_13的过滤之后,Output Shape对应的形状为(None,11,11,64),然后再进行一次max_pooling2d_13的过滤之后,Output Shape对应的形状为(None,5,5,64),
使用flatten_5将对应的形状展开为一维的数组,输出的形状为(None,1600),
接下来使用语句
tf.keras.layers.Dense(128,activation='relu'),
使得输出的种类为128种,最后再使用语句分类
tf.keras.layers.Dense(10,activation='softmax')
使得输出的结果为10种种类,对应的输出形状如下
训练集中有1875张图片,经过迭代之后达到了0.1884的损失率
测试集中有313张图片,经过训练之后的模型的损失率为0.2509