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

04-00 Deep_Neural_Network–线性模型的局限性

03章节的TensorFlow入门我们建立了一个线性的模型Wx+b,实现了针对图片训练的简单逻辑分类器。这个功能看起来不错,但是功能却是十分有限。我们需要引入非线性的元素来实现更多的功能。
阅读更多

3-06 TensorFlow入门–随机梯度下降

前面我们反复提到了使用梯度下降法逐渐调整神经网络的权重和偏置,使得神经网络输出的loss逐渐逼近最小值。同时,用于训练网络的训练数据集越大越好,越能提高神经网络预测的精度。这就有一个矛盾:梯度下降法每计算一次需要输入全部的数据计算误差,再反向求导。模型越复杂,输入数据越多,计算量就会飙升。

阅读更多

3-05 TensorFlow入门–过拟合以及训练集的大小

分类器经常会使用大量数据进行训练,但训练总是会带来一些问题:分类器可以非常好的识别那些见过的数据,一旦输入全新的数据,预测结果会变得非常差。这种情况在分类器中是普遍存在的,这是因为分类器总是偏向于记住这些训练数据而不是记住特征后推理新数据。我们将在这个章节讨论如何解决这种过拟合问题,以及选取多大的训练集比较合适。
阅读更多

3-04 TensorFlow入门-输入与优化

经过上面几个章节的讲解,我们知道了使交叉熵减小的办法是梯度下降,需要对损失函数求导。我们掌握了导数工具之后将面临两个问题:我如何将图像输入到我的分类器中,以及我何时开始进行我的优化过程?本章节我们将会一一解答。

阅读更多

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

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

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

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

阅读更多

3-01 TensorFlow入门-Hello World

上节我们使用了一个hello world的示例来测试TensorFlow是否正确安装,现在我们来看一看这一段代码究竟做了什么。

阅读更多

3-00 TensorFlow入门–安装TensorFlow

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

29_动手实现TensorFlow–随机梯度下降

通过上一章节我们得到了每个输入对cost的梯度值,也就是forward_and_backward()函数的返回值。通过这个函数,我们的神经网络已经具备了学习的条件,为了使它开始学习,我们引入随机梯度下降方法。
阅读更多