Со всем, что я знаю. предварительно обученный CNN может сделать намного лучше чем CNN. У меня есть набор данных из 855 изображений. Я применил CNN и получил точность 94%. Затем я применил модель с предварительной подготовкой (VGG16, ResNet50, Inception_V3, Mobil eNet) также с тонкой настройкой, но все же я получил максимальные 60%, и два из них очень плохо справляются с классификацией. Может ли CNN действительно работать лучше, чем предварительно подготовленная модель, или моя реализация неверна. Я преобразовал свое изображение в размеры 100 на 100 и пошел по пути приложения keras . Тогда в чем проблема ??
Наивный подход CNN:
def cnn_model():
size = (100,100,1)
num_cnn_layers =2
NUM_FILTERS = 32
KERNEL = (3, 3)
MAX_NEURONS = 120
model = Sequential()
for i in range(1, num_cnn_layers+1):
if i == 1:
model.add(Conv2D(NUM_FILTERS*i, KERNEL, input_shape=size,
activation='relu', padding='same'))
else:
model.add(Conv2D(NUM_FILTERS*i, KERNEL, activation='relu',
padding='same'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(int(MAX_NEURONS), activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(int(MAX_NEURONS/2), activation='relu'))
model.add(Dropout(0.4))
model.add(Dense(3, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam',
metrics=['accuracy'])
return model
Подход VGG16:
def vgg():
` `vgg_model = keras.applications.vgg16.VGG16(weights='imagenet',include_top=False,input_shape = (100,100,3))
model = Sequential()
for layer in vgg_model.layers:
model.add(layer)
# Freeze the layers
for layer in model.layers:
layer.trainable = False
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(3, activation='softmax'))
model.compile(optimizer=keras.optimizers.Adam(lr=1e-5),
loss='categorical_crossentropy',
metrics=['accuracy'])
return model