1

我正在使用 TensorFlow TPU 训练模型,但是当我尝试使用 tf.contrib.tpu.rewrite 将代码转换为与 TPU 兼容的代码时,出现错误:

ValueError: 变量生成器/解码器/layer4/kernel/ 的初始化器来自控制流构造内部,例如循环或条件。在循环或条件中创建变量时,使用 lambda 作为初始值设定项

我环顾四周,似乎通常有一个 if 语句或 while 循环会导致错误。然而,我没有这些。

现在,这是变量定义(内核):

def conv1d_transpose(input, filters, kernel_size, strides, activation=None):
  kernel = tf.Variable(tf.zeros(dtype=tf.float32, shape=[kernel_size, filters, input.shape[-1].value]), name='kernel')
  output_shape = [tf.shape(input)[0], strides * tf.shape(input)[1], filters]
  net = tf.contrib.nn.conv1d_transpose(input, filter=kernel, output_shape=output_shape, stride=strides, padding='SAME')
  net = activation(net)
  return net

我多次调用该函数。这是模型函数内部调用的样子:

  with tf.name_scope("layer4"):
    net = conv1d_transpose(
        net,
        filters=15,
        kernel_size=5,
        strides=2,
        activation=tf.nn.leaky_relu)
    net = tf.concat([net, conv4e], axis=-1)
    net = tf.layers.batch_normalization(net, training=training)

还有一件事,在引发错误之前,我从 tpu.replicator 收到警告/错误:

[[{{node input1}} = TPUReplicatedInputN=1, T=DT_BOOL]] 2018-11-02 02:55:44.242495: E tensorflow/core/common_runtime/executor.cc:630] 执行器创建内核失败。未找到:没有为与节点 {{node input1}} = TPUReplicatedInputN=1, T=DT_BOOL 兼容的 CPU 设备注册的“TPUReplicatedInput”OpKernel。挂号的:

但是调试起来非常困难,因为它没有指定导致问题的节点的名称。

提前致谢。

4

0 回答 0