全连接神经元网络测试MNIST数据集

1、代码的运⾏log截图

输入图片说明

2、对模型结构的理解

本模型是一个2层的全连接神经元网络,包含输入层、1个隐藏层、1个输出层。

输入层为784个node的张量,既为32*32分辨率并经过二值化后的图片的所有像素点组成的一个向量。

第一层为隐藏层,有100个node,其值为输入层的784个节点乘以784*100个权重加上偏置项后的和,经过relu激活函数取得的结果。

L1_units_count = 100   #第一层网络

W_1 = tf.Variable(initialize([784, L1_units_count]))
b_1 = tf.Variable(initialize([L1_units_count]))
logits_1 = tf.matmul(x, W_1) + b_1
output_1 = tf.nn.relu(logits_1)

第二层为输出层,输出10个node,其值为隐藏层的输出值乘以100*10个权重,加上偏置项取得(此时的数据未经过激活函数,将会在后面使用softmax函数激活)。

L2_units_count = 10   #第二层网络
W_2 = tf.Variable(initialize([L1_units_count, L2_units_count]))
b_2 = tf.Variable(initialize([L2_units_count]))
logits_2 = tf.matmul(output_1, W_2) + b_2  

logits = logits_2

3、对模型训练过程(梯度如何计算,参数如何更新)的理解

模型一次训练过程包括前向传播和反向传播

前向传播过程中通过权重与输入数值相乘累加,并通过激活函数得到输出值作为下一层的输入值,逐层计算得到最终的输出值。

反向传播过程的核心,是通过比较输出y和真值t,对参与计算的w进行调整。其计算方法是从网络的输出层开始,向输入层方向逐层计算梯度并更新权重,与前馈运算正好相反。首先计算输出节点的总误差,并将这些误差用反向传播算法传播回网络,以计算梯度。接下来,使用类似梯度下降之类的算法来调整网络中的所有权重,目的是减少输出层的误差。当计算一个节点的误差项时,需要先计算每个与其相连的下一层节点的误差项。这就要求误差项的计算顺序必须是从输出层开始,然后反向依次计算每个隐藏层的误差项,直到与输入层相连的那个隐藏层。当所有节点的误差项计算完毕后,就更新了所有的权重。

4、对计算图的理解。

计算图主要由四个部分构成:
1、张量(Tensor)
2、操作(Option)
3、变量(Variable)
4、会话(Session)

在计算图计算或者张量的运算中,会经常使用一些方法来对数据进行操作,包括最简单的对元素的运算,对矩阵进行运算,定义常量,大量的神经元函数的操作以及保存模型的相关操作等。上图中包含的操作有placehold、Matmul、add、Relu、Softmax、ArgMax、Equal、Cast、Mean、Saver和Restore等。

变量就是在计算图的过程中可以改变的节点,在本例中,权重w和偏置项b都会随着迭代的进行而不断变化着,这样的值就可以拿来作为变量。在实际的训练过程中,一般会把需要训练的值设置为变量。一般来讲,在使用变量的时候,我们都会给变量设置一个初始值,然后根据训练的次数迭代,再将真正的变量不断地推断出来。一般会通过构造一个Variable类的实例在图中添加一个变量。当这个变量被设置初始值后,这个变量的形状和类型就会被固定下来。通过assign()函数来改变它,通过Variable()创造的变量可以作为图中的其他操作来使用,你也可以在图中添加节点,对变量进行算术操作。

在Tensorflow中,启动一个图的前提是先要创建一个会话(Session),Tensorflow的所有对图的操作,都必须放在会话中进行。在会话中提供了一个run方法,用来执行计算图的整体或局部的操作。

5、解释这⾥的模型为什么效果⽐较差。

这里的神经网络模型只有一个隐藏层,神经元数目也较少,模型相对比较简单,而且训练轮次较少,所以模型效果比较差。

程序:

待定!!!!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章