Tensorflow中的广播机制
我们知道在线性代数中,两个矩阵可以相加的前提是这两个矩阵的“形状”相同,比如说,你不能将一个维度为[4,5]的矩阵(即4行5列的矩阵)和一个维度为[7,8](即7行8列的矩阵)相加,但是,有一种特殊的情况:那就是当你的其中一个操作数是一个具有单独维度的张量的时候,Tensorflow会隐式地在它的单独维度方向填满,以确保和另一个操作数的形状相匹配,所以,在Tensorflow里面,维度为[5,3]的矩阵和维度为[1,3]的矩阵相加是合法的,这叫做广播机制,这个机制继承于numpy
下面我们来通过代码深刻地理解广播机制
个人觉得理解好它挺重要的,因为后面我们在搭建一些简单的神经网络时,对每个结点的计算会用到这个机制
import tensorflow as tf
import numpy as np
x_data = np.linspace(-1,1,5)[:,np.newaxis] #生成一个5行1列的向量
xs = tf.placeholder(tf.float32,[None,1]) #[None,1]表示xs接收的列数为1,行数无所谓
Weights = tf.Variable(tf.random_normal([1,3]))
biases = tf.Variable(tf.zeros([1,3] + 0.1)
output1 = tf.matmul(xs,Weights)
output2 = output1 + biases
#把上面的output分成两个来写是为了一会方便对结果进行分析
init = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init)
print(sess.run(Weights)) #打印权重矩阵
print('\n')
sess.run(biases)
print(sess.run(output1,feed_dict={xs:x_data}))
print('\n')
print(sess.run(output2,feed_dict={xs:x_data}))
我们来看看结果:
[[ 0.4076067 1.6773933 -0.5814706]]
[[-0.4076067 -1.6773933 0.5814706 ]
[-0.20380335 -0.83869666 0.2907353 ]
[ 0. 0. 0. ]
[ 0.20380335 0.83869666 -0.2907353 ]
[ 0.4076067 1.6773933 -0.5814706 ]]
[[-0.3076067 -1.5773933 0.68147063]
[-0.10380334 -0.73869663 0.3907353 ]
[ 0.1 0.1 0.1 ]
[ 0.30380335 0.9386967 -0.19073531]
[ 0.5076067 1.7773933 -0.4814706 ]]
居然真的可以相加!是不是和常理相悖
由于我们的biases的第一个维度是1,而列数与output1矩阵相同,都是3,所以由广播机制,就在output1的每一行分别加上biases
同样的,如果biases的第二个维度为1,而行数与output1矩阵相同,那么就在output1的每一列分别加上biases
好啦,那么在下一篇博文中,我们就来一起搭建一个神经网络吧!