与 CNN 交叉验证
Cross validation with CNN
我想知道我的代码是否在做我想做的事情;为了给你一些背景知识,我正在实施 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 时,模型只有一次 运行;我说的对吗?
感谢您的帮助
不尽然,交叉验证更像是一种防止过度拟合的方法/不会被来自严重分裂的数据集的异常结果所混淆 -> 获得对模型性能的相关估计。如果要调整模型的超参数,最好使用 sklearn.model_selection.GridSearchCV
/ sklearn.model_selection.RandomSearchCV
在做 cross_val_score
时对于每个 Train/Test
sklearn 执行 fit
然后 predict
/evaluate
,因此对于模型的每个新实例,
你有 1 fit
然后 1 predict
/evaluate
;
否则你的交叉验证是无效的,因为它依赖于对以前数据集的拟合(也可能是测试数据!)
这里有两个您应该熟悉的关键术语:
- 超参数
- 参数
超参数控制模型的总体架构。这些是程序员或数据科学家控制的。在 CNN 的情况下,这是指层数、它们的配置、激活、优化器等。对于简单的多项式回归模型,这将是多项式的次数。
参数是指模型在使用梯度下降或您使用的任何方法解决优化后最终得到的权重或系数的实际值。在 CNN 中,这将是每一层的权重矩阵。对于多项式回归,这将是系数和偏差。
交叉验证用于找到最佳超参数集。最佳参数集由优化器(梯度下降、adam 等)针对 given 超参数和数据集获得。
回答您的问题:
你会运行多次交叉验证,每次都使用不同的超参数配置(网络架构)。这是你唯一可以控制的。最后,您根据准确性选择最佳架构。每次折叠的模型权重都会不同,但找到最佳权重是优化器的工作,而不是你的工作。
是的。在 3 fold CV 中,模型训练了 3 次,评估了 3 次。当您执行 model.fit
时,您是在对新数据集进行 一次 预测。
我想知道我的代码是否在做我想做的事情;为了给你一些背景知识,我正在实施 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 时,模型只有一次 运行;我说的对吗?
感谢您的帮助
不尽然,交叉验证更像是一种防止过度拟合的方法/不会被来自严重分裂的数据集的异常结果所混淆 -> 获得对模型性能的相关估计。如果要调整模型的超参数,最好使用
sklearn.model_selection.GridSearchCV
/sklearn.model_selection.RandomSearchCV
在做
cross_val_score
时对于每个 Train/Test sklearn 执行fit
然后predict
/evaluate
,因此对于模型的每个新实例, 你有 1fit
然后 1predict
/evaluate
; 否则你的交叉验证是无效的,因为它依赖于对以前数据集的拟合(也可能是测试数据!)
这里有两个您应该熟悉的关键术语:
- 超参数
- 参数
超参数控制模型的总体架构。这些是程序员或数据科学家控制的。在 CNN 的情况下,这是指层数、它们的配置、激活、优化器等。对于简单的多项式回归模型,这将是多项式的次数。
参数是指模型在使用梯度下降或您使用的任何方法解决优化后最终得到的权重或系数的实际值。在 CNN 中,这将是每一层的权重矩阵。对于多项式回归,这将是系数和偏差。
交叉验证用于找到最佳超参数集。最佳参数集由优化器(梯度下降、adam 等)针对 given 超参数和数据集获得。
回答您的问题:
你会运行多次交叉验证,每次都使用不同的超参数配置(网络架构)。这是你唯一可以控制的。最后,您根据准确性选择最佳架构。每次折叠的模型权重都会不同,但找到最佳权重是优化器的工作,而不是你的工作。
是的。在 3 fold CV 中,模型训练了 3 次,评估了 3 次。当您执行
model.fit
时,您是在对新数据集进行 一次 预测。