Я пытаюсь восстановить R2U- Net из этой бумаги . Я нашел два репозитория github ( 1 , 2 ), реализующих сеть. Я пытаюсь выписать небольшую часть сети в керасе. Проблема, с которой я сталкиваюсь, заключается в том, что когда я помещаю одинаковое количество функций в сеть, это приводит к разному количеству параметров обучения.
У меня есть три вопроса относительно этого:
Я сделал ошибку в Unfolded_Recurrent_Convolutional_layer? (Если нет, то как?)
В документе говорилось, что вы можете использовать либо сложение, либо сложение, но это правильно влияет на параметры тренировки?
Нужна ли мне батхнормализация между conv + add?
Вводом является нормализованное изображение в градациях серого размера (832, 576, 1 ). Я использую TF версии 2.2.0 с python 3.7.7. Небольшая часть сети выглядит следующим образом:
import tensorflow as tf
inputs = tf.keras.layers.Input((832, 576, 1))
# block 1 ----------------------------------------------------------------------------------------
one = tf.keras.layers.Conv2D(8, [1, 1], padding="same")(inputs)
c1 = tf.keras.layers.Conv2D(8, (3, 3), activation='relu', padding="same")(one)
adition = tf.keras.layers.add([c1, one]) # Do i need to concatonate?
# do I need a batchnormalization here?
c2 = tf.keras.layers.Conv2D(8, (3, 3), activation='relu', padding="same")(adition)
adition2 = tf.keras.layers.add([c2, one]) # Do i need to concatonate?
# do I need a batchnormalization here?
c3 = tf.keras.layers.Conv2D(8, (3, 3), activation='relu', padding="same")(adition2)
# Unfolded_Recurrent_Convolutional_layer --------------------------------------------------------
c4 = tf.keras.layers.Conv2D(8, (3, 3), activation='relu', padding="same")(c3)
adition3 = tf.keras.layers.add([c4, adition2]) # Do i need to concatonate?
c5 = tf.keras.layers.Conv2D(8, (3, 3), activation='relu', padding="same")(adition3)
adition4 = tf.keras.layers.add([c5, adition2]) # Do i need to concatonate?
c6 = tf.keras.layers.Conv2D(8, (3, 3), activation='relu', padding="same")(adition4)
# Unfolded_Recurrent_Convolutional_layer2 --------------------------------------------------------
adition5 = tf.keras.layers.add([c6, one])
p1 = tf.keras.layers.MaxPooling2D(pool_size=(2, 2))(adition5)
# block 2 ----------------------------------------------------------------------------------------
two = tf.keras.layers.Conv2D(16, [1, 1], padding="same")(p1)
c7 = tf.keras.layers.Conv2D(16, (3, 3), activation='relu', padding="same")(two)
adition6 = tf.keras.layers.add([c7, two])
c8 = tf.keras.layers.Conv2D(16, (3, 3), activation='relu', padding="same")(adition6)
adition7 = tf.keras.layers.add([c8, two])
c9 = tf.keras.layers.Conv2D(16, (3, 3), activation='relu', padding="same")(adition7)
# Unfolded_Recurrent_Convolutional_layer --------------------------------------------------------
c10 = tf.keras.layers.Conv2D(16, (3, 3), activation='relu', padding="same")(c9)
adition8 = tf.keras.layers.add([c10, adition7])
c11 = tf.keras.layers.Conv2D(16, (3, 3), activation='relu', padding="same")(adition8)
adition9 = tf.keras.layers.add([c11, adition7])
c12 = tf.keras.layers.Conv2D(16, (3, 3), activation='relu', padding="same")(adition9)
# Unfolded_Recurrent_Convolutional_layer --------------------------------------------------------
adition10 = tf.keras.layers.add([c12, two])
# decoder ---------------------------------------------------------------------------------------
u1 = tf.keras.layers.Conv2DTranspose(8, (2, 2), strides=(2, 2), padding="same")(adition10)
# tf.keras.layers.UpSampling2D could also be used less computational expensive
u2 = tf.keras.layers.concatenate([u1, adition5])
# block 6 ---------------------------------------------------------------------------------------
six = tf.keras.layers.Conv2D(8, [1, 1], padding="same")(u2)
c31 = tf.keras.layers.Conv2D(8, (3, 3), activation='relu', padding="same")(six)
adition26 = tf.keras.layers.add([c31, six])
c32 = tf.keras.layers.Conv2D(8, (3, 3), activation='relu', padding="same")(adition26)
adition27 = tf.keras.layers.add([c32, six])
c33 = tf.keras.layers.Conv2D(8, (3, 3), activation='relu', padding="same")(adition27)
# Unfolded_Recurrent_Convolutional_layer -------------------------------------------------------
c34 = tf.keras.layers.Conv2D(8, (3, 3), activation='relu', padding="same")(c33)
adition28 = tf.keras.layers.add([c34, adition27])
c35 = tf.keras.layers.Conv2D(8, (3, 3), activation='relu', padding="same")(adition28)
adition29 = tf.keras.layers.add([c35, adition27])
c36 = tf.keras.layers.Conv2D(8, (3, 3), activation='relu', padding="same")(adition29)
# Unfolded_Recurrent_Convolutional_layer -------------------------------------------------------
p6 = tf.keras.layers.add([c36, six])
c55 = tf.keras.layers.Conv2D(1, (1, 1), activation="sigmoid", padding='same')(p6)
model = tf.keras.models.Model(inputs=inputs, outputs=c55)
model.compile(optimizer="adam", loss="binary_crossentropy", metrics=["accuracy"])
model.summary()
Очень хороший пост в сети: ссылка
Добавлены некоторые фотографии сети:
Unfolded_Recurrent_Convolutional_layer:
Сеть r2_ unet:
Ps. Это мой первый пост, поэтому я надеюсь, что все сделал правильно: 0, и я знаю, что лучше поместить его в al oop, но сначала я хочу понять его полностью;)