赞
踩
本文以MNIST数据为例,介绍了TensorFlow中实现CNN卷积网络的简单示例。文章延续了另一篇文章<<深度学习之LSTM:基于TensorFlow的简单示例及说明>>叙述风格,包含了数据准备,模型设计,模型编译,模型训练和模型保存等机器学习实践的完整步骤流程,适合入门学习。
1.数据准备
通过调用tf.keras.datasets.mnist.load_data()
加载MNIST手写数字集,需要注意的是,该数据集的图片大小为
28
∗
28
28*28
28∗28,黑白单色,即通道
c
h
a
n
n
e
l
=
1
channel=1
channel=1,如果用 CIFAR 图像数据集,则其图片大小为
32
∗
32
32*32
32∗32,通道
c
h
a
n
n
e
l
=
3
channel=3
channel=3 (RGB三色)。
# 加载MNIST数据库,图像大小为28*28,黑白单通道
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
2.模型设计
此示例中,我们设计了一个滤波器数目为
10
10
10,卷积核大小为
3
∗
3
3*3
3∗3的只含有单个卷积层的网络,网络结构图如下
# 设计网络结构
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(filters=10,kernel_size=(3,3),activation='relu',input_shape=(28,28,1)),
tf.keras.layers.Flatten(), # 注意卷积层后面接全连接层前,需插入一个Flatten层,将卷积层的输出张量展平
tf.keras.layers.Dense(10,activation="sigmoid")
],name="CNN")
在本例中我们添加的卷积层,通过input_shape=(28,28,1)
来指定输入数据的形状,因为MNIST数据集的图片大小为
28
∗
28
28*28
28∗28,且为单色。若采用 CIFAR 数据集,因为其为RGB三色图,且大小为
32
∗
32
32*32
32∗32,则需设定为input_shape=(32,32,3)
;滤波器数目通过filters
设定,本例中设为
10
10
10;卷积核的大小则通过kernel_size=(3,3)
来设定,这个大小其实也是感受野的大小;感受野的移动步长strides
采用了默认的
1
∗
1
1*1
1∗1。
卷积层后,我们接了一个 Flatten 层,其实这一层的操作是将经过卷积层后得到的特征映射(多维的)展平为一个一维向量,方便链接到下一个全连接层。这点需要注意,不然卷积层和全连接层是没法直接连接的。
3.模型编译
# 定义代价函数
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
# 设定模型训练配置
model.compile(optimizer='adam',loss=loss_fn,metrics=['accuracy'])
编译时,本例设定模型使用的优化器optimizer为Adam,loss损失函数为分类交叉熵函数,metrics模型评估标准为准确性。
4.模型训练
history = model.fit(x_train,y_train,
epochs=10,
batch_size=200,
validation_data=(x_test,y_test))
如下是训练过程中的模型输出:
可以看到每一轮训练完时,训练数据上的损失、准确性和验证数据上的损失和准确性。
#!/user/bin/env python3 # -*- coding : utf-8 -*- import tensorflow as tf def main(): # 加载MNIST数据库,图像大小为28*28,黑白单通道 (x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data() x_train, x_test = x_train / 255.0, x_test / 255.0 # 设计网络结构 model = tf.keras.models.Sequential([ tf.keras.layers.Conv2D(filters=10,kernel_size=(3,2),activation='relu',input_shape=(28,28,1)), tf.keras.layers.Flatten(), # 注意卷积层后面接全连接层前,需插入一个Flatten层,将卷积层的输出张量展平 tf.keras.layers.Dense(10,activation="sigmoid") ],name="CNN") # 定义代价函数 loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True) # 设定模型训练配置 model.compile(optimizer='adam',loss=loss_fn,metrics=['accuracy']) # 训练模型 history = model.fit(x_train,y_train, epochs=10, batch_size=200, validation_data=(x_test,y_test)) # 保存模型 tf.keras.models.save_model(model,filepath='./model/cnn/') if __name__=='__main__': main()
[1] TensorFlow教程之<<卷积神经网络(Convolutional Neural Network, CNN)>>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。