深度学习之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

  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")

  在本例中我们添加的卷积层,通过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'])

  编译时,本例设定模型使用的优化器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)>>

  • 20
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值