张量流中的三维旋转矩阵

时间:2017-03-21 20:26:43

标签: matrix tensorflow

我想使用Tensorflow学习3D旋转矩阵的参数。因此,我按以下方式定义了旋转矩阵

g = tf.Graph()
with g.as_default():
  #rotations

  thetax =  tf.Variable(tf.zeros([1]))
  thetax =  tf.Variable(tf.zeros([1]))
  thetay =  tf.Variable(tf.zeros([1]))
  p =  tf.placeholder(tf.float32, [3])
  rotation_matrix_x = tf.pack([tf.constant(1.0),tf.constant(0.0),tf.constant(0.0),
                               tf.constant(0.0),tf.cos(thetax), -tf.sin(thetax),
                               tf.constant(0.0),tf.sin(thetax), tf.cos(thetax)])
  rotation_matrix_y = tf.pack([
                          tf.cos(thetax),tf.constant(0.0), -tf.sin(thetax),
                          tf.constant(1.0),tf.constant(0.0),tf.constant(0.0),
                          tf.sin(thetax),0, tf.cos(thetax)])


 rotation_matrix_z = tf.pack([
                              tf.cos(thetax), -tf.sin(thetax),tf.constant(0.0),  
                              tf.sin(thetax), tf.cos(thetax),tf.constant(0.0),
                              tf.constant(1.0),tf.constant(0.0),tf.constant(0.0)])
 rotation_matrix_x = tf.reshape(rotation_matrix_x, (3,3))
 rotation_matrix_y = tf.reshape(rotation_matrix_y, (3,3))
 rotation_matrix_z = tf.reshape(rotation_matrix_z, (3,3))
 rotated = tf.mult(tf.mult(rotation_matrix_x,tf.mult(rotation_matrix_y,rotation_matrix_z) ,p)

我现在有两个问题

  1. 我收到一条错误消息:ValueError: Shapes TensorShape([]) and TensorShape([Dimension(1)]) must have the same rank
  2. 有一个 更优雅的方式来定义没有的旋转矩阵 介绍任何额外的自由度?例如,法向矢量+角度是完全可以接受的。
  3. 提前致谢

2 个答案:

答案 0 :(得分:3)

我最近遇到了同样的问题。这是我目前的解决方案:

one  = tf.ones_like(cos_rot_x,  dtype=tf.float32)    
zero = tf.zeros_like(cos_rot_x, dtype=tf.float32)

rot_x = tf.stack([tf.concat([one,        zero,      zero],      axis=1),
                  tf.concat([zero,       cos_rot_x, sin_rot_x], axis=1),
                  tf.concat([zero,      -sin_rot_x, cos_rot_x], axis=1)], axis=1)

rot_y = tf.stack([tf.concat([cos_rot_y,  zero,     -sin_rot_y], axis=1),
                  tf.concat([zero,       one,       zero],      axis=1),
                  tf.concat([sin_rot_y,  zero,      cos_rot_y], axis=1)], axis=1)

rot_z = tf.stack([tf.concat([cos_rot_z,  sin_rot_z, zero],      axis=1),
                  tf.concat([-sin_rot_z, cos_rot_z, zero],      axis=1),
                  tf.concat([zero,       zero,      one],       axis=1)], axis=1)

rot_matrix = tf.matmul(rot_z, tf.matmul(rot_y, rot_x))

请注意,在此代码段cos_rot_x中有形状(batchsize,1),因此您可以在转换期间保留批量维度。

答案 1 :(得分:2)

对于问题(1) - 形状错误 - 我认为问题是由于您试图将标量(例如tf.constant(0.0))与单元素向量打包在一起(即{{1} })。您应该能够通过将变量重新定义为标量来解决此问题:

tf.Variable(tf.zeros([1]))

我不确定如何更优雅地重新定义问题...但希望这会让你失意!