多层感知机实验
- 实验目的
- 实验原理
- 实验结果
- 程序代码
- 运行结果
实验目的
1.掌握使用TensorFlow进行多层感知机操作
2.熟悉多层感知机的原理
实验原理
多层感知机是由感知机推广而来,感知机学习算法(PLA: Perceptron Learning Algorithm)用神经元的结构进行描述的话就是一个单独的。
感知机(PLA)的神经网络表示如下:
从上述内容更可以看出,PLA是一个线性的二分类器,但不能对非线性的数据进行有效的分类。因此便有了对网络层次的加深,理论上,多层网络可以模拟任何复杂的函数。 多层感知机MLP 多层感知机的一个重要特点就是多层,我们将第一层称之为输入层,最后一层称之有输出层,中间的层称之为隐层。MLP并没有规定隐层的数量,因此可以根据各自的需求选择合适的隐层层数且对于输出层神经元的个数也没有限制。 MLP神经网络结构模型如下,本图中只涉及了一个隐层,输入只有三个变量[x1,x2,x3]和一个偏置量b,输出层有三个神经元。相比于感知机算法中的神经元模型对其进行了集成。
- 前向传播
前向传播指的是信息从第一层逐渐地向高层进行传递的过程,以下图为例来进行前向传播的过程的分析。
假设第一层为输入层,输入的信息为[x1,x2,x3]。对于层l,用Ll表示该层的所有神经元,其输出为yl,其中第j个节点的输出为yl(j) ,该节点的输入为ul(j),连接第l层与第(l−1)层的权重矩阵为Wl,上一层(第l−1层)的第i个节点到第l层第j个节点的权重为wl(ji)。 - 反向传播
基本的模型搭建完成后,训练的时候所做的就是完成模型参数的更新。由于存在多层的网络结构,因此无法直接对中间的隐层利用损失来进行参数更新,但可以利用损失从顶层到底层的反向传播来进行参数的估计。(约定:小写字母—标量,加粗小写字母—向量,大写字母—矩阵)
假设多层感知机用于分类,在输出层有多个神经元,每个神经元对应一个标签。输入样本为x=[x1,x2,⋯,xn],其标签为t;对于层l,用Ll表示该层的所有神经元,其输出为yl,其中第j个节点的输出为yl(j),该节点的输入为ul(j),连接第l层与第(l−1)层的权重矩阵为Wl,上一层(第l−1层)的第i个节点到第l层第j个节点的权重为wl(ji)。
实验结果
程序代码
import numpy as np
import tensorflow as tf
from tensorflow.examples.turtorials.mnist import input_Data
import os
mnist=input_data.read_data_sets(*/data/yxcx/tf*,one_hot=True)
Xtr,Ytr=mnist.train.next_batch(5000)
Xte,Yte=mnist.test.next_batch(200)
xtr=tf.placeholder("float",[None,784])
xte=tf.placeholder("float",[784])
distance=tf.reduce_sum(tf.abs(tf.add(xtr,tf.negative(xte))),reduction_indices=1)
pred=tf.argmin(distance,0)
init=tf.global_variabes_initializer()
with th.Session() as sess:
sess.run(init)
for i in range(len(Xte)):
nn_index=sess.run(pred,feed_dict={xtr:Xtr,xte:Xte[i,:]})
print("Test",i,"Prediction:",np.argmax(Ytr[nn_index]),"True Class:",np.argmax(Yte[i]))
if np.argmax(Ytr[nn_index])==npargmax(Yte[i]):
accuracy+=1./len(Xte)
print("Done!")
print("accuracy:",accuracy)
运行结果