首页 > 解决方案 > 使用 DNN 分类进行交叉验证

问题描述

我有一段代码可以使用 TensorFlow 获得 DNN 分类的准确性,实际上,我有两个类。train 和 test 的过程由 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 方法。我怎样才能达到我的目的?

标签: pythontensorflowscikit-learnclassificationcross-validation

解决方案


基于,您应该使用model.train而不是model.fit. 但是,DNNClassifier顺序模型或功能 API 更常见,而不是 。你可以model.fit用这些来做。

例如

inputs = keras.Input(shape=(784,), name="digits")
x = layers.Dense(64, activation="relu", name="dense_1")(inputs)
x = layers.Dense(64, activation="relu", 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),
)

或者(我的仓库中的一个快速项目):

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, y_train, epochs=15, verbose=True, callbacks=callbacks, validation_data=(X_test, y_test), batch_size=100)

推荐阅读