Просто хочу упомянуть, что я получаю похожую ошибку.
Это заставляет меня поверить, что в тензорном потоке должна быть ошибка (также получая "16" в качестве первой формы вывода)
Я уже дал «batch_size» «1» в функции предсказания просто для того, чтобы сделать shure.
К сожалению, это никак не влияет.
Может быть, он получает партию из 16 из ТПУ?
Это может привести к тому, что self.results будет неожиданным в этом месте: https://github.com/tensorflow/tensorflow/blob/e5bf8de410005de06a7ff5393fafdf832ef1d4ad/tensorflow/python/keras/engine/training_utils.py#L346
Но в настоящее время я не знаю, как это исправить, не исправляя сам тензорный поток.
РЕДАКТИРОВАТЬ:
Это чертовски сложно отладить ... в настоящее время я думаю, что ошибка где-то рядом с этим:
https://github.com/tensorflow/tensorflow/blob/e5bf8de410005de06a7ff5393fafdf832ef1d4ad/tensorflow/python/keras/engine/training_v2_utils.py#L262
Так как он каким-то образом обрабатывает форму вывода, основанную на «num_replicas_in_syn c».
Но не может понять это без отладки.
Некоторый Debuginfo с pdb:
(Pdb) b /opt/conda/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/training_v2_utils.py:262
Breakpoint 7 at /opt/conda/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/training_v2_utils.py:262
(Pdb) c
> /opt/conda/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/training_v2_utils.py(262)_aggregate_predict_results()
-> nested_outs = batch_outs[i * num_replicas:i * num_replicas + num_replicas]
(Pdb) print(len(batch_outs))
8
(Pdb) print(batch_outs[0].shape)
(2, 7, 355, 235, 1)
«2» уже неправильно для меня в начале, не знаю, почему это происходит (позже) изменяется на 16, что приводит к «batch_outs» с несколькими дубликатами)
Редактировать снова (28.04.2020):
Проблема, кажется, возникла раньше:
(Pdb) b /opt/conda/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training_v2.py:128
Breakpoint 3 at /opt/conda/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training_v2.py:128
(Pdb) c
> /opt/conda/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training_v2.py(128)run_one_epoch()
-> batch_outs = execution_function(iterator)
(Pdb) n
> /opt/conda/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training_v2.py(159)run_one_epoch()
-> if mode != ModeKeys.PREDICT:
(Pdb) print(len(batch_outs))
16
(Pdb) print(batch_outs[14].shape)
(2, 7, 355, 235, 1)
(Pdb) np.array_equal(batch_outs[14],batch_outs[15])
True
Отредактируйте снова (29.04.2020):
В качестве альтернативы, похоже, работает следующее:
from tensorflow.python.tpu import device_assignment as device_assignment_lib
tf.keras.backend.set_floatx('float32')
tpu = tf.distribute.cluster_resolver.TPUClusterResolver() # TPU detection
tf.config.experimental_connect_to_cluster(tpu)
topology = tf.tpu.experimental.initialize_tpu_system(tpu)
device_assignment = device_assignment_lib.DeviceAssignment(
topology, core_assignment=device_assignment_lib.
SINGLE_CORE_ASSIGNMENT)
strategy = tf.distribute.experimental.TPUStrategy(tpu,device_assignment)
Конечно, это не Лучшее решение, так как вы используете только одно ядро. По крайней мере, это подтверждает мое предположение, что тензор потока не правильно фильтрует результаты со всех ядер.