Выходной слой для двоичной классификации с использованием модели keras ResNet50

#python #tensorflow #machine-learning #keras #computer-vision

#python #тензорный поток #машинное обучение #keras #компьютерное зрение

Вопрос:

Я пытаюсь использовать реализацию Keras ResNet50 для обучения модели классификации двоичных изображений.

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

Мой код таков:

 baseModel= ResNet50(weights=None, include_top=False, classes=2, pooling=max)

output = baseModel.output
output = layers.Dense(1, activation='sigmoid')(output)

model = keras.models.Model(inputs=baseModel.input, outputs=output)

model.compile(optimizer=Adam(learning_rate=0.0001), loss='binary_crossentropy',  metrics=['accuracy'])
  

Делая это, я получил эту ошибку:

 ValueError: logits and labels must have the same shape ((None, 7, 7, 1) vs (None, 1))
  

Если я добавлю слой выравнивания перед плотным слоем, который я получу:

 ValueError: The last dimension of the inputs to `Dense` should be defined. Found `None`.
  

Чего мне здесь не хватает? Как я могу изменить форму ввода для плотного слоя?

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

1. Почему бы не использовать ResNet50(weights=None, include_top=True, classes=1) ?

2. Использование вершины по умолчанию без использования включенных весов не включает все классы в наборе данных ImageNet для прогнозирования?

3. Хорошо, я лучше почитаю документацию, и аргументы «классы» есть для этой цели. Для двоичной классификации я должен использовать 1 или 2?

4. Вы можете использовать 1 класс с функцией активации sigmoid или 2 класса с функцией активации softmax.

5. В вашем коде у вас есть output = layers. Плотный (1, активация=’sigmoid’) (out) но где определяется out? Я подозреваю, что вы имели в виду вывод. Можете ли вы предоставить первые и последние строки модели, резюме? классы — это необязательное количество классов для классификации изображений, которое должно быть указано только в том случае, если include_top имеет значение True, и если аргумент weights не указан. У вас есть Top = False, поэтому не указывайте классы

Ответ №1:

Для ResNet вы указали Top= False и pooling = ‘max’, поэтому модель Resent добавила в модель конечный максимальный уровень объединения. Поэтому используйте приведенный ниже код: вам не нужно добавлять слой выравнивания, максимальное объединение сглаживает вывод для вас.

 out=basemodel.layers[-1].output 
output = layers.Dense(1, activation='sigmoid')(out)
  

Вы можете использовать model.summary(), чтобы увидеть структуру модели.
Также вы не должны использовать classes= 2. Когда значение top равно false, классы не должны указываться.

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

1. Спасибо за расширенный ответ, это поможет мне лучше понять, как правильно модифицировать существующую модель. Выполнение этого в основном будет делать то же самое, что и комментарий от @jakub, верно?

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