一、前向传播算法
神经元(节点):有多个输入和一个输出,每个神经元既可以是其他神经元的输出也可以是整个神经网络的输入
全连接神经网络:相邻两层之间任意两个节点都有连接
前向传播是通过矩阵乘法来实现的:
a=tf.matmul(x,w1) w1:第一层参数
b=tf.matmul(a,w2) w2:第二层参数
二、神经网络参数和Tensorflow变量
变量(Variable)的作用:保存和更新神经网络中的参数
变量和张量的关系:变量是包含张量的内存缓冲。
初始化一个变量的方法:
weights=tf.Variable(tf.random_normal([2,3],stddev=2)) 注:tf.random_normal([2,3],stddev=2)随机数生成函数
print(weights)的输出为:
<tf.Variable 'Variable:0' shape=(2, 3) dtype=float32_ref>
会产生一个[2,3]的矩阵,元素的均值为0,标准差为2
偏置项的设置:
bias=tf.Variable(tf.zeros([3])) 注:tf.zeros([3])常数生成函数
通过其他变量的初始值来初始化新的变量
w1=tf.Variable(weights.initialized_value()*2.0)
变量在使用前需要初始化:
sess.run(w1.initializer)
更加快捷的初始化变量的方式:(初始化了全部的变量)-------OK
init_op=tf.global_variables_initializer()
sess.run(init_op)
变量和张量一样,有维度和类型属性,是不能更改的
w1.assign(w2)
tf.assign(w1,w2) //将w2的值赋给w1
如果类型不匹配则不能进行赋值
三、通过Tensorflow训练神经网络
反向传播算法实现了一个迭代的过程,每次迭代开始首先需要选取一小部分训练数据,这一部分数据叫做batch。
placeholer机制:用于提供输入数据,placeholder相当于定义了一个位置,这个位置中的数据在程序运行中再指定。这样程序就不需要生成大量的常量来提供输入数据,而只需要将数据通过placeholder传入TensorFlow计算图。(placeholder的数据类型需要指定,且不可改变,对于维度placeholder可自动推导出,不需要指定)
----------------------------------------------------------------------------------------------------------------------------------------------------------------
一次性计算多个样例的前向传播:
x=tf.placeholder(tf.float32,shape=(3,2),name="input")
......
print(sess.run(y,feed_dict={x:[[0.7,0.9],[0.1,0.4],[0.8,0.1]]}))//feed_dict是一个字典,需要给出每个用到的placeholder的取值
损失函数:用以刻画当前预测值与真实答案之间的差距
反向传播算法:调整神经网络的取值使差距可以被缩小(下面章节介绍)