TensorFlow - 浅层神经网络 (shallow neural networks)

腾讯云
高级
0 个任务
剩余 1 个名额

你还可以 创建 或者 使用已有 云主机不限时上机

实验内容

本实验介绍浅层神经网络在 TensorFlow 上的实现,并使用模型处理 MNIST 数据集。

首次可免费使用云主机 3 小时 ,到期后云主机将被重置并退库,若想保留成果请及时留用。

实验资源

云服务器

软件环境

Ubuntu 14.04 64 位

目录

# TensorFlow - 浅层神经网络(shallow neural networks) ## 简介 > <time>30min ~ 60min</time> 本实验介绍浅层神经网络在 TensorFlow 上的实现,并使用模型处理 MNIST 数据集。 ### MNIST数据集介绍 [MNIST][http://yann.lecun.com/exdb/mnist/]是一个手写阿拉伯数字的数据集。 其中包含有`60000`个已经标注了的训练集,还有`10000`个用于测试的测试集。 本次实验的任务就是通过手写数字的图片,识别出具体写的是0-9之中的哪个数字。 ### 理论知识回顾 一个典型的浅层神经网络结构如下: ![image](https://share-10039692.file.myqcloud.com/lab/a17bac8dbb/image/vzl7gsxhid/neural_network.png) 1. 上图所示的是一个只有一层隐藏层的浅层神经网络 2. 我们有3个输入层节点,分别对应`i[1]` `i[2]` `i[3]` 3. 隐藏层有4个节点,分别对应`h[0]` `h[1]` `h[2]` `h[3]`,对应的激活函数为`ReLu`函数 4. 对于典型的`二分类`任务,我们只需要`1`个输出节点,就是`out`节点,对应的激活函数是[softmax][http://ufldl.stanford.edu/wiki/index.php/Softmax%E5%9B%9E%E5%BD%92]函数 #### 激活函数定义(activation function): ```xml <formula> softmax(x^i) = \\left[ \\begin{matrix} p(y^i=1|x^i,\\theta) \\\\ p(y^i=2|x^i,\\theta) \\\\ \\cdots \\\\ p(y^i=n|x^i,\\theta) \\end{matrix} \\right] = \\frac{1}{\\sum_{j=1}^{k}e^{\\theta_j^Tx^i}} \\left[ \\begin{matrix} e^{\\theta_1^Tx^i} \\\\ e^{\\theta_2^Tx^i} \\\\ \\cdots \\\\ e^{\\theta_k^Tx^i} \\end{matrix} \\right] </formula> ``` ```xml <formula> ReLu(x) = max(0, x) </formula> ``` ### 模型设计 1. `MNIST`数据一共有`784`个输入,所以我们需要一个有`784`个节点的输入层。 2. 对于中间层,我们设置为`1000`个节点,使用的激活函数为`ReLu` 3. `MNIST`数据使用`One-Hot`格式输出,有0-9 `10`个label,分别对应是否为数字0-9,所以我们在输出层有`10`个节点,由于0-9的概率是`互斥`的,我们使用 [Softmax][http://ufldl.stanford.edu/wiki/index.php/Softmax%E5%9B%9E%E5%BD%92] 函数作为该层的激活函数 ## 训练模型 > <time>30min ~ 60min</time> ### 数据准备 首先我们需要先下载`MNIST`的数据集。使用以下的命令进行下载: ```bash wget https://devlab-1251520893.cos.ap-guangzhou.myqcloud.com/t10k-images-idx3-ubyte.gz wget https://devlab-1251520893.cos.ap-guangzhou.myqcloud.com/t10k-labels-idx1-ubyte.gz wget https://devlab-1251520893.cos.ap-guangzhou.myqcloud.com/train-images-idx3-ubyte.gz wget https://devlab-1251520893.cos.ap-guangzhou.myqcloud.com/train-labels-idx1-ubyte.gz ``` ### 创建代码 现在您可以在 [/home/ubuntu][create-example] 目录下创建源文件 [shallow_neural_networks.py][create-example],内容可参考: > <locate for="create-example" path="/home/ubuntu" verb="create" hint="右击创建 shallow_neural_networks.py" /> ```python /// <example verb="edit" file="/home/ubuntu/shallow_neural_networks.py" /> import numpy as np import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data def add_layer(inputs, in_size, out_size, activation_function=None): W = tf.Variable(tf.random_normal([in_size, out_size])) b = tf.Variable(tf.zeros([1, out_size]) + 0.01) Z = tf.matmul(inputs, W) + b if activation_function is None: outputs = Z else: outputs = activation_function(Z) return outputs if __name__ == "__main__": MNIST = input_data.read_data_sets("./", one_hot=True) learning_rate = 0.05 batch_size = 128 n_epochs = 10 X = tf.placeholder(tf.float32, [batch_size, 784]) Y = tf.placeholder(tf.float32, [batch_size, 10]) l1 = add_layer(X, 784, 1000, activation_function=tf.nn.relu) prediction = add_layer(l1, 1000, 10, activation_function=None) entropy = tf.nn.softmax_cross_entropy_with_logits(labels=Y, logits=prediction) loss = tf.reduce_mean(entropy) optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss) init = tf.initialize_all_variables() with tf.Session() as sess: sess.run(init) n_batches = int(MNIST.train.num_examples/batch_size) for i in range(n_epochs): for j in range(n_batches): X_batch, Y_batch = MNIST.train.next_batch(batch_size) _, loss_ = sess.run([optimizer, loss], feed_dict={X: X_batch, Y: Y_batch}) if j == 0: print "Loss of epochs[{0}] batch[{1}]: {2}".format(i, j, loss_) # test the model n_batches = int(MNIST.test.num_examples/batch_size) total_correct_preds = 0 for i in range(n_batches): X_batch, Y_batch = MNIST.test.next_batch(batch_size) preds = sess.run(prediction, feed_dict={X: X_batch, Y: Y_batch}) correct_preds = tf.equal(tf.argmax(preds, 1), tf.argmax(Y_batch, 1)) accuracy = tf.reduce_sum(tf.cast(correct_preds, tf.float32)) total_correct_preds += sess.run(accuracy) print "Accuracy {0}".format(total_correct_preds/MNIST.test.num_examples) ``` > <checker type="output-contains" command="ls -la /home/ubuntu/shallow_neural_networks.py" hint="请创建文件 shallow_neural_networks.py"> > <keyword regex="shallow_neural_networks" /> > </checker> ### 代码讲解 #### add_layer 函数 允许用户指定上一层的输出节点的个数作为`input_size`, 本层的节点个数作为`output_size`, 并指定激活函数`activation_function` 可以看到我们调用的时候位神经网络添加了`隐藏层1`和`输出层` ```python /// <example verb="edit" file="/home/ubuntu/shallow_neural_networks.py" /> l1 = add_layer(X, 784, 1000, activation_function=tf.nn.relu) # 添加隐藏层1 prediction = add_layer(l1, 1000, 10, activation_function=None) # 添加输出层 entropy = tf.nn.softmax_cross_entropy_with_logits(labels=Y, logits=prediction) loss = tf.reduce_mean(entropy) ``` ### 执行代码 ```bash python shallow_neural_networks.py ``` 运行过程中,如果出现网络错误,请重试。 运行输出: ``` Loss of epochs[0] batch[0]: 219.555664062 Loss of epochs[1] batch[0]: 4.43757390976 Loss of epochs[2] batch[0]: 6.34549808502 Loss of epochs[3] batch[0]: 4.51894617081 Loss of epochs[4] batch[0]: 1.93666791916 Loss of epochs[5] batch[0]: 1.16164898872 Loss of epochs[6] batch[0]: 2.4195971489 Loss of epochs[7] batch[0]: 0.164100989699 Loss of epochs[8] batch[0]: 2.35461592674 Loss of epochs[9] batch[0]: 1.77732157707 Accuracy 0.9434 ``` 可以看到经过`10`轮的训练,准确度大约在`94%`左右 ## 完成实验 > <time>1min</time> ### 实验内容已完成 您可进行更多关于机器学习教程: * [实验列表 - 机器学习][https://cloud.tencent.com/developer/labs/gallery?tagId=31] 关于 TensorFlow 的更多资料可参考 [TensorFlow 官网 ][https://www.tensorflow.org/]。