文章

06 交通标志识别–LeNet的TensorFlow实现

交通标志识别是自动驾驶的基础,车辆需要识别出当前所处的路段的各种限制才能够给驾驶行为一个反馈。在本章的交通标志识别中我们首先学习上一章节《卷积神经网络》学到的LeNet架构,使用TensorFlow来实现LeNet,实现对手写数字的识别。
LeNet-5出自论文Gradient-Based Learning Applied to Document Recognition,是一种用于手写体字符识别的非常高效的卷积神经网络。虽然LeNet5这个网络虽然很小,但是它包含了深度学习的基本模块:卷积层,池化层,全链接层。是其他深度学习模型的基础,这里我们对LeNet5进行深入分析。同时,通过实例分析,加深对与卷积层和池化层的理解。

阅读更多

05-04 CNN-池化与1×1卷积

前面我们已经了解到了普通的卷积神经网络是什么样子。在本节将接触到更高级的操作:池化,1×1卷积,inception结构。池化是卷积神经网络中经常遇到的。池化层往往在卷积层之后,通过池化来降低卷积层输出特征向量,降低过拟合的概率。池化降低了各特征图的维度,但可以保持大部分重要信息。池化一般分为以下几种方式:Max pooling,mean pooling,加和。

阅读更多

05-03 CNN-可视化CNN与TensorFlow实现

将卷积神经网络的识别过程可视化有助于我们理解卷积神经网络的工作过程。我们基于Zeiler的论文在ImageNet上面训练的CNN来讲解,大神的视频可以看链接:视频链接。我们将看到每一层输入的是什么,以及它们是怎么检测越来越复杂的图形的。

Layer1

image

上图表示了导致第一层网络激活的元素,包括各种线条以及光斑。这张图中每个网格都代表着能让第一层网络中的神经元激活的元素,换句话讲,这些是第一层网络可以识别的元素。左上角的图片显示识别一条-45度的斜线,中上角网格显示的是识别45度斜线。

我们再来看能够导致神经元激活的更多的图片例子。以下的图像都会激活识别-45度的神经元,可以注意到以下的不同图片有不同的斜率,不同颜色,不同特征。

image

所以CNN的第一层只是选取非常简单的形状或特征比如说线条和光斑。

Layer2

image

上图表示CNN的第二层的可是化,需要注意到的是这一层网络开始识别比较复杂的特征比如说圆圈或者条纹。左边的网格表示这一层的神经元基于右侧网格中的相应图像如何被激活

我们可以注意到,CNN的第二层开始识别圆圈,条纹和矩形。
以上的识别是CNN自动完成的,而不是我们编程让CNN去识别某一个特征的。

Layer3

image

上图是CNN第三层的可视化结果,左侧灰色的网格表示当输入右侧相关图像时第三层神经网络所能看到的信息。第三层选取第二层输出组合成复杂特征。包含网格,轮子,脸等等

Layer5

image

我们跳过了第四层,这是因为第四层也是重复第三层的工作,选取上一层的输出作为组合。我们直接跳到第五层也就是输出层。这一步选取更高层级的特征,用于分类,识别出狗,鸟,自行车等物品

在TensorFlow中使用CNN

我们用一个代码片段示意如何在TensorFlow中使用CNN。
TensorFlow提供了tf.nn.conv2d() 和tf.nn.bias_add()两个函数来建立卷积神经网络,实例代码如下:

# Output depth
k_output = 64

# Image Properties
image_width = 10
image_height = 10
color_channels = 3

# Convolution filter
filter_size_width = 5
filter_size_height = 5

# Input/Image
input = tf.placeholder(
    tf.float32,
    shape=[None, image_height, image_width, color_channels])

# Weight and bias
weight = tf.Variable(tf.truncated_normal(
    [filter_size_height, filter_size_width, color_channels, k_output]))
bias = tf.Variable(tf.zeros(k_output))

# Apply Convolution
conv_layer = tf.nn.conv2d(input, weight, strides=[1, 2, 2, 1], padding='SAME')
# Add bias
conv_layer = tf.nn.bias_add(conv_layer, bias)
# Apply activation function
conv_layer = tf.nn.relu(conv_layer)

以上的代码使用tf.nn.conv2d来计算卷积,使用weight来作为滤波器,[1,2,2,1]作为步幅。TensorFlow对每个输入维度使用一个步幅,[batch, input_height, input_width, input_channels]。我们通常设置batch和input_channels的步幅为1.

我们在设置batch和input_channels为1时应该关注修改input_height和input_width。这两个值的步幅会在整个input范围内移动滤波器。在上面的案例中我们使用了一个步幅为2,大小为5×5的滤波器。
tf.nn.bias_add方法把一个1维偏置数组加入到了矩阵的最后一维中。

完整代码请关注我的github:

Github链接

更多文章请关注我的个人网站:

weiweizhao.com

05-02 CNN-参数共享与维度

之前有小伙伴私信问我如何实现一只猫或狗出现在图像的不同位置也能正常识别出来。正如我们之前所看到的,图像中某一个特定小块的分类结果是由这个小块对应的权重w和偏置b决定的。如果我们希望图片左上角小块中的猫与右下角小块中的猫被相同的分类方法分类,那么左上角的小块和右下角的小块的权重w和偏置b都一致,这样它们的分类结果就会相同,这就是参数共享。

阅读更多

05-01 CNN–直觉与滤波器

卷积神经网络用于识别和分类非常有效,它具有很多人脑的特征,例如我们所说的直觉。我们人类是如何将某个物品归类的呢?一般的识别流程是这样的:

  1. 把图像区分成很多个小的碎片
  2. 识别某些固定的特征元素,例如眼睛,鼻子,毛发
  3. 把这些元素都集合起来归类为某一种物品

这个过程就像人的“直觉”,我们就在神经网络中来实现直觉。

阅读更多

05-00 CNN–卷积神经网络简介

前面我们介绍的神经网络都是把全部数据输入进去然后进行学习的,这个过程会掺杂很多无用的信息使得学习过程非常低效。但是如果我们已经知道我们要识别或者学习的是什么,我们可以有更高效的方法进行神经网络的学习。

阅读更多