1、网络设计
- 首先我们设计一个具有两层隐藏层的神经网络作为训练MNIST数据集的网络;
- 将学习率设置为变量(每迭代一次,按公式减小学习率,目的为了使得收敛速度更快);
- 将Dropout算法引入,但是并不使用它(keep_prob设置为1.0),只为了说明此项也是可以更改的,对准确率都一定的影响;
- 使用交叉熵(cross-entropy)代价函数计算loss
- 使用Adam优化器,对loss进行操作,使得loss最小
2、网络的实现
网络如下:
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
#载入数据集
mnist = input_data.read_data_sets("MNIST_data",one_hot=True)
#每个批次的大小
batch_size = 100
#计算一共需要多少个批次
n_batch = mnist.train.num_examples // batch_size
#定义两个占位符(placeholder)
x = tf.placeholder(tf.float32,[None,784])
y = tf.placeholder(tf.float32,[None,10])
#再定义一个placeholder,后面设置Dropout参数
keep_prob = tf.placeholder(tf.float32)
#定义学习率变量
lr = tf.Variable(0.001,dtype= tf.float32)
#创建一个简单的神经网络
#第一个隐藏层
#权重
W1 = tf.Variable(tf.truncated_normal([784,500],stddev = 0.1)) #截断的正态分布中输出随机值,标准差:stddev
#偏置值
b1 = tf.Variable(tf.zeros([500]) + 0.1)
#使用激活函数,获得信号输出,即此层神经元的输出
L1 = tf.nn.tanh(tf.matmul(x, W1) + b1)
#调用tensorflow封装好的dropout函数,keep_prob参数是设置有多少的神经元是工作的,在训练时,通过feed操作将确切值传入
L1_drop = t