与CNN交叉验证

时间:2019-04-30 14:46:45

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

我想知道我的代码是否正在执行我想做的事情;为您提供一些背景知识,以实现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 =>如果我很好理解,在上面的代码中,结果运行我的CNN 3次,并告诉我准确性。但是当我使用 model.fit 时,模型只运行一次;我说的对吗?

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

  1. 并非如此,交叉验证是防止过度拟合/不被严重分裂的数据集产生的异常结果所迷惑的一种方法->获得对模型性能的真实估计。如果要调整模型的超参数,则最好使用@Test internal fun call() { mockMvc.get("/execute") { accept = APPLICATION_JSON }.andExpect { request { asyncStarted() } } .asyncDispatch(mockMvc) .andExpect { status { isOk } jsonPath("$.value") { value("test") } } } / sklearn.model_selection.GridSearchCV

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

答案 1 :(得分:1)

您需要熟悉以下两个关键术语:

  1. 超参数
  2. 参数

超参数控制模型的一般体系结构。这些是程序员或数据科学家控制的。对于CNN,这是指层数,层的配置,激活,优化器等。对于简单的多项式回归模型,这就是多项式的次数。

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

交叉验证用于查找最佳的超参数集。优化器(给定的超参数和数据集)的最佳参数集(梯度下降,亚当等)是由优化器获得的。

要回答您的问题:

  1. 您将多次运行交叉验证,每次使用不同的超参数配置(网络体系结构)。那是您唯一可以控制的。最后,您将基于准确性选择最佳的体系结构。该模型的权重因折折而异,但是找到最佳权重是优化器的工作,而不是您的工作。

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