1假如一个零件的好坏是由零件的长度和零件的质量决定的,用零件的长度和质量描述每个零件的特征向量(feature vector),也就是神经网络的输入向量。我们以此来构建一个简单的三层神经网络,来获取途中的结果Y,然后设定一个阈值,如果Y大于这个阈值则合格,小于则不合格
神经网络的前向传播的tensorflow实现
import tensorflowas tf
# 定义变量
w1 = tf.Variable(tf.random_normal([2,3],stddev=1),name="w1") #初始化第一层和第二层的连线权重
w2 = tf.Variable(tf.random_normal([3,1],stddev=1),name="w2") #初始化第二层和第三层的连线权重
biases1 = tf.Variable(tf.zeros([3]),name="b1") # 隐藏层的偏向bias [ 0. 0. 0.]
biases2 = tf.Variable(tf.zeros([1]),name="b1") # 输出层的偏向bias [0.]
x = tf.constant([[0.7,0.9]]) #定义一个零件的输入向量,长度为0.7,质量为0.9
这里定义了一个2x3方差为1,均值为0的均匀分布的矩阵向量w1和3x1均匀分布的w2,当然此时我们打印w1和w2时得到的却是
<tf.Variable 'w1:0' shape=(2,3) dytype=float32_ref>,这是因为此时创建的只是一个张量(tensor)的结构,一个张量保存了三个属性:名字(name),维度(shape)和类型(type)
# 定义前向传播
# a = tf.matmul(x,w1)+biases1
# y = tf.matmul(a,w2)+biases2
tf.matmul()实现向量的点乘,a为隐藏层的值,是3x1的矩阵向量,y为输出层的值,当然此时的y仍然只是的到张量的结构,此时的w1和w2并没有被初始化,可以理解为只是结构的向前传播,得到y为1x1的张量
tensorflow的Session
那么如何让结构的前向传播转为真实数值的传播呢,这时候会引入tf.Session(会话)的概念
with tf.Session() as sess:
init_op = tf.global_variables_initializer() #初始化所有的变量
sess.run(init_op) # 运行所有的结果
print sess.run(y)
这样就会计算出输出层前向传播的值 [[-1.46060801]] ,不再是结构
完整代码:
import tensorflowas tf
# 定义变量
w1 = tf.Variable(tf.random_normal([2,3],stddev=1),name="w1")
w2 = tf.Variable(tf.random_normal([3,1],stddev=1),name="w2")
biases1 = tf.Variable(tf.zeros([3]),name="b1") # 隐藏层的偏向bias [ 0. 0. 0.]
biases2 = tf.Variable(tf.zeros([1]),name="b1") # 输出层的偏向bias [0.]
x = tf.constant([[0.7,0.9]])
# 定义前向传播
a = tf.matmul(x,w1) + biases1
y = tf.matmul(a,w2) + biases2
# 调用会话函数输出
with tf.Session()as sess:
init_op = tf.global_variables_initializer()
sess.run(init_op)
print sess.run(y)