我想使用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)
我现在有两个问题
ValueError: Shapes TensorShape([]) and
TensorShape([Dimension(1)]) must have the same rank
提前致谢
答案 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]))
我不确定如何更优雅地重新定义问题...但希望这会让你失意!