我正在使用 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。挂号的:
但是调试起来非常困难,因为它没有指定导致问题的节点的名称。
提前致谢。