【问题标题】:Cross validation with CNN使用 CNN 进行交叉验证
【发布时间】:2019-04-30 14:46:45
【问题描述】:

我想知道我的代码是否在做我想做的事;为了给你一些背景,我正在实施 CNN 进行图像分类。我正在尝试使用交叉验证来比较我不同的神经网络架构

这里是代码:


def create_model():
    model = Sequential()
    model.add(Conv2D(24,kernel_size=3,padding='same',activation='relu',
            input_shape=(96,96,1)))
    model.add(MaxPool2D())
    model.add(Conv2D(48,kernel_size=3,padding='same',activation='relu'))
    model.add(MaxPool2D())
    model.add(Conv2D(64,kernel_size=3,padding='same',activation='relu'))
    model.add(MaxPool2D())
    model.add(Flatten())
    model.add(Dense(128, activation='relu'))
    model.add(Dense(256, activation='relu'))
    model.add(Dense(12, activation='softmax'))
    model.compile(optimizer="adam", loss="categorical_crossentropy", metrics=["accuracy"])
    return model
model = KerasClassifier(build_fn=create_model, epochs=5, batch_size=20, verbose=1) 
# 3-Fold Crossvalidation
kfold = KFold(n_splits=3, shuffle=True, random_state=2019) 
results = cross_val_score(model, train_X, train_Y_one_hot, cv=kfold)

model.fit(train_X, train_Y_one_hot,validation_data=(valid_X, valid_label),class_weight=class_weights)
y_pred = model.predict(test_X)

test_eval = model.evaluate(test_X, y_pred, verbose=0)

我在互联网上找到了用于交叉验证的部分。但是我有一些理解上的问题。

我的问题:1=>我可以使用交叉验证来提高我的准确性吗?例如,我运行了 10 次我的神经网络,我的模型得到了出现最佳准确度的权重

2 => 如果我理解得很好,在上面的代码中,results 运行我的 CNN 3 次并向我展示准确性。但是当我使用 model.fit 时,模型只运行一次;我说的对吗?

感谢您的帮助

【问题讨论】:

    标签: python machine-learning keras conv-neural-network cross-validation


    【解决方案1】:
    1. 并非如此,交叉验证更多地是一种防止过度拟合/不被来自严重分裂数据集的异常结果混淆的方法 -> 获得对模型性能的相关估计。如果要调整模型的超参数,最好使用sklearn.model_selection.GridSearchCV / sklearn.model_selection.RandomSearchCV

    2. 在为每个训练/测试执行 cross_val_score 时 sklearn 执行fit 然后predict/evaluate,因此对于模型的每个新实例, 你有 1 fit 然后 1 predict/evaluate; 否则,您的交叉验证无效,因为它取决于对先前数据集的拟合(可能还取决于测试数据!)

    【讨论】:

      【解决方案2】:

      您应该熟悉这里的两个关键术语:

      1. 超参数
      2. 参数

      超参数控制模型的一般架构。这些是程序员或数据科学家控制的。在 CNN 的情况下,这指的是层数、它们的配置、激活、优化器等。对于简单的多项式回归模型,这将是多项式的次数。

      参数是指模型在使用梯度下降或您使用的任何方法解决优化后最终得到的权重或系数的实际值。在 CNN 中,这将是每一层的权重矩阵。对于多项式回归,这将是系数和偏差。

      交叉验证用于找到最佳的超参数集。对于给定的组超参数和数据,优化器(梯度下降、亚当等)可以获得最佳参数集。

      回答您的问题:

      1. 您将多次运行交叉验证,每次都使用不同的超参数配置(网络架构)。这是你唯一可以控制的。最后,您会根据准确性选择最佳架构。每个折叠的模型权重会有所不同,但找到最佳权重是优化器的工作,而不是您的工作。

      2. 是的。在 3fold CV 中,模型被训练 3 次,评估 3 次。当您执行model.fit 时,您正在对新数据集进行一次的预测。

      【讨论】:

        猜你喜欢
        • 2015-06-11
        • 2020-07-13
        • 2019-09-06
        • 2017-04-21
        • 1970-01-01
        • 1970-01-01
        • 2021-11-24
        • 2020-06-01
        • 2021-08-12
        相关资源
        最近更新 更多