Несоответствие размера входного / выходного канала в Керасе - PullRequest
0 голосов
/ 09 апреля 2019

В настоящее время я работаю над мультиклассовой сегментацией изображений с помощью Keras. Мои входные изображения в формате RGB. Я пытаюсь сегментировать 4 типа объектов на изображении.

Моя нейронная сеть выглядит следующим образом:

inputs = Input((patch_size, patch_size,nb_chan))

#
conv1 = Conv2D(64, (3, 3), activation='relu', padding='same')(inputs)
conv1 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv1)
pool1 = MaxPooling2D((2, 2))(conv1)

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

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

conv4 = Conv2D(512, (3, 3), activation='relu', padding='same')(pool3)
conv4 = Conv2D(512, (3, 3), activation='relu', padding='same')(conv4)

#
merge1 = UpSampling2D(size=(2, 2))(conv4)
merge1 = concatenate([conv3,merge1],axis=3)
conv5 = Conv2D(256, (3, 3), activation='relu', padding='same')(merge1)
conv5 = Conv2D(256, (3, 3), activation='relu', padding='same')(conv5)

#
merge2 = UpSampling2D(size=(2, 2))(conv5)
merge2 = concatenate([conv2,merge2], axis=3)
conv6 = Conv2D(128, (3, 3), activation='relu', padding='same')(merge2)
conv6 = Conv2D(128, (3, 3), activation='relu', padding='same')(conv6)

#
merge3 = UpSampling2D(size=(2, 2))(conv6)
merge3 = concatenate([conv1,merge3], axis=3)
conv7 = Conv2D(64, (3, 3), activation='relu', padding='same')(merge3)
conv7 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv7)


conv8 = Conv2D(nbClass, (1, 1), activation='softmax',padding='same')(conv7)
model = Model(inputs=inputs, outputs=conv8)
model.summary()
model.compile(optimizer=Adam(lr=1e-5), loss='categorical_crossentropy', metrics=['categorical_accuracy'])

Размер моего входного изображения 256 * 256 nb_chan - это размер входного канала, в моем случае это 3. nbClass - это номер объекта для сегмента, в моем случае это 4.

Но когда я хочу скомпилировать свою модель, я получаю эту ошибку:

ValueError: Error when checking target: expected conv2d_15 to have shape (256, 256, 4) but got array with shape (256, 256, 3)

Я попытался изменить последний слой моей сети с помощью функции изменения формы:

conv8 = Conv2D(nbClass, (1, 1), activation='softmax',padding='same')(conv7)
conv8 = Reshape((patch_size*patch_size,nbClass))(conv8)
conv8 = core.Permute((2,1))(conv8)

Но я получаю эту ошибку:

ValueError: Error when checking target: expected permute_1 to have 3 dimensions, but got array with shape (8, 256, 256, 3)

Я немного растерялся, я что-то забыл?

...