Я пытаюсь преобразовать модель Keras в PyTorch. Теперь это касается UpSampling2D из keras. Когда я использовал torch.nn.UpsamplingNearest2d в pytorch, поскольку значение по умолчанию UpSampling2D в keras равно nearest, я получил разные противоречивые результаты. Пример выглядит следующим образом:
Поведение Кераса
In [3]: t1 = tf.random_normal([32, 8, 8, 512]) # as we have channels last in keras
In [4]: u_s = tf.keras.layers.UpSampling2D(2)(t1)
In [5]: u_s.shape
Out[5]: TensorShape([Dimension(32), Dimension(16), Dimension(16), Dimension(512)])
Таким образом, выходная форма (32,16,16,512). Теперь давайте сделаем то же самое с PyTorch.
Поведение PyTorch
In [2]: t1 = torch.randn([32,512,8,8]) # as channels first in pytorch
In [3]: u_s = torch.nn.UpsamplingNearest2d(2)(t1)
In [4]: u_s.shape
Out[4]: torch.Size([32, 512, 2, 2])
Здесь выходная форма (32,512,2,2) по сравнению с (32,512,16,16) из keras.
Итак, как мне получить эквивалентные результаты Keras в PyTorch. Спасибо






В keras для повышения дискретизации используется коэффициент масштабирования. ИСТОЧНИК.
tf.keras.layers.UpSampling2D(size, interpolation='nearest')
size: Int, or tuple of 2 integers. The upsampling factors for rows and columns.
И PyTorch обеспечивает как прямой выходной размер, так и коэффициент масштабирования. ИСТОЧНИК.
torch.nn.UpsamplingNearest2d(size=None, scale_factor=None)
To specify the scale, it takes either the size or the scale_factor as its constructor argument.
Итак, в вашем случае
# scaling factor in keras
t1 = tf.random.normal([32, 8, 8, 512])
tf.keras.layers.UpSampling2D(2)(t1).shape
TensorShape([32, 16, 16, 512])
# direct output size in pytorch
t1 = torch.randn([32,512,8,8]) # as channels first in pytorch
torch.nn.UpsamplingNearest2d(size=(16, 16))(t1).shape
# or torch.nn.UpsamplingNearest2d(size=16)(t1).shape
torch.Size([32, 512, 16, 16])
# scaling factor in pytorch.
torch.nn.UpsamplingNearest2d(scale_factor=2)(t1).shape
torch.Size([32, 512, 16, 16])