CNN 能比预训练的 CNN 做得更好吗?

据我所知。预训练的 CNN 比 CNN 做得更好。我有一个包含 855 张图像的数据集。我已经应用了 CNN 并获得了 94% 的准确率。然后我应用了预训练模型(VGG16、ResNet50、Inception_V3、MobileNet)也进行了微调,但我仍然获得了最高的 60%,其中两个在分类方面做得非常糟糕。CNN 真的能比预训练模型做得更好,还是我的实现是错误的。我已将图像转换为 100 x 100 尺寸并遵循keras application的方式。然后是什么问题??

朴素的 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 


临摹微笑
浏览 183回答 3
3回答

慕哥9229398

在这两种情况下,您所说的 CNN 都在谈论同一件事,这是一种神经网络模型。只是预训练的模型已经在其他一些数据上进行了训练,而不是您正在处理并尝试分类的数据集。这里通常使用的称为迁移学习。与其冻结所有层,不如尝试让最后几层保持打开状态,以便可以使用您自己的数据重新训练它们,以便预训练的模型也可以编辑其权重和偏差以满足您的需求。您尝试分类的数据集可能与预训练模型无关。这是我自己工作的一个例子,还有一些额外的代码,但你可以用你自己的代码让它工作,逻辑保持不变#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 dimensionx = layers.Flatten()(last_output)# Add a fully connected layer with 1,024 hidden units and ReLU activationx = layers.Dense(1024,activation='relu')(x)# Add a dropout rate of 0.2x = layers.Dropout(0.2)(x)                  # Add a final sigmoid layer for classificationx = 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'])

杨__羊羊

#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 dimensionx = layers.Flatten()(last_output)# Add a fully connected layer with 1,024 hidden units and ReLU activationx = layers.Dense(1024,activation='relu')(x)# Add a dropout rate of 0.2x = layers.Dropout(0.2)(x)                  # Add a final sigmoid layer for classificationx = 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'])

慕的地10843

除了@Ilknur Mustafa 提到的内容之外,由于您的数据集可能与用于预训练的图像不同,您可以尝试重新训练预训练模型的最后几层,而不是添加全新的层。下面的示例代码除了输出层之外没有添加任何额外的可训练层。通过这种方式,您可以通过在现有权重上重新训练最后几层来受益,而不是从头开始训练。如果您没有要训练的大型数据集,这可能会有所帮助。# load model without classifier layers vgg = VGG16(include_top=False, input_shape=(100, 100, 3), weights='imagenet', pooling='avg')# make only last 2 conv layers trainable for layer in vgg.layers[:-4]:    layer.trainable = False# add output layer  out_layer = Dense(3, activation='softmax')(vgg.layers[-1].output)model_pre_vgg = Model(vgg.input, out_layer)# compile model opt = SGD(lr=1e-5) model_pre_vgg.compile(optimizer=opt, loss=keras.losses.categorical_crossentropy, metrics=['accuracy'])
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python