我正在使用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}}兼容的CPU设备的'TPUReplicatedInput'OpKernel = TPUReplicatedInputN = 1,T = DT_BOOL 。已注册:
但是,由于它没有指定导致问题的节点的名称,因此很难调试。
谢谢。