TensorFlow 实现卷积神经网络(CNN)

该博客详细介绍了如何在TensorFlow中实现卷积神经网络(CNN),包括卷积层和池化层的输出张量大小计算,以及'SAME'和'VALID'填充的原理。并展示了网络结构、训练和测试代码,以及损失和准确率图。
摘要由CSDN通过智能技术生成

TensorFlow 实现卷积神经网络(CNN)

1. 知识点:

  1. 计算卷积后的图片的大小

    1. 在最后的全连接层使用,将卷积后的所有特征转换成1维向量,进行全连接
  2. 卷积核的使用

    1. 卷积核大小
    2. 卷积核步长
    3. 填充值
  3. 卷积核的特征数量

  4. 卷积函数的使用

  5. 池化函数的使用

2. 出错点:

  1. 卷积后的图像的大小
  2. 最后输出层输入大小

3. 卷积层(Conv Layer)的输出张量(图像)的大小

定义如下:

O = 输出图像的尺寸。

I = 输入图像的尺寸。

K = 卷积层的核尺寸

N = 核数量

S = 移动步长

P =填充数

基本公式为
O = ⌈ I − K + 2 × P S ⌉ + 1 O = \bigg\lceil\frac{I-K+2\times P}{S}\bigg\rceil+1 O=SIK+2×P+1

padding=’SAME‘ 填充0

**默认:**P = 0

符号: ⌈ ⌉ \lceil \quad \rceil ):向上取整

输出图像尺寸的计算公式如下:
O = ⌈ I − K + 2 × 0 S ⌉ + 1 O = \bigg\lceil\frac{I-K+2\times 0}{S}\bigg\rceil+1 O=SIK+2×0+1
例如:输入图片28x28,卷积核3x3 ,步长h=2, w=2,计算结果:

\bigg\lceil\frac{28-3+2\times 0}{2}\bigg\rceil+1=14

(28 -3)/2 = 12.5,向上取整为13 所以最后为14

注意:

  1. 当步长为1时,输出图片的尺寸等于输出图片的尺寸
  2. 如何高和宽 不同,那么就分开求值

padding=’VALID‘ 不填充(需验证)

默认:p = 1

公式为:
O = ⌈ I − K + 2 × p S ⌉ − 1 O = \bigg\lceil\frac{I-K+2\times p}{S}\bigg\rceil-1 O=SIK+2×p1

例如: 输入图片28x28,卷积核3x3 ,步长h=2, w=2,计算结果:
O = ⌈ 28 − 3 + 2 × 1 2 ⌉ − 1 = 13 O = \bigg\lceil\frac{28-3+2\times 1}{2}\bigg\rceil-1 = 13 O=2283+2×11=13

(28-3+2)/2 =13.5 向上取整 14 减 1 = 13

4. 池化层(Conv Layer)的输出张量(图像)的大小

TensorFlow中:池化操作:(tf.nn.max_pool())

步长为1 时,图片尺寸不变

步长相同,尺寸不同时,图片尺寸相同

步长不同,尺寸相同时,图片尺寸不同

定义如下:

O = 输出图像的尺寸。
I = 输入图像的尺寸。
S = 移动步长
PS = 池化层尺寸

**注意:**不同于卷积层,池化层的输出通道数不改变

padding=’SAME‘ 填充0

输出图像尺寸的计算公式如下:

符号:($\lceil\quad \rceil$) 代表向上取整

O =\bigg\lceil\frac{I - P_S}{S}\bigg\rceil+1

**例:**原图=[1,28,28,1] ksize=[1,2,2,1], strides=[1,3,3,1] 结果:(1, 10, 10, 1),计算过程

O=\bigg\lceil\frac{28-2}{3} \bigg\rceil +1 = 10

(28-2)/3 = 8.6666667 向上取整为:9 加1 = 10

在TensorFlow的(填充0)池化结果

示例代码:
import tensorflow as tf
import numpy as np
from tensorflow.examples.tutorials.mnist import input_data
import matplotlib.pyplot as plt
# 获取数据集
mnist = input_data.read_data_sets(r'E:\PycharmProjects\TensorflowTest\MNIST_data', one_hot=True)
# in_x = tf.Variable(tf.zeros([1,28,28,1]), dtype=tf.float32)
in_x = tf.placeholder(dtype=tf.float32, shape=[1,28,28,1])

pool1 = tf.nn.max_pool(in_x,ksize=[1,2,2,1],strides=[1,1,1,1],padding='SAME')
pool2 = tf.nn.max_pool(in_x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')
pool3 = tf.nn.max_pool(in_x,ksize=[1,2,2,1],strides=[1,3,3,1],padding='SAME')
pool4 = tf.nn.max_pool(in_x,ksize<
  • 4
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值