永兴的TensorFlow笔记-11 多层感知器下的手写字识别

在这里插入图片描述

一、什么是多层感知器?

  • 多层感知器(Multilayer Perceptron,缩写MLP)是一种前向结构的人工神经网络,映射一组输入向量到一组输出向量。MLP可以被看作是一个有向图,由多个的节点层所组成,每一层都全连接到下一层。除了输入节点,每个节点都是一个带有非线性激活函数的神经元(或称处理单元)。一种被称为反向传播算法的监督学习方法常被用来训练MLP。MLP是感知器的推广,克服了感知器不能对线性不可分数据进行识别的弱点。
  • 单个节点被称为感知器(perceptron),类似于一个多元线性回归(multiple linear regression)。多元线性回归和感知器之间的不同之处在于:感知器将多元线性回归生成的信号馈送进可能线性也可能非线性的激活函数中。在多层感知器(MLP)中,感知器按层级排布,层与层之间互相连接。在 MLP 中有三种类型的层,即:输入层(input layer)、隐藏层(hidden layer)和输出层(output layer)。输入层接收输入模式而输出层可以包含一个分类列表或那些输入模式可以映射的输出信号。隐藏层调整那些输入的权重,直到将神经网络的误差降至最小。对此的一个解释是,隐藏层提取输入数据中的显著特征,这些特征有关于输出的预测能力。
  • 常被MLP用来进行学习的反向传播算法,在模式识别的领域中算是标准监督学习算法,并在计算神经学及并行分布式处理领域中,持续成为被研究的课题。MLP已被证明是一种通用的函数近似方法,可以被用来拟合复杂的函数,或解决分类问题。

二、为什么要建立多层神经网络?

  • 单层神经网络能模拟所有的线性问题,多层神经网络能模拟更加复杂的非线性问题。
  • 更深的网络结构能有效增强模型解决问题的能力,更加有效的提取特征,大幅提高学习效率。
  • 在这里插入图片描述
    如上图所示,感知器被分层进行组织。感知器的第一层被称为输入层,它接收训练集 PT 中的模式 p. 最后一层映射到这些模型的预期输出。举一个输出的例子:模式可以是关于安全性的不同技术指标的数量列表,而潜在的输出则可能是 {买进、持有、卖出} 这样的分类。
    隐藏层则将前一层的输出作为下一层的输入;而下一层的输出又会作为另一层的输入。所以,这些隐藏层到底在做什么?一个解释是,它们提取输入数据中的显著特征,这些特征可以预测输出。这个过程被称为特征提取(feature extraction),而且在某种程度上,其和主成分分析(PCA)等统计技术具有相似的功能。

三、设计多层感知器神经网络:

  • 1、明确神经网络层数和神经网络节点。
    绘制抽象计算图:
    在这里插入图片描述

  • 2、根据问题和实际情况确定神经网络的激活函数、优化器、正则化方法
    这里我们使用:
    tf.train.GradientDescentOptimizer(learning_ratea).minimize(loss)
    tf.nn.relu(tf.matmul(x, w) + b)
    tf.contrib.layers.l2_regularizer(scale)

  • 3、定义超参数:
    train_steps = 20000 # 训练轮数
    learning_rate = 0.1 # 初始学习率
    decay_rate = 0.9 # 学习率衰减指数
    decay_steps = 500 # 衰减频率控制
    scale = 0.1 # 正则率

  • 4、训练神经网络调整相关超参数
    根具训练情况 修改指数衰减学习率参数、以及正则率等

  • 5、评价模型
    更具准确率等评估标准,得到模型效果

完整代码展示:

import tensorflow as tf
import pretty_errors
from tensorflow.examples.tutorials.mnist import input_data as data
import numpy as np

# 解析数据集
mnist = data.read_data_sets("MNIST_data/", one_hot=True)


def layer(w, x, b=0, n=1):  # 定义运算函数
    if n == 1:
        y = tf.nn.relu(tf.matmul(x, w) + b)
    else:
        y = tf.nn.softmax(tf.matmul(x, w))
    return y


# 设置神经网络基本参数
train_steps = 20000  # 训练轮数
learning_rate = 0.1  # 初始学习率
decay_rate = 0.9  # 学习率衰减指数
decay_steps = 500  # 衰减频率控制
scale = 0.1  # 正则率
# decay_steps控制衰减速度
# 如果decay_steps大一些,(global_step / decay_steps)就会增长缓慢一些
#   从而指数衰减学习率decayed_learning_rate就会衰减得慢一些
#   否则学习率很快就会衰减为趋近于0

# 定义输入节点
X = tf.placeholder(shape=(None, 784), dtype=tf.float32, name="X")
Y_ = tf.placeholder(shape=(None, 10), dtype=tf.float32, name="Y_")
# 定义神经网络中的学习参数
w1 = tf.Variable(tf.truncated_normal([784, 100], stddev=0.1))  # 正态分布随机数
w2 = tf.Variable(tf.truncated_normal([100, 50], stddev=0.1))
w3 = tf.Variable(tf.truncated_normal([50, 10], stddev=0.1))
b1 = tf.Variable(tf.zeros([100]))
b2 = tf.Variable(tf.zeros([50]))
# 定义运算
y1 = layer(w1, X, b1)
y2 = layer(w2, y1, b2)
y3 = layer(w3, y2, n=False)
# 使用正则化
tf.add_to_collection(tf.GraphKeys.WEIGHTS, w1)
tf.add_to_collection(tf.GraphKeys.WEIGHTS, w2)
tf.add_to_collection(tf.GraphKeys.WEIGHTS, w3)
regularizer = tf.contrib.layers.l2_regularizer(scale)
regTerm = tf.contrib.layers.apply_regularization(regularizer)
# 定义损失函数
loss = -tf.reduce_sum(Y_ * tf.math.log(y3)) + regTerm
# loss = tf.nn.softmax_cross_entropy_with_logits(logits=tf.argmax(y4,1,output_type=tf.float32),
#                                               labels=tf.argmax(Y_,1,output_type=tf.float32))
# 设置指数衰减学习率
learning_ratea = tf.train.exponential_decay(learning_rate,
                                            train_steps,
                                            decay_steps,
                                            decay_rate)
# 设置优化器 梯度下降
trainOtimaize = tf.train.GradientDescentOptimizer(learning_ratea).minimize(loss)
# 初始化所有变量
init = tf.global_variables_initializer()
# 开启会话
with tf.Session() as sess:
    sess.run(init)  # 进行初始化
    for i in range(train_steps):
        batch_xs, batch_ys = mnist.train.next_batch(100)  # 每次取出100张图片数据
        sess.run(trainOtimaize, feed_dict={X: batch_xs, Y_: batch_ys})  # 进行训练,完成前向和方向传播,并修改学习参数
        # print("loss:",sess.run(loss,feed_dict={X:batch_xs,Y_:batch_ys}))
        if i % 1000 == 0:
            correct_prediction = tf.equal(tf.argmax(y3, 1), tf.argmax(Y_, 1))
            accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
            print(sess.run(accuracy, feed_dict={X: mnist.test.images, Y_: mnist.test.labels}))

完整代码下载:
链接:https://pan.baidu.com/s/1BVjHnUYhijDRV2c8Sxa9Aw 密码:0fgb

发布了45 篇原创文章 · 获赞 28 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/m0_43505377/article/details/103996591