神经网络对于输入数据进行预测时,执行的是前向传播过程,前向传播就是将输入数据与参数相乘,得到结果,是一个正向运算的过程。
假设要搭建一个下图这样的神经网络,含有两个输入特征,一个3神经元的隐藏层,一个输出
由于没有数据集,所以先瞎编一些数据(图中的权值也是瞎编的):
#瞎编两个输入特征:0.7和0.5
x = tf.constant([[0.7, 0.5]])
#接下来搭建的是含有一个3神经元的隐藏层的神经网络,所以瞎搞两组权重
#生成正态分布随机数,2*3的矩阵,因为输入特征是两个,隐藏层神经元是3个
w1 = tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))
#生成3*1的正态分布随机数,因为隐藏层神经元作为特征是3个,输出只有一个
w2 = tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))
得到了这些数据,我们开始搭建模型:
#前向传播的过程
a = tf.matmul(x, w1) #计算隐藏层
y = tf.matmul(a, w2) #计算输出
这样,模型就ojbk了,接下来我们来启动一个会话,执行运算:
#启动会话
with tf.Session() as sess:
init_op = tf.initialize_all_variables() #在使用变量前必须初始化变量
sess.run(init_op)
print(sess.run(y))
因为生成随机数时加入了seed随机数种子,所以你生成的结果应该也是3.0904665
这里的x = tf.constant([[0.7, 0.5]])表示的是一个输入,但是对于多个输入,就不方便直接写到张量里面了,我们可以使用“占位符”来表示。占位符表示这里有数据,但是还没有写进来,在会话中再写进来。先占个空位。
x = tf.placeholder(tf.float32, shape=(1, 2))
这样就定义了一个空位,里面的1表示一会喂给它一组数据,2表示有两个特征。
在会话中,使用sess.run(y, feed_dict={x: [[0.7, 0.5]]})就可以将[0.7,0.5]写入占位符,进行运算了。
完整的代码和运行结果:
但是这个程序还有个弊病,占位符的shape=(1, 2)中的1如果不知道,即我们不知道输入多少组数据怎么办。只要使用None替换掉1就好了:
这样,feed_dict中给了两组数据,都输出了正确的结果。
这样就实现了一次神经网络的前向传播过程,这个神经网络有了预测功能,但是上面数据都是瞎jb写的,所以预测出来的东西并没有什么卵用,要想让神经网络学习,必须有反向传播的过程。