Может ли CNN работать лучше, чем предварительно обученный CNN? - PullRequest
0 голосов
/ 26 апреля 2020

Со всем, что я знаю. предварительно обученный 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 

1 Ответ

2 голосов
/ 03 мая 2020

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

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

Вот пример из моей собственной работы, есть дополнительные фрагменты кода, но вы можете заставить его работать с вашим собственным код, лог c остается прежним

#You extract the layer which you want to manipulate, usually the last few.
last_layer = pre_trained_model.get_layer(name_of_layer)

# Flatten the output layer to 1 dimension
x = layers.Flatten()(last_output)
# Add a fully connected layer with 1,024 hidden units and ReLU activation
x = layers.Dense(1024,activation='relu')(x)
# Add a dropout rate of 0.2
x = layers.Dropout(0.2)(x)                  
# Add a final sigmoid layer for classification
x = layers.Dense(1,activation='sigmoid')(x)           

#Here we combine your newly added layers and the pre-trained model.
model = Model( pre_trained_model.input, x) 

model.compile(optimizer = RMSprop(lr=0.0001), 
              loss = 'binary_crossentropy', 
              metrics = ['accuracy'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...