与 DNN 分类的交叉验证

问题描述

我有一段代码可以用 TensorFlow 获得 DNN 分类的准确性,实际上,我有两个类。训练和测试的过程由sklearn.model_selection中的train_test_split完成。 现在我想使用分层交叉验证而不是 train_test_split。我试过的是我用过的 sklearn.model_selection 中的 cross_val_score

model = learn.DNNClassifier(hidden_units=[5],n_classes=3,feature_columns=feature_columns,)
    scores = cross_val_score(estimator=model,X,y,scoring = 'accuracy',cv=5,fit_params={'steps': 1000},verbose=100)

然而我偶然发现了一个错误告诉 tf. estimator.DNNClassifier 没有 fit 方法。 我怎样才能达到我的目的?

解决方法

基于 this,您应该使用 model.train 而不是 model.fit。但是,与 DNNClassifier 不同,Sequential 模型或 Functional API 更为常见。你可以用这些来做model.fit

For example,

inputs = keras.Input(shape=(784,),name="digits")
x = layers.Dense(64,activation="relu",name="dense_1")(inputs)
x = layers.Dense(64,name="dense_2")(x)
outputs = layers.Dense(10,activation="softmax",name="predictions")(x)

model = keras.Model(inputs=inputs,outputs=outputs)
history = model.fit(
    x_train,y_train,batch_size=64,epochs=2,# We pass some validation for
    # monitoring validation loss and metrics
    # at the end of each epoch
    validation_data=(x_val,y_val),)

或者(来自我的仓库的 quick project):

model = Sequential()
model.add(layers.Embedding(vocab_size,embedding_dim,weights=[embedding_matrix],input_length=maxlen,trainable=True))
model.add(layers.Conv1D(256,3,activation='relu'))
model.add(Dropout(0.2))
model.add(layers.GlobalMaxPooling1D())
model.add(layers.Dense(28,activation='sigmoid'))
model.compile(optimizer=optimizers.Adam(lr=0.0002),loss='binary_crossentropy',metrics=["accuracy",metrics.Precision(name="precision"),metrics.Recall(name="recall") ])
model.summary()

callbacks = [EarlyStopping(monitor='val_loss',patience=2),ModelCheckpoint(filepath='best_model.h5',monitor='val_loss',save_best_only=True)]
fit = model.fit(X_train,epochs=15,verbose=True,callbacks=callbacks,validation_data=(X_test,y_test),batch_size=100)