Последний конвективный слой в архитектуре U-net ожидает неправильного измерения - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь реализовать u-net в Keras, но я получил эту ошибку при обучении модели (call model.fit ()):

ValueError: Ошибка при проверке цели: ожидалось, что conv2d_302 будет иметь форму> (Нет, 1, 128, 640), но получил массив с формой (360, 1, 128, 128)

И вывод модели.summary ():


Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_19 (InputLayer)           (None, 1, 128, 128)  0                                            
__________________________________________________________________________________________________
conv2d_303 (Conv2D)             (None, 32, 128, 128) 320         input_19[0][0]                   
__________________________________________________________________________________________________
conv2d_304 (Conv2D)             (None, 32, 128, 128) 9248        conv2d_303[0][0]                 
__________________________________________________________________________________________________
max_pooling2d_83 (MaxPooling2D) (None, 32, 64, 64)   0           conv2d_304[0][0]                 
__________________________________________________________________________________________________
conv2d_305 (Conv2D)             (None, 64, 64, 64)   18496       max_pooling2d_83[0][0]           
__________________________________________________________________________________________________
conv2d_306 (Conv2D)             (None, 64, 64, 64)   36928       conv2d_305[0][0]                 
__________________________________________________________________________________________________
max_pooling2d_84 (MaxPooling2D) (None, 64, 32, 32)   0           conv2d_306[0][0]                 
__________________________________________________________________________________________________
conv2d_307 (Conv2D)             (None, 128, 32, 32)  73856       max_pooling2d_84[0][0]           
__________________________________________________________________________________________________
conv2d_308 (Conv2D)             (None, 128, 32, 32)  147584      conv2d_307[0][0]                 
__________________________________________________________________________________________________
max_pooling2d_85 (MaxPooling2D) (None, 128, 16, 16)  0           conv2d_308[0][0]                 
__________________________________________________________________________________________________
conv2d_309 (Conv2D)             (None, 256, 16, 16)  295168      max_pooling2d_85[0][0]           
__________________________________________________________________________________________________
conv2d_310 (Conv2D)             (None, 256, 16, 16)  590080      conv2d_309[0][0]                 
__________________________________________________________________________________________________
max_pooling2d_86 (MaxPooling2D) (None, 256, 8, 8)    0           conv2d_310[0][0]                 
__________________________________________________________________________________________________
conv2d_311 (Conv2D)             (None, 512, 8, 8)    1180160     max_pooling2d_86[0][0]           
__________________________________________________________________________________________________
conv2d_312 (Conv2D)             (None, 512, 8, 8)    2359808     conv2d_311[0][0]                 
__________________________________________________________________________________________________
conv2d_transpose_29 (Conv2DTran (None, 256, 16, 16)  524544      conv2d_312[0][0]                 
__________________________________________________________________________________________________
concatenate_29 (Concatenate)    (None, 256, 16, 32)  0           conv2d_transpose_29[0][0]        
                                                                 conv2d_310[0][0]                 
__________________________________________________________________________________________________
conv2d_313 (Conv2D)             (None, 256, 16, 32)  590080      concatenate_29[0][0]             
__________________________________________________________________________________________________
conv2d_314 (Conv2D)             (None, 256, 16, 32)  590080      conv2d_313[0][0]                 
__________________________________________________________________________________________________
conv2d_transpose_30 (Conv2DTran (None, 128, 32, 64)  131200      conv2d_314[0][0]                 
__________________________________________________________________________________________________
concatenate_30 (Concatenate)    (None, 128, 32, 96)  0           conv2d_transpose_30[0][0]        
                                                                 conv2d_308[0][0]                 
__________________________________________________________________________________________________
conv2d_315 (Conv2D)             (None, 128, 32, 96)  147584      concatenate_30[0][0]             
__________________________________________________________________________________________________
conv2d_316 (Conv2D)             (None, 128, 32, 96)  147584      conv2d_315[0][0]                 
__________________________________________________________________________________________________
conv2d_transpose_31 (Conv2DTran (None, 64, 64, 192)  32832       conv2d_316[0][0]                 
__________________________________________________________________________________________________
concatenate_31 (Concatenate)    (None, 64, 64, 256)  0           conv2d_transpose_31[0][0]        
                                                                 conv2d_306[0][0]                 
__________________________________________________________________________________________________
conv2d_317 (Conv2D)             (None, 64, 64, 256)  36928       concatenate_31[0][0]             
__________________________________________________________________________________________________
conv2d_318 (Conv2D)             (None, 64, 64, 256)  36928       conv2d_317[0][0]                 
__________________________________________________________________________________________________
conv2d_transpose_32 (Conv2DTran (None, 32, 128, 512) 8224        conv2d_318[0][0]                 
__________________________________________________________________________________________________
concatenate_32 (Concatenate)    (None, 32, 128, 640) 0           conv2d_transpose_32[0][0]        
                                                                 conv2d_304[0][0]                 
__________________________________________________________________________________________________
conv2d_319 (Conv2D)             (None, 32, 128, 640) 9248        concatenate_32[0][0]             
__________________________________________________________________________________________________
conv9 (Conv2D)                  (None, 32, 128, 640) 9248        conv2d_319[0][0]                 
__________________________________________________________________________________________________
conv2d_320 (Conv2D)             (None, 1, 128, 640)  33          conv9[0][0]                      
==================================================================================================
Total params: 6,976,161
Trainable params: 6,976,161
Non-trainable params: 0

Вот код модели:

img_rows=128
img_cols= 128
inputs = Input((1, img_rows, img_cols))
conv1 = Conv2D(32, (3, 3), activation='relu', padding='same')(inputs)
conv1 = Conv2D(32, (3, 3), activation='relu', padding='same')(conv1)
pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)

conv2 = Conv2D(64, (3, 3), activation='relu', padding='same')(pool1)
conv2 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv2)
pool2 = MaxPooling2D(pool_size=(2, 2))(conv2)

conv3 = Conv2D(128, (3, 3), activation='relu', padding='same')(pool2)
conv3 = Conv2D(128, (3, 3), activation='relu', padding='same')(conv3)
pool3 = MaxPooling2D(pool_size=(2, 2))(conv3)

conv4 = Conv2D(256, (3, 3), activation='relu', padding='same')(pool3)
conv4 = Conv2D(256, (3, 3), activation='relu', padding='same')(conv4)
pool4 = MaxPooling2D(pool_size=(2, 2))(conv4)

conv5 = Conv2D(512, (3, 3), activation='relu', padding='same')(pool4)
conv5 = Conv2D(512, (3, 3), activation='relu', padding='same')(conv5)

up6 = concatenate([Conv2DTranspose(256, (2, 2), strides=(2, 2), padding='same')(conv5), conv4], axis=3)
conv6 = Conv2D(256, (3, 3), activation='relu', padding='same')(up6)
conv6 = Conv2D(256, (3, 3), activation='relu', padding='same')(conv6)

up7 = concatenate([Conv2DTranspose(128, (2, 2), strides=(2, 2), padding='same')(conv6), conv3], axis=3)
conv7 = Conv2D(128, (3, 3), activation='relu', padding='same')(up7)
conv7 = Conv2D(128, (3, 3), activation='relu', padding='same')(conv7)

up8 = concatenate([Conv2DTranspose(64, (2, 2), strides=(2, 2), padding='same')(conv7), conv2], axis=3)
conv8 = Conv2D(64, (3, 3), activation='relu', padding='same')(up8)
conv8 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv8)

up9 = concatenate([Conv2DTranspose(32, (2, 2), strides=(2, 2), padding='same')(conv8), conv1], axis=3)
conv9 = Conv2D(32, (3, 3), activation='relu', padding='same')(up9)
conv9 = Conv2D(32, (3, 3), activation='relu', padding='same', name='conv9')(conv9)

conv10 = Conv2D(1, (1, 1), activation='sigmoid')(conv9)

model = Model(inputs=[inputs], outputs=[conv10])

model.compile(optimizer=Adam(lr=1e-5), loss="mean_absolute_error")
model.summary()
model.fit(X_train, y_train, batch_size=36, nb_epoch=5)

Я не понимаю, почему выходные данные второго последнего уровня (conv9) отличаются от ожидаемых значений последнего уровня (conv10).

Модель Keras любезно предоставлена ​​https://github.com/jocicmarko/ultrasound-nerve-segmentation/blob/master/train.py.

Обновлено : добавлена ​​полная модель.summary ().

1 Ответ

0 голосов
/ 26 апреля 2018

Совершенно очевидно, что автор оригинала хотел объединить по измерению channels, а не одному из измерений изображения.

Тензоры в сверточных сетях могут быть в одном из двух форматов:

(batch_size, width, height, channels)

или

(batch_size, channels, width, height)

В модели, которую вы связали, использовался первый формат, но ваша модель использует второй формат.

Вы можете исправить это одним из двух способов:

  1. Измените axis=3 в слоях concatente на axis=1

или

  1. Установите data_format="channels_last" в сверточных слоях. Значение по умолчанию data_format, если оно опущено, взято из конфигурации keras, и, скорее всего, это значение было другим для вас и для автора модели, которую вы использовали. См https://keras.io/layers/convolutional/#conv2d

ОБНОВЛЕНИЕ : фактически, оригинальная модель меняет data_format в самом начале файла, на который вы ссылаетесь:

K.set_image_data_format('channels_last')

Просто добавьте эту строку в начале вашей модели, и она решит проблему.

...