对于Tensorflow中dot()的运用以及对batch_dot()的理解

#dot
dot(x,y)
#求两个张量的乘积。当试图计算两个N阶张量的乘积时,与Theano行为相同
#如:(2,3).(4,3,5) =  (2,4,5)

x = K.placeholder(shape=(2,3))
y = K.placeholder(shape=(3,4))
xy = K.dot(x,y)
xy
#输出为:

x = K.placeholder(shape=(32,28,3))
y = K.placeholder(shape=(3,4))
xy = K.dot(x,y)
xy
#输出为:

#Theano_like的行为示例
x = K.random_uniform_variable(shape=(2,3),low=0,hight=1)
y = K.ones((4,3,5))
xy = K.dot(x,y)
K.int_shape(xy)
#输出为:(2,4,5)

 

 


#batch_dot
batch_dot(x,y,axes=None)
#按批进行张量乘法,该函数用于计算x和y的点积,其中x和y都是成batch出现的数据。
#即它的数据shape形如(batch_size,:)。
#batch_dot将产生比输入张量维度低的张量,如果张量的维度被减至1,则通过expand_dims保证其维度至少为2 
#例如,假设x = [[1, 2],[3,4]] , y = [[5, 6],[7, 8]],则batch_dot(x, y, axes=1) = [[17, 53]],
#即x.dot(y.T)的主对角元素,此过程中我们没有计算过反对角元素的值

#对batch_dot的理解
x1 = tf.convert_to_tensor([[1,2,3],[4,5,6]])
x2 = tf.convert_to_tensor([[1,2,3],[4,5,6]])
K.batch_dot(x1,x2,axes=1).numpy()
#输出为:array([[14],
#      [77]], dtype=int32)

K.batch_dot(x1,x2,axes=0).numpy()
#输出为:array([[17],
#              [29],
#             [45]], dtype=int32)

#实际上其功能相当于:先将矩阵进行对位乘法,然后再按照axes轴进行聚合加法。
#验证代码如下:

tf.reduce_sum(tf.multiply(x1 , x2) , axis=1).numpy()
#输出为:array([14, 77], dtype=int32)

tf.reduce_sum(tf.multiply(x1 , x2) , axis=0).numpy()
#输出为:array([17, 29, 45], dtype=int32)

 

 

#对于输出shape 的推导:
#假设x是一个shape为(100,20)的tensor,
#y是一个shape为(100,30,20)的tensor,
#假设axes=(1,2),则输出tensor的shape通过循环x.shape和y.shape确定:
#x.shape[0]:值为100,加入到输入shape里
#x.shape[1]:20,不加入输出shape里,因为该维度的值会被求和(dot_axes[0]=1)
#y.shape[0]:值为100,不加入到输出shape里,y的第一维总是被忽略
#y.shape[1]:30,加入到输出shape里
#y.shape[2]:20,不加到output shape里,y的第二个维度会被求和(dot_axes[1]=2)

#结果为(100, 30)

x_batch = K.ones(shape=(32,20,1))
y_batch = K.ones(shape=(32,30,20))
xy_batch_dot = K.batch_dot(x_batch,y_batch,axes=[1,2])
K.int_shape(xy_batch_dot)
#输出为:(32,1,30)

#模拟输出shape的过程如下:
#先加入32,由于axes[0]=1,所以不加入20,加入1,跳过y的第一维,加入30,由于axes[1]=2,所以不加入20
 

你可能感兴趣的:(Tensorflow)