小言_互联网的博客

Tensorflow——图像识别与卷积神经网络

391人阅读  评论(0)

一 卷积神经网络简介

全连接神经网络与卷积神经网络结构示意图
  •  全连接神经网络:神经网络每两层之间的所有节点都是有边相连的
  • 卷积神经网络:相邻两层之间只有部分节点相连

卷积神经网络的输入层就是图像的原始像素,而输出层中的每一个节点代表了不同类别的可信度。

使用全连接神经网络处理图像的最大问题在于全连接层的参数太多,参数增多除了导致计算速度减慢,还很容易导致过拟合问题。

 

卷积神经网络架构图

一个卷积神经网络主要由5种结构组成:

  • 输入层
  • 卷积层
  • 池化层
  • 全连接层
  • Softmax层

 

二 卷积神经网络常用结构

主要介绍卷积层和池化层的网络结构以及前向传播过程。

1. 卷积层

卷积层过滤器(filter)结构示意图

过滤器可以将当前神经网络上的一个子节点矩阵转化为下一层神经网络上的一个单位节点矩阵。(单位节点矩阵指的是一个长和宽都为1,但深度不限的节点矩阵)

过滤器的尺寸一般都是由人工指定的,常用的过滤器尺寸有3x3或5x5,过滤器的尺寸指的是过滤器输入节点矩阵的大小,过滤器处理的矩阵深度和当前神经网络节点矩阵的深度是一致的,所以虽然节点矩阵是三维的,但过滤器的尺寸只需要指定两个维度。

过滤器的深度只的是输出单位节点矩阵的深度,也需要人工进行指定。

 

过滤器的前向传播过程就是通过左侧小矩阵中的节点计算出右侧单位矩阵中节点的过程

$$ g(i)=f\left(\sum_{x=1}^{2} \sum_{y=1}^{2} \sum_{z=1}^{3} a_{x, y, z} \times w_{x, y, z}^{i}+b^{i}\right) $$

其中\(a_{x, y, z}\)为过滤器中点(x, y, z)的取值,\(f\)为激活函数,下图展示了在给定\(a\), \(w^{0}\)和\(b^{0}\)的情况下,使Relu作为激活函数时\(g(0)\)的计算过程

$$
\begin{aligned} g(0)=& f\{[1 \times 2+2 \times 0+0 \times 1+(-1) \times(-1)]+\\ &[2 \times(-2)+1 \times 2+(-1) \times 0+(-2) \times 1]+\\ &[1 \times 0+0 \times 1+2 \times(-1)+1 \times(-1)]+1\} \\=& f\{3+(-4)+(-3)+1\} \\=& f\{-3\}=0 \end{aligned}
$$

卷积层结构的前向传播过程就是通过将一个过滤器从神经网络当前层的左上角移动到右下角,并且在移动过程中计算每一个对应的单位矩阵。

当过滤器的大小不为1x1时,卷积层前向传播得到的矩阵的尺寸要小于当前层矩阵的尺寸。

使用了全0填充(zero-padding)的卷积层前向传播示意图
过滤器移动步长为2且使用全0填充时卷积层前向传播过程示意图

 

在卷积神经网络中,每一个卷积层中使用的过滤器中的参数都是一样的。

  • 共享过滤器的参数可以使得图像上的内容不受位置的影响
  • 可以巨幅减少神经网络上的参数

tensorflow实现卷积神经网络:

# -*- coding: utf-8 -*-
import tensorflow as tf
# 申明的参数变量是一个四维矩阵,前面两个维度表示的是过滤器的尺寸,第三个维度表示当前层的深度,第四个维度表示过滤器的深度
filter_weight = tf.get_variable('weights', [5, 5, 3, 16], initializer=tf.truncated_normal_initializer(stddev=0.1))

biases = tf.get_variable('biases', [16], initializer=tf.constant_initializer(0.1))

# tf.nn.conv2d() 函数的第一个输入为当前层的节点矩阵,注意这个一个四维矩阵,后面三个维度对应一个节点矩阵,第一维对应一个输入batch.
# tf.nn.conv2d() 第二个参数提供卷积层的权重
# tf.nn.conv2d() 第三个参数为不同维度上的步长,虽然提供了长度为4的数组,第一个和最后一个一定是1,因为卷积层的步长只对矩阵的长和宽有效
# tf.nn.conv2d() 最后一个参数是填充的方法,SAME表示全0填充,VALID表示不填充
conv = tf.nn.conv2d(input, filter_weight, strides=[1, 1, 1, 1], padding='SAME')

# tf.nn.bias_add() 提供了一个方便的函数给每一个节点加上偏置项,注意这里不能直接使用加法
bias = tf.nn.bias_add(conv, biases)

# 将计算结果通过ReLU 激活函数完成去线性化
actived_conv = tf.nn.relu(bias)

 

2. 池化层

 

 


转载:https://blog.csdn.net/qq_42055843/article/details/102091382
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场