ТенсорФлоу ТПУ | Инициализатор для переменной из конструкции потока управления
Я использую TPU TensorFlow для обучения модели, но когда я пытаюсь преобразовать код в TPU, совместимый с помощью tf.contrib.tpu.rewrite, я получаю ошибку:
ValueError: Инициализатор для генератора переменных / декодера /layer4/kernel/ находится внутри конструкции потока управления, такой как цикл или условное выражение. При создании переменной внутри цикла или условного выражения, используйте лямбду в качестве инициализатора.
Я оглянулся, и кажется, что обычно есть оператор 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 tenorflowflow/core/common_runtime/executor.cc:630] Исполнителю не удалось создать ядро. Не найдено: нет зарегистрированного OpKernel "TPUReplicatedInput" для устройств ЦП, совместимых с узлом {{node input1}} = TPUReplicatedInputN=1, T=DT_BOOL . Дата регистрации:
Однако это довольно сложно для отладки, так как в нем не указывается имя узла, вызывающего проблему.
Заранее спасибо.