Я пытаюсь преобразовать эту реализацию Capsule-Forensics PyTorch в TensorFlow. Я думал, что мне удалось преобразовать модель, когда мне удалось скомпилировать модель и просмотреть ее сводку, как показано ниже.
ValueError: Dimensions must be equal, but are 32 and 4 for '{{node margin_loss/mul}} = Mul[T=DT_FLOAT](IteratorGetNext:1, margin_loss/Square)' with input shapes: [32,2], [4,2].
Я распечатал тензоры для отладки и думаю, что проблема в слое изменения формы (класс View) в конце основных капсул, как показано ниже. Форма входных данных в представление: (32, 1, 1), где 32 — размер пакета. После преобразования в (-1, 8) результат будет (4, 8). Является ли моя реализация слоя изменения формы неправильной или ошибка связана с формой входного тензора после одномерных сверточных слоев? Я пытался установить фиксированный размер пакета, но безрезультатно. Может быть, я что-то упустил из виду?
Для вашего удобства ниже я включил класс View из исходной версии Capsule-Forensics в PyTorch, а также мою реализацию модели, включая ее слои, в TensorFlow.
Просмотр класса Capsule-Forensics в Pytorch:
class StatsNet(Layer):
def __init__(self):
super(StatsNet, self).__init__()
def call(self, x):
# Reshape x to have shape [batch_size, height, width, channels]
height = x.shape[1]
width = x.shape[2]
channels = x.shape[3]
x_reshaped = tf.reshape(x, [-1, height, width * channels]) # Dynamic batch size
print("\nx reshaped in StatsNet");
print(x_reshaped)
# Calculate mean and standard deviation along the last dimension
mean = tf.reduce_mean(x_reshaped, axis=-1)
std = tf.math.reduce_std(x_reshaped, axis=-1)
# Stack mean and std along a new dimension
stats = tf.stack([mean, std], axis=1)
print("\nstats output");
print(stats)
return stats
Основные слои и слои капсулы классов в моей реализации TF. Они соответствуют классам FeatureExtractor и RoutingLayer исходной реализации PyTorch соответственно:
Я пытаюсь преобразовать эту реализацию Capsule-Forensics PyTorch в TensorFlow. Я думал, что мне удалось преобразовать модель, когда мне удалось скомпилировать модель и просмотреть ее сводку, как показано ниже. [code]Model: "model_CapsuleForensics-CustomVGG16_S_UNIWARD_04bpp" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input (InputLayer) [(None, 256, 256, 1)] 0 _________________________________________________________________ conv0 (Conv2D) (None, 256, 256, 1) 26 _________________________________________________________________ vgg16_block1_conv1 (Conv2D) (None, 256, 256, 64) 640 _________________________________________________________________ vgg16_block1_conv2 (Conv2D) (None, 256, 256, 64) 36928 _________________________________________________________________ vgg16_block1_pool (MaxPoolin (None, 128, 128, 64) 0 _________________________________________________________________ vgg16_block2_conv1 (Conv2D) (None, 128, 128, 128) 73856 _________________________________________________________________ vgg16_block2_conv2 (Conv2D) (None, 128, 128, 128) 147584 _________________________________________________________________ vgg16_block2_pool (MaxPoolin (None, 64, 64, 128) 0 _________________________________________________________________ vgg16_block3_conv1 (Conv2D) (None, 64, 64, 256) 295168 _________________________________________________________________ vgg16_block3_conv2 (Conv2D) (None, 64, 64, 256) 590080 _________________________________________________________________ vgg16_block3_conv3 (Conv2D) (None, 64, 64, 256) 590080 _________________________________________________________________ vgg16_block3_pool (MaxPoolin (None, 32, 32, 256) 0 _________________________________________________________________ primary_caps (PrimaryCaps) (None, 10, 8) 1584210 _________________________________________________________________ class_caps (ClassCaps) (None, 2, 4) 640 _________________________________________________________________ y (Lambda) (None, 2) 0 ================================================================= Total params: 3,319,212 Trainable params: 1,583,070 Non-trainable params: 1,736,142 _________________________________________________________________ [/code] Однако при попытке обучить его произошла ошибка: [code]ValueError: Dimensions must be equal, but are 32 and 4 for '{{node margin_loss/mul}} = Mul[T=DT_FLOAT](IteratorGetNext:1, margin_loss/Square)' with input shapes: [32,2], [4,2]. [/code] Я распечатал тензоры для отладки и думаю, что проблема в слое изменения формы (класс View) в конце основных капсул, как показано ниже. Форма входных данных в представление: (32, 1, 1), где 32 — размер пакета. После преобразования в (-1, 8) результат будет (4, 8). Является ли моя реализация слоя изменения формы неправильной или ошибка связана с формой входного тензора после одномерных сверточных слоев? Я пытался установить фиксированный размер пакета, но безрезультатно. Может быть, я что-то упустил из виду? [code]x reshaped in StatsNet Tensor("model_CapsuleForensics-CustomVGG16_S_UNIWARD_04bpp/primary_caps/sequential_7/stats_net_7/Reshape:0", shape=(32, 32, 512), dtype=float32)
view output Tensor("model_CapsuleForensics-CustomVGG16_S_UNIWARD_04bpp/primary_caps/sequential_7/view_7/Reshape:0", shape=(4, 8), dtype=float32) [/code] Для вашего удобства ниже я включил класс View из исходной версии Capsule-Forensics в PyTorch, а также мою реализацию модели, включая ее слои, в TensorFlow. Просмотр класса Capsule-Forensics в Pytorch: [code]class View(nn.Module): def __init__(self, *shape): super(View, self).__init__() self.shape = shape
def forward(self, input): return input.view(self.shape) [/code] Просмотр класса в моей реализации TensorFlow: [code]class View(Layer): def __init__(self, shape): super(View, self).__init__() self.shape = shape
def call(self, inputs): print("\nview inputs") print(inputs) output = tf.reshape(inputs, self.shape) print("\nview output") print(output) return output [/code] Класс StatsNet в моей реализации TF: [code]class StatsNet(Layer): def __init__(self): super(StatsNet, self).__init__()
def call(self, x): # Reshape x to have shape [batch_size, height, width, channels] height = x.shape[1] width = x.shape[2] channels = x.shape[3]
print("\nx reshaped in StatsNet"); print(x_reshaped)
# Calculate mean and standard deviation along the last dimension mean = tf.reduce_mean(x_reshaped, axis=-1) std = tf.math.reduce_std(x_reshaped, axis=-1)
# Stack mean and std along a new dimension stats = tf.stack([mean, std], axis=1)
print("\nstats output"); print(stats)
return stats [/code] Основные слои и слои капсулы классов в моей реализации TF. Они соответствуют классам FeatureExtractor и RoutingLayer исходной реализации PyTorch соответственно: [code]class PrimaryCaps(Layer): def __init__(self, num_capsules): super(PrimaryCaps, self).__init__() self.num_capsules = num_capsules
# Do not transpose if len(outputs.shape) == 3: pass else: outputs = tf.expand_dims(outputs, axis=0)
print("\noutputs of class capsule") print(outputs) return outputs [/code] Моя реализация модели в TF с использованием настроенного VGG16 для извлечения признаков: [code]def CapsuleForensics(input_shape, n_class, name="CapsuleForensics"): tf.keras.backend.clear_session()
# --- Encoder --- # Input x = Input(shape=input_shape, name='input')