文章

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

04-03 Deep_Neural_Network–正则化与Dropout

当我们的训练数据集比较小时候经常会出现训练集准确率很高接近100%,但测试集准确率却很差的问题,这是过拟合(over fitting)现象。解决过拟合现象经常使用正则化(Regularization)与Dropout。
阅读更多

04-02 Deep_Neural_Network–在TensorFlow保存与加载model

我们在上节课的训练中发现,每个回合训练的时间很久,加大训练回合之后所用的训练时间就更长了。一旦我们的程序结束,再次运行时原有的weight和bias信息全部消失了,又要重新训练。TensorFlow中设置了保存与加载的机制来解决这个问题。同时我们上节课建立的神经网络还不够“深”,只有一个隐藏层,这节课我们来加深神经网络。
阅读更多

04-01 Deep_Neural_Network–在TensorFlow中建立深度神经网络

之前我们已经通过TensorFlow建立了自己的分类器,现在我们将从基本的分类器转变为深度神经网络。我们以识别MNIST数据集中的手写数字作为目标,通过代码一步步建立神经网络。

image

代码

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets(".", one_hot=True, reshape=False)
#MNIST数据集已经可以用one-hot编码的形式提供

import tensorflow as tf

# 学习的参数大家可以自行调节
learning_rate = 0.001
training_epochs = 20
batch_size = 128  # Decrease batch size if you don't have enough memory
display_step = 1

n_input = 784  # MNIST data input (img shape: 28*28)
n_classes = 10  # MNIST total classes (0-9 digits)

#隐藏层的数量也就是我们上一节中讲的ReLU的数量H,这个值也可以调节
n_hidden_layer = 256 # layer number of features

# 权重和偏置需要有两份,一份是wx+b;另一份是w1*ReLU输出+b1
weights = {
    'hidden_layer': tf.Variable(tf.random_normal([n_input, n_hidden_layer])),
    'out': tf.Variable(tf.random_normal([n_hidden_layer, n_classes]))
}
biases = {
    'hidden_layer': tf.Variable(tf.random_normal([n_hidden_layer])),
    'out': tf.Variable(tf.random_normal([n_classes]))
}

# tf Graph input
x = tf.placeholder("float", [None, 28, 28, 1])
y = tf.placeholder("float", [None, n_classes])

#由于输入的是28*28*1的图像,需要将它转变为784的一维数组输入
x_flat = tf.reshape(x, [-1, n_input])

#建立两层神经网络
# Hidden layer with RELU activation
layer_1 = tf.add(tf.matmul(x_flat, weights['hidden_layer']), biases['hidden_layer'])
layer_1 = tf.nn.relu(layer_1)
# Output layer with linear activation
logits = tf.matmul(layer_1, weights['out']) + biases['out']

#GradientDescentOptimizer在TensorFlow入门那一章节讲过
# Define loss and optimizer
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y))
optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(cost)

# Initializing the variables
init = tf.global_variables_initializer()

# Launch the graph
with tf.Session() as sess:
    sess.run(init)
    # Training cycle
    for epoch in range(training_epochs):
        total_batch = int(mnist.train.num_examples/batch_size)
        # Loop over all batches
        for i in range(total_batch):
            #mnist.train.next_batch()每次返回一个训练集的子集
            batch_x, batch_y = mnist.train.next_batch(batch_size)
            # Run optimization op (backprop) and cost op (to get loss value)
            sess.run(optimizer, feed_dict={x: batch_x, y: batch_y})
        # Display logs per epoch step
        if epoch % display_step == 0:
            c = sess.run(cost, feed_dict={x: batch_x, y: batch_y})
            print("Epoch:", '%04d' % (epoch+1), "cost=", \
                "{:.9f}".format(c))
    print("Optimization Finished!")

    # Test model
    correct_prediction = tf.equal(tf.argmax(logits, 1), tf.argmax(y, 1))
    # Calculate accuracy
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
    # Decrease test_size if you don't have enough memory
    test_size = 256
    print("Accuracy:", accuracy.eval({x: mnist.test.images[:test_size], y: mnist.test.labels[:test_size]}))

learning rate=0.001,epoch=20测试结果

image

learning rate=0.0001,epoch=20测试结果

image

我们之前提到learning rate越大虽然学习越快,但精度可能并不好;上面这两个结果好像并不好解释,那是不是我们的学习回合不够多呢?那就把epoch加大到200看看有什么申请的反应

image

image

哈,这就是神经网络的神奇,调整一个小参数也会有很大的差别。感兴趣的同学可以把激活函数变成我们之前提到的sigmoid,看看有什么变化

完整代码请关注我的github:

Github链接

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

weiweizhao.com

3-03 TensorFlow入门-One_Hot编码与交叉熵

上一节我们训练了我们的第一个分类器,其中sandbox文件中有很多有意思的点可以探讨:softmax、one-hot encoding。这一章节我们将一一探讨这些知识点。
阅读更多

3-02 TensorFlow入门-训练分类器

分类事一种给定输入和标记的任务,如下图的字母,每个字母有一个标签,说明它是什么。典型情况下我们会有很多样本,我们把它归类后交给分类器学习。当出现了全新的样本时,分类器的目标是指出这个新样本属于哪一类。虽然机器学习不仅仅包含分类,但是分类是我们机器学习的基础,例如:排序,目标检测,回归等算法都需要基于分类。本文将实现使用TensorFlow训练识别手写数字0,1,2.

阅读更多

3-00 TensorFlow入门–安装TensorFlow

本章节开始学习如何使用TensorFlow解决实际问题。围绕MNIST数据集识别出图像中的字母作为目标。以下是MNIST数据集中字母A的一些图形:
阅读更多

21_自己的TensorFlow–MiniFlow

在这个章节我们将创建自己的深度学习框架,自己的TensorFlow。

TensorFlow是目前最流行的开源神经网络框架,TensorFlow™是一个开放源代码软件库,用于进行高性能数值计算。借助其灵活的架构,用户可以轻松地将计算工作部署到多种平台(CPU、GPU、TPU)和设备(桌面设备、服务器集群、移动设备、边缘设备等)。TensorFlow™ 最初是由 Google Brain 团队(隶属于 Google 的 AI部门)中的研究人员和工程师开发的,可为机器学习和深度学习提供强力支持,并且其灵活的数值计算核心广泛应用于许多其他科学领域。
阅读更多