Как построить рекуррентный сверточный слой из R2U- Net в кератах? - PullRequest
0 голосов
/ 02 мая 2020

Я пытаюсь восстановить R2U- Net из этой бумаги . Я нашел два репозитория github ( 1 , 2 ), реализующих сеть. Я пытаюсь выписать небольшую часть сети в керасе. Проблема, с которой я сталкиваюсь, заключается в том, что когда я помещаю одинаковое количество функций в сеть, это приводит к разному количеству параметров обучения.

У меня есть три вопроса относительно этого:

  1. Я сделал ошибку в Unfolded_Recurrent_Convolutional_layer? (Если нет, то как?)

  2. В документе говорилось, что вы можете использовать либо сложение, либо сложение, но это правильно влияет на параметры тренировки?

  3. Нужна ли мне батхнормализация между 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:

Unfolded_Recurrent_Convolutional_layer

Сеть r2_ unet:

The network r2_unet

Ps. Это мой первый пост, поэтому я надеюсь, что все сделал правильно: 0, и я знаю, что лучше поместить его в al oop, но сначала я хочу понять его полностью;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...