【问题标题】:Cannot convert partially known tensor in TensorFlow/TFLearn无法在 TensorFlow/TFLearn 中转换部分已知的张量
【发布时间】:2016-11-15 19:22:02
【问题描述】:

我是 TensorFlow 的初学者,但仍在试图弄清楚它是如何工作的,所以我不确定这个错误是我的架构问题还是更基本的问题 - 我正在尝试训练一个连体神经网络(我们将左右输入输入到具有相同权重的左右神经网络中,并尝试将其映射到如果输入相似则距离小、如果输入不同则距离大的特征向量)。

我得到的错误发生在回归步骤:

  File "siamese.py", line 59, in <module>
    network = regression(y_pred, optimizer='adam',
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/tflearn/models/dnn.py", line 63, in __init__
    best_val_accuracy=best_val_accuracy)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/tflearn/helpers/trainer.py", line 120, in __init__
    clip_gradients)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/tflearn/helpers/trainer.py", line 646, in initialize_training_ops
    ema_num_updates=self.training_steps)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/tflearn/summaries.py", line 236, in add_loss_summaries
    loss_averages_op = loss_averages.apply([loss] + other_losses)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/tensorflow/python/training/moving_averages.py", line 292, in apply
    colocate_with_primary=(var.op.type == "Variable"))
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/tensorflow/python/training/slot_creator.py", line 106, in create_zeros_slot
    val = array_ops.zeros(primary.get_shape().as_list(), dtype=dtype)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/tensorflow/python/ops/array_ops.py", line 1071, in zeros
    shape = ops.convert_to_tensor(shape, dtype=dtypes.int32, name="shape")
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/tensorflow/python/framework/ops.py", line 628, in convert_to_tensor
    ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/tensorflow/python/framework/constant_op.py", line 198, in _tensor_shape_tensor_conversion_function
    "Cannot convert a partially known TensorShape to a Tensor: %s" % s)
ValueError: Cannot convert a partially known TensorShape to a Tensor: (?,)

如果批量大小的第一个维度需要为None,我不知道如何解决此问题(如果我错了,请纠正我)。

相关部分代码如下:

BATCH_SIZE=100
def contrastive_loss(y_pred, y_true, margin=1.0):
    return tf.mul(1-y_true, tf.square(y_pred)) + tf.mul(y_true, tf.square(tf.maximum((margin-y_pred),0)))

## Load dataset
f = h5py.File('./data/paired_training_data.hdf','r')
X1 = f["train_X1"]
X2 = f["train_X2"]
Y = f["train_Y_paired"]

## Inputs: 1 example (phoneme pair), dropout probability
inp_sound1 = input_data(shape=[None, 1, N_MFCC_CHANNELS, N_IN_CHANNELS])
networkL = conv_1d(inp_sound1, reuse=None, scope="conv1d")
networkL = max_pool_1x6(networkL)
networkL = fully_connected(networkL, n_units=N_FULLY_CONN, activation='relu', scope="fc1")
networkL = dropout(networkL, .5) # unshared?
networkL = fully_connected(networkL, n_units=N_FULLY_CONN, activation='relu', scope="fc2")

inp_sound2 = input_data(shape=[None, 1, N_MFCC_CHANNELS, N_IN_CHANNELS])
networkR = conv_1d(inp_sound2, reuse=True, scope="conv1d")
networkR = max_pool_1x6(networkR)
networkR = fully_connected(networkR, n_units=N_FULLY_CONN, activation='relu', reuse=True, scope="fc1")
networkR = dropout(networkR, .5)
networkR = fully_connected(networkR, n_units=N_FULLY_CONN, activation='relu', reuse=True, scope="fc2")

l2_loss = tf.reduce_sum(tf.square(tf.sub(networkL, networkR)), 1)
y_pred = tf.sqrt(l2_loss)
#y_true = input_data(shape=[None])

## Training
network = regression(y_pred, optimizer='adam',
            loss=contrastive_loss, learning_rate=0.0001, to_one_hot=False)
model = tflearn.DNN(network, tensorboard_verbose=0)
model.fit([X1, X2], Y, n_epoch=10, batch_size=BATCH_SIZE, show_metric=True, validation_set=0.1)

任何帮助——尤其是了解如何在未来自行调试这些问题——将不胜感激!

【问题讨论】:

  • 我将首先将reuse=None 更改为reuse=True(或False)。你可以强制给定BATCH_SIZE,在任何地方用BATCH_SIZE替换None
  • @sygi 我设置了第一层reuse=None,因为我收到了一个错误,即范围“conv1d”还不存在——不过,第二层确实有reuse=True。如果这仍然是错误的方法,请告诉我。
  • 另外,如果我用BATCH_SIZE 替换None,TFLearn automatically appends 第一个维度None(这样我的4D 向量变成5D,然后它不再适用于conv 层)。
  • 尝试删除None,然后呢?我的猜测是它总是附加None,如果你有两个它会抱怨。就reuse 而言,此参数需要bool(请参阅docs)——None 可能会用作False,但我会对其进行更改以确保它不是问题。
  • 遗憾的是,删除 None 仍然会产生相同的错误。

标签: tensorflow tflearn


【解决方案1】:

看起来 TensorFlow 无法推断出您的 contrastive_loss 的形状。如果您事先知道其输出形状,请尝试在您的 contrastive_loss 函数中调用 set_shape

def contrastive_loss(y_pred, y_true, margin=1.0):
  loss = tf.mul(1-y_true, tf.square(y_pred)) + tf.mul(y_true, tf.square(tf.maximum((margin-y_pred),0)))
  loss.set_shape([...])
  return loss

【讨论】:

  • 我尝试将损失的形状和y_pred 的形状(因为它抱怨没有它)设置为[BATCH_SIZE,],但这会导致更多的不匹配,我不知道如何解决 - - Adam/ScalarSummary 抛出 tags and values not the same shape: [] != [100] 的错误。
  • 我猜y_pred的形状不会是[BATCH_SIZE,],否则实际数据没有维度。
  • 对不起,你是什么意思?我假设它只是 BATCH_SIZE 标量(0维数)的向量? y_pred 只需为左右网络输出的向量之间的距离即可。
  • 如果是BATCH_SIZE标量的向量,那么它的形状应该是[BATCH_SIZE, 1]
  • 它仍然有同样的Adam/ScalarSummary 错误,现在是[] != [100,1]
猜你喜欢
  • 2016-05-19
  • 2018-04-23
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多