Моя версия Keras - 2.2.5, тензор потока - 1.15, python - 3.6.
Теперь я хочу преобразовать Retin aNet в распределенную по времени сеть для обработки некоторых трехмерных данных, но я обнаружил, что когда я использую keras.layter.Timedistributed
, я нахожу, что он не может обработать слой с двумя входами , например: layers.UpsampleLike(name='P5_upsampled')([P5, C4])
Форма P5
равна (?, ?, x, y, 256)
, форма C4
равна (?, ?, a, b, 1024)
. Поскольку x,y
отличается от a,b
, а P5
необходимо добавить с C4
, поэтому мне нужно изменить размер изображения P5
. Это то, что layer.UpsamleLike()
доза. Код, который я использую, выглядит следующим образом:
P5 = keras.layers.TimeDistributed(keras.layers.Conv2D(feature_size, kernel_size=1, strides=1, padding='same'), name='C5_reduced')(C5)
P5_upsampled = keras.layers.TimeDistributed(layers.UpsampleLike(), name='P5_upsampled')([P5, C4])
и layer.UpsampleLike
:
class UpsampleLike(keras.layers.Layer):
""" Keras layer for upsampling a Tensor to be the same shape as another Tensor.
"""
def call(self, inputs, **kwargs):
source, target = inputs
target_shape = keras.backend.shape(target)
if keras.backend.image_data_format() == 'channels_first':
source = backend.transpose(source, (0, 2, 3, 1))
output = backend.resize_images(source, (target_shape[2], target_shape[3]), method='nearest')
output = backend.transpose(output, (0, 3, 1, 2))
return output
else:
return tensorflow.compat.v1.image.resize_images(source, (target_shape[1], target_shape[2]), method=tensorflow.image.ResizeMethod.NEAREST_NEIGHBOR)
Я думаю, что слой Timedistributed распаковывает входы и вводит их, поэтому я хочу, чтобы Timedistributed обработать два ввода раздельно и ввести их в layer.UpsampleLike
, как я могу это сделать?