多层感知机(MLP)作为最典型的神经网络,结构简单且规则,并且在隐层设计的足够完善时,可以拟合任意连续函数。本文将利用 MLP 实现手写数字分类的任务。
结构:
784个输入层神经元 – 200个隐层神经元 – 10个输出层神经元。其中,设置 relu为隐层的激活函数,输出层用 SoftMax 进行处理
Dropout:
将神经网络某一层的输出节点数据随机丢弃一部分,即令这部分被随机选中的节点输出值令为0,这样做等价于创造出很多新样本,通过增大样本量,减少特征数量来防止过拟合。
学习效率:
因为神经网络的训练通常不是一个凸优化问题,它充满了很多局部最优,因此我们通常不会采用标准的梯度下降算法,而是采用一些有更大可能跳出局部最优的算法,常用的如SGD,而SGD本身也不稳定,其结果也会在最优解附近波动,且设置不同的学习效率可能会导致我们的网络落入截然不同的局部最优之中,对于SGD,我们希望开始训练时学习率大一些,以加速收敛的过程,而后期学习率低一些,以更稳定地落入局部最优解,因此常使用Adagrad、Adam等自适应的优化方法,可以在其默认参数上取得较好的效果。
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data'''导入MNIST手写数据'''
mnist = input_data.read_data_sets('MNIST_data/', one_hot=True)'''自定义神经层添加函数'''
def add_layer(inputs, in_size, out_size, activation_function=None):Weights = tf.Variable(tf.truncated_normal([in_size, out_size], mean=0, stddev=0.2)) # 定义权重biases = tf.Variable(tf.zeros([1, out_size]) + 0.1) # 定义biasWx_plus_b = tf.matmul(inputs, Weights) + biasesif activation_function is None: # 根据激活函数的设置来处理输出项outputs = Wx_plus_belse:outputs = activation_function(Wx_plus_b)return outputs'''创建样本数据'''
x = tf.placeholder(tf.float32, [None, 784])
y = tf.placeholder(tf.float32, [None, 10])
keep_prob = tf.placeholder(tf.float32)'''构建MLP'''
l1 = add_layer(x, 784, 300, activation_function=tf.nn.relu) # 隐层l1
l1_dropout = tf.nn.dropout(l1, keep_prob) # 对l1进行dropout处理
prediction = add_layer(l1_dropout, 300, 10, activation_function=tf.nn.softmax) # 输出层'''损失函数'''
loss = tf.reduce_mean(tf.reduce_sum((prediction - y) ** 2, reduction_indices=[1]))'''优化器'''
train_step = tf.train.AdagradOptimizer(0.3).minimize(loss)'''创建会话并激活部件'''
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)'''训练'''
for i in range(10001):x_batch, y_batch = mnist.train.next_batch(200) # 每次从训练集中抽出批量为200的训练批进行训练sess.run(train_step, feed_dict={x: x_batch, y: y_batch, keep_prob: 0.75})if i % 200 == 0:print('第', i, '轮迭代后:')whether_correct = tf.equal(tf.argmax(y, 1), tf.argmax(prediction, 1))accuracy = tf.reduce_mean(tf.cast(whether_correct, tf.float32))print(sess.run(accuracy, feed_dict={x: mnist.test.images, y: mnist.test.labels, keep_prob: 1.0}))
参考:数据科学学习手札36–tensorflow实现MLP