无法为Tensor占位符提供形状的值

时间:2019-01-29 01:15:10

标签: python tensorflow

我正在使用TensorFlow中的3D点云数据训练模型。我的批处理大小为64,因此TensorFlow希望收到64个3D点的批处理,例如:(64,1024,3)。当我运行训练代码时:

feed_dict = {ops['points_pl']: augmented_data,
                     ops['labels_pl']: current_label[start_idx:end_idx],
                     ops['w_pl']: gmm.weights_,
                     ops['mu_pl']: gmm.means_,
                     ops['sigma_pl']: np.sqrt(gmm.covariances_),
                     ops['is_training_pl']: is_training, }
        summary, step, _, loss_val, pred_val = sess.run([ops['merged'], ops['step'],
                                                         ops['train_op'], ops['loss'], ops['pred']],
                                                        feed_dict=feed_dict)

在最后一批中,因为剩余数据少于64,我收到此错误:

 ValueError: Cannot feed value of shape (36, 1024, 3) for Tensor 'Placeholder_4:0', which has shape '(64, 1024, 3)'

当尝试小于64的批处理时,我尝试手动添加数据,但这会显着降低性能。当我将批处理大小设置为1,2,4时,它可以正常工作,但运行速度非常慢。如何有效地解决这个问题? TF是否有办法识别这种情况并继续训练而不会出错?

1 个答案:

答案 0 :(得分:1)

您不需要精确定义批次尺寸的大小。相反,您将None作为该尺寸的大小。您可以定义占位符,例如:

n1 = 1024
n2 = 3
ops['points_pl'] = tf.placeholder(tf.float32, [None, n1, n2]) 
ops['labels_pl'] = tf.placeholder(tf.float32, [None])
然后,

Tensorflow将允许您馈入这些占位符数组,而对第一维没有任何限制。这解决了最终批次的问题,并且在推断期间(当您可能希望将模型应用于与批次大小不同的输入数量时)也很有用。