#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 /… > дает некоторое объяснение о задаче сегментации изображения. Я надеюсь, это то, что вы ищете. Прочитайте статьи о некоторых сетях, упомянутых там, чтобы понять, как создать сеть сегментации.