当前位置:   article > 正文

深度学习之CNN:基于TensorFlow的简单示例及说明_cnn卷积神经网络实例tensorflow

cnn卷积神经网络实例tensorflow

深度学习之CNN:基于TensorFlow的简单示例及说明

  本文以MNIST数据为例,介绍了TensorFlow中实现CNN卷积网络的简单示例。文章延续了另一篇文章<<深度学习之LSTM:基于TensorFlow的简单示例及说明>>叙述风格,包含了数据准备,模型设计,模型编译,模型训练和模型保存等机器学习实践的完整步骤流程,适合入门学习。

一、基本流程

  1.数据准备
  通过调用tf.keras.datasets.mnist.load_data()加载MNIST手写数字集,需要注意的是,该数据集的图片大小为 28 ∗ 28 28*28 2828,黑白单色,即通道 c h a n n e l = 1 channel=1 channel=1,如果用 CIFAR 图像数据集,则其图片大小为 32 ∗ 32 32*32 3232,通道 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
  • 1
  • 2
  • 3

  2.模型设计
  此示例中,我们设计了一个滤波器数目为 10 10 10,卷积核大小为 3 ∗ 3 3*3 33的只含有单个卷积层的网络,网络结构图如下
在这里插入图片描述

# 设计网络结构
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")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

  在本例中我们添加的卷积层,通过input_shape=(28,28,1)来指定输入数据的形状,因为MNIST数据集的图片大小为 28 ∗ 28 28*28 2828,且为单色。若采用 CIFAR 数据集,因为其为RGB三色图,且大小为 32 ∗ 32 32*32 3232,则需设定为input_shape=(32,32,3);滤波器数目通过filters设定,本例中设为 10 10 10;卷积核的大小则通过kernel_size=(3,3)来设定,这个大小其实也是感受野的大小;感受野的移动步长strides采用了默认的 1 ∗ 1 1*1 11
  卷积层后,我们接了一个 Flatten 层,其实这一层的操作是将经过卷积层后得到的特征映射(多维的)展平为一个一维向量,方便链接到下一个全连接层。这点需要注意,不然卷积层和全连接层是没法直接连接的。
  3.模型编译

# 定义代价函数
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
# 设定模型训练配置
model.compile(optimizer='adam',loss=loss_fn,metrics=['accuracy'])
  • 1
  • 2
  • 3
  • 4

  编译时,本例设定模型使用的优化器optimizer为Adam,loss损失函数为分类交叉熵函数,metrics模型评估标准为准确性。
  4.模型训练

history = model.fit(x_train,y_train,
                    epochs=10,
                    batch_size=200,
                    validation_data=(x_test,y_test))
  • 1
  • 2
  • 3
  • 4

  如下是训练过程中的模型输出:
  可以看到每一轮训练完时,训练数据上的损失、准确性和验证数据上的损失和准确性。
在这里插入图片描述

二、完整代码

#!/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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

三、参考资料

[1] TensorFlow教程之<<卷积神经网络(Convolutional Neural Network, CNN)>>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/779504
推荐阅读
相关标签
  

闽ICP备14008679号