gpt4 book ai didi

运行交叉验证时的 Keras 回调

转载 作者:行者123 更新时间:2023-12-04 03:12:53 28 4
gpt4 key购买 nike

我读到当您还想使用模型回调时不能使用 Keras 进行交叉验证,但是 this post表明这毕竟是可能的。但是,我很难将其纳入我的上下文。

为了更详细地探讨这个问题,我正在关注 machinelearningmastery blog ,并使用 the iris dataset .

这是一个三类分类问题,我正在尝试使用多层感知器(目前一层,用于测试)。我现在的目标是在模型回调中工作,这样我就可以保存最佳模型的权重。下面,我尝试在我的部分 network_mlp .为了表明模型在没有回调的情况下工作,我还包括了 network_mlp_no_callbacks。 .

您应该能够将其复制/粘贴到 python session 中并运行它,没问题。要重现我看到的错误,请取消注释最后一行。

错误:RuntimeError: Cannot clone object <keras.wrappers.scikit_learn.KerasClassifier object at 0x7f7e1c9d2290>, as the constructor does not seem to set parameter callbacks

代码:第一段读入数据;第二个是带有回调的模型,它不起作用;第三种是没有回调的模型,它可以工作(提供上下文)。

#!/usr/bin/env python

import numpy as np
import pandas, math, sys, keras
from keras.models import Sequential
from keras.callbacks import EarlyStopping, ModelCheckpoint
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold
from keras.utils import np_utils
from keras.utils.np_utils import to_categorical
from sklearn.preprocessing import LabelEncoder

def read_data_mlp(train_file):
train_data = pandas.read_csv("iris.csv", header=None)
train_data = train_data.values
X = train_data[:,0:4].astype(float)
Y = train_data[:,4]
X = X.astype('float32')

scaler = MinMaxScaler(feature_range=(0, 1))

# encode class values as integers
encoder = LabelEncoder()
encoder.fit(Y)
encoded_Y = encoder.transform(Y)
# convert integers to dummy variables (i.e. one hot encoded)
dummy_y = np_utils.to_categorical(encoded_Y)

X_train_s = scaler.fit_transform(X)

return (X_train_s, dummy_y)

def network_mlp(X, Y, out_dim=10, b_size=30, num_classes=3, epochs=10):
#out_dim is the dimensionality of the hidden layer;
#b_size is the batch size. There are 150 examples total.

filepath="weights_mlp.hdf5"

def mlp_model():
model = Sequential()
model.add(Dense(out_dim, input_dim=4, activation='relu', kernel_initializer='he_uniform'))
model.add(Dense(num_classes, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
return model

checkpoint = ModelCheckpoint(filepath, monitor='val_acc', verbose=1, save_best_only=True, mode='max')
callbacks_list = [checkpoint]
estimator = KerasClassifier(build_fn=mlp_model, epochs=epochs, batch_size=b_size, verbose=0, callbacks=callbacks_list)
kfold = KFold(n_splits=10, shuffle=True, random_state=7)
results = cross_val_score(estimator, X, Y, cv=kfold)
print("MLP: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))

return 0

def network_mlp_no_callbacks(X, Y, out_dim=10, b_size=30, num_classes=3, epochs=10):

def mlp_model():
model = Sequential()
model.add(Dense(out_dim, input_dim=4, activation='relu', kernel_initializer='he_uniform'))
model.add(Dense(num_classes, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
return model

estimator = KerasClassifier(build_fn=mlp_model, epochs=epochs, batch_size=b_size, verbose=0)
kfold = KFold(n_splits=10, shuffle=True, random_state=7)
results = cross_val_score(estimator, X, Y, cv=kfold)
print("MLP: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))

return 0

if __name__=='__main__':

X, Y = read_data_mlp('iris.csv')
network_mlp_no_callbacks(X, Y, out_dim=10, b_size=30, num_classes=3, epochs = 10)
#network_mlp(X, Y, out_dim=10, b_size=30, num_classes=3, epochs = 10)

问题:如何将模型回调合并到 KerasClassifier 中?

最佳答案

该解决方案与您引用的其他答案非常接近,但略有不同,因为他们使用了多个估算器而您只有一个。通过将 fit_params={'callbacks': callbacks_list} 添加到 cross_val_score 调用,从 estimator 中删除回调列表,我能够让检查点工作> 初始化,并将 save_best_only 更改为 False

现在 network_mlp 中的代码部分如下所示:

checkpoint = ModelCheckpoint(filepath, monitor='val_acc', verbose=1, save_best_only=False, mode='max')
callbacks_list = [checkpoint]
estimator = KerasClassifier(build_fn=mlp_model, epochs=epochs, batch_size=b_size, verbose=0)
kfold = KFold(n_splits=10, shuffle=True, random_state=7)
results = cross_val_score(estimator, X, Y, cv=kfold, fit_params={'callbacks': callbacks_list})

save_best_only=False 是必需的,因为您没有为神经网络设置验证拆分,因此 val_acc 不可用。如果您想使用验证子拆分,您可以将估算器初始化更改为:

estimator = KerasClassifier(build_fn=mlp_model, epochs=epochs, batch_size=b_size, verbose=0, validation_split=.25)

祝你好运!

关于运行交叉验证时的 Keras 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43562449/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com