Реализация остаточного блока в тензорном потоке
Я пытаюсь реализовать остаточную единицу Resnet v1 и v2 на основе https://arxiv.org/pdf/1512.03385.pdf и https://arxiv.org/pdf/1603.05027.pdf. Итак, вот остаточные единицы, которые я беспокоюсь о реализации в tenorflow:
И остаточная единица v2 (б) ниже:
Поэтому я изучил их реализацию в https://github.com/tensorflow/models/blob/master/official/resnet/resnet_model.py и обнаружил следующее для модуля resnet v1:
def _building_block_v1(inputs, filters, training, projection_shortcut, strides,
data_format):
'''
.........
'''
if projection_shortcut is not None:
shortcut = projection_shortcut(inputs)
shortcut = batch_norm(inputs=shortcut, training=training, data_format=data_format)
поэтому мой первый вопрос: не следует ли использовать пакетную норму после добавления и никогда не связываться с функцией идентификации h(x)
похоже на то, что было упомянуто в статье?
Во-вторых, при рассмотрении реализации модуля Resnet v2, я нашел эту реализацию:
def _building_block_v2(inputs, filters, training, projection_shortcut, strides,
data_format):
'''
........
'''
shortcut = inputs
inputs = batch_norm(inputs, training, data_format)
inputs = tf.nn.relu(inputs)
# The projection shortcut should come after the first batch norm and ReLU
# since it performs a 1x1 convolution.
if projection_shortcut is not None:
shortcut = projection_shortcut(inputs)
не должны ли мы выполнить проекцию на исходный ввод перед выполнением BN и RELU? Я спрашиваю, потому что это то, что я видел на втором изображении выше. Я думаю, мы не должны касаться пути идентификации / ярлыка...
Пожалуйста, поправьте меня, если я ошибаюсь.
Любая помощь высоко ценится!!!