当前位置:   article > 正文

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

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

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
  • 1

(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

**例:**原图=[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
  • 1

(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,<
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/559647
推荐阅读
相关标签
  

闽ICP备14008679号