两层简单神经网络-----前向传播
1、前向传播就是搭建模型的计算过程,让模型具有推理能力,可以针对一组输入给出相应的输出。
2、推导
神经网络共有几层(或当前是第几层网络)都是指的计算层,输入不是计算层,所以a为第一层网络,a是一个一行三列矩阵。
我们把每层输入乘以线上的权重w,这样用矩阵可以计算出y了。
a=tf.matmul(X,W1)
y=tf.matmul(a,W2)
3、实现
由于需要计算结果,就要用with结构实现,所有变量初始化过程、计算过程都要放到sess.run函数中。对于变量初始化,我们在sess.run中写入tf.global_variable_initializer实现对所有变量初始化,也就是赋初值。对于计算图中的运算,我们直接把运算节点填入sess.run即可,比如要计算y,直接写sess.run(y)即可。
在实际应用中,我们可以一次喂入一组或多组输入,让神经网络计算输出y,可以先用tf.placeholder给输入占位。如果一次喂一组数据,shape的第一维位置写1,第二维位置要看有几个输入特征;如果一次喂多组数据,shape的第一维位置可以写None表示先空着,第二维位置写有几个输入特征。这样在feed_dict中可以喂入若干组体积重量了。
4、举例
这是一个实现神经网络前向传输过程,网络可以自动推理出输出y的值。
1)用placeholder实现输入定义(sess.run中未入一组数据)的情况,第一组喂体积0.7、重量0.5
import tensorflow as tf#引入模块
#定义输入
x = tf.placeholder(tf.float32,shape=(1,2))#shape=(1,2)表示一组数据,2个特征
#定义随机生成参数(变量)
w1 = tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))#seed=1表示生成的随机数一致
w2 = tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))
#定向前向传播过程
a = tf.matmul(x,w1)
y = tf.matmul(a,w2)
#用会话计算结果
with tf.Session() as sess:
init_op = tf.global_variables_initializer()
sess.run(init_op)#变量初始化,在sess.run函数中汇总所有待优化变量
print("y:",sess.run(y,feed_dict={x:[[0.7,0.5]]}))#x的值是一个1行2列的二维矩阵
运行结果
2)用placeholder实现输入定义(sess.run中喂入多组数据)的情况
各组体积、重量分别为[0.7,0.5]、[0.2,0.3]、[0.3,0.4]、[0.4,0.5]
import tensorflow as tf#引入模块
#定义输入
x = tf.placeholder(tf.float32,shape=(None,2))#shape=(None,2)表示多少组数据不知道,有2个特征
#定义随机生成参数(变量)
w1 = tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))#seed=1表示生成的随机数一致
w2 = tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))
#定向前向传播过程
a = tf.matmul(x,w1)
y = tf.matmul(a,w2)
#用会话计算结果
with tf.Session() as sess:
init_op = tf.global_variables_initializer()
sess.run(init_op)#变量初始化,在sess.run函数中汇总所有待优化变量
print("y:",sess.run(y,feed_dict={x:[[0.7,0.5],[0.2,0.3],[0.3,0.4],[0.4,0.5]]}))#x的值是一个4行2列的二维矩阵
print("w1:",sess.run(w1))#查看随机生成的参数
print("w2",sess.run(w2))
运行结果:
续:https://blog.csdn.net/qq_38549584/article/details/104584269
来源:CSDN
作者:小菜鸟也想飞起来
链接:https://blog.csdn.net/qq_38549584/article/details/104575760