Comments 3
Модель сами обучали? Где брали материалы? На чем обучали и какой объем?
В статье нифига не объяснено, потому что автор видимо и сам не понял или не разбирался.
В общем, модель уже обучена на тысяче классов (в том моменте, когда создаем модель и указываем что веса имаджнетовские и 1000 классов - собсно все классы имаджнета).
Более того, эта модель может распознавать не только собак - там есть и всякие раковины с петухами, более того бутылку пива оно тоже умеет классифицировать. Собак там пород 15-20 примерно, на самом деле большой процент относительно всего остального, но все равно лишь малая часть возможностей модели.
Однако, возможно обучить и свою модель. При создании указать top=False
, weights=None
и num_classes
не указывать. Потом объединить с Dense
слоем на выход, размером с кол-во классов, замутить compile и потом fit
на итоговую модель. Вот так:
# загружаем модель ResNet50 без весов
base_model = keras.applications.ResNet50(weights=None, include_top=False, input_shape=(224, 224, 3))
# вытаскиваем выход, чтобы потом объединить с Dense слоем
x = base_model.output
# собственно, слой на custom_num_classes выходов
predictions = keras.layers.Dense(custom_num_classes, activation='softmax')(x)
# создаём окончательную модели ResNet50 с новыми слоями
model = keras.models.Model(inputs=base_model.input, outputs=predictions)
# компилируем модель, без этого не взлетит
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
# обучаем на датасете
model_black.fit(x_train, y_train)
Штука на самом деле очень неплохая, картинки небольшого размера классифицирует на ура, картинки примерно 200х200, с 20-30 классами точность выдает 75-85%, при обучении на датасетах размером 15-20 тысяч, и это если совсем не играться с гиперпараметрами. Единственное, возвращать будет массив длины custom_num_classes
, поэтому функцию восстановления лейбла придется самому делать, но это буквально одна-две строки.
Для первой статьи не плохое начало)
Разработка интерфейса для модели ResNet50() CNN с Keras