предварительно подготовленная форма цели keras ResNet50

#keras #keras-layer

#keras #keras-слой

Вопрос:

Я пытаюсь использовать предварительно обученную сеть ResNet50 для решения проблемы сегментации. Я удаляю последний слой и добавляю желаемый слой. Но когда я пытаюсь подогнать, я получаю следующую ошибку:

Ошибка значения: ошибка при проверке цели: ожидалось, что conv2d_1 будет иметь форму (16, 16, 1), но получен массив с формой (512, 512, 1)

У меня есть две папки: изображения и маски. изображения выполнены в формате RGB, а маски — в оттенках серого. Форма для всех изображений равна 512×512. Я не могу понять, в какой части я делаю неправильно.

Любая помощь будет оценена.

 from keras.applications.resnet50 import ResNet50
image_input=Input(shape=(512, 512, 3))
model = ResNet50(input_tensor=image_input,weights='imagenet',include_top=False)
x = model.output
x = Conv2D(1, (1,1), padding="same", activation="sigmoid")(x)
model = Model(inputs=model.input, outputs=x)
model.summary()

conv2d_1 (Conv2D)           (None, 16, 16, 1)    2049 activation_49[0][0]              

for layer in model.layers[:-1]:
    layer.trainable = False

for layer in model.layers[-1:]:
    layer.trainable = True
model.compile(optimizer=Adam(), loss='binary_crossentropy', metrics=['accuracy'])
  

Комментарии:

1. Добро пожаловать в SO. Если ответ был каким-либо образом полезен, пожалуйста, рассмотрите возможность его принятия.

Ответ №1:

Ваша сеть выдает на выходе форму, (16, 16, 1) но ваша y (цель) имеет форму (512, 512, 1)

Выполните следующее, чтобы увидеть это.

 from keras.applications.resnet50 import ResNet50
from keras.layers import Input

image_input=Input(shape=(512, 512, 3))
model = ResNet50(input_tensor=image_input,weights='imagenet',include_top=False)
model.summary()

# Output shows that the ResNet50 network has output of shape (16,16,2048)

from keras.layers import Conv2D

conv2d = Conv2D(1, (1,1), padding="same", activation="sigmoid")
conv2d.compute_output_shape((None, 16, 16, 2048))

# Output shows the shape your network's output will have.
  

Либо вы сами, y либо способ использования ResNet50 должен измениться. Прочитайте о ResNet50, чтобы понять, чего вам не хватает.

Комментарии:

1. Привет, спасибо за ваш комментарий. Здесь я пытаюсь выполнить сегментацию с помощью UNET. Таким образом, конечная форма слоя должна совпадать с формой ввода (512×512). Когда я запускаю ваш комментарий, у меня есть этот вывод (Нет, 16, 16, 1). Чего я здесь не понимаю?

2. Созданная вами сеть не подходит для поставленной вами задачи. если вам нужна определенная форма в выходных данных (512,512,1), вы должны соответствующим образом создать свою сеть. Resnet — это сеть классификации. Вы должны дополнить ее надлежащими слоями декодера для достижения поставленной задачи. < medium.com/nanonets /… > дает некоторое объяснение о задаче сегментации изображения. Я надеюсь, это то, что вы ищете. Прочитайте статьи о некоторых сетях, упомянутых там, чтобы понять, как создать сеть сегментации.