我正在嘗試遵循使用 SciKit-Learn、Keras 和 TensorFlow 進行機器學習實踐一書第 10 章的示例,該示例涉及 DNN 模型的超引數的優化。
資料集是 MNIST 時裝模型,該專案的目標是對 10 個類別的影像進行分類。
(X_train_full, y_train_full), (X_test, y_test) = fashion_mnist.load_data()
沒有驗證,所以我將使用前 5k 個元素創建該集合:
X_valid, X_train = X_train_full[:5000], X_train_full[5000:]
y_valid, y_train = y_train_full[:5000], y_train_full[5000:]
一個簡單的 DNN 模型的可能實作如下,使用順序 Keras API:
model = keras.models.Sequential()
model.add(keras.layers.Flatten(input_shape=[28, 28]))
model.add(keras.layers.Dense(300, activation="relu"))
model.add(keras.layers.Dense(200, activation="relu"))
model.add(keras.layers.Dense(100, activation="relu"))
model.add(keras.layers.Dense(10, activation="softmax"))
然后,本書建議研究超引數空間以找到最好的空間,使用RandomizedSearchCV. 該示例使用keras.wrappers.scikit_learn.KerasRegressor現在已KerasRegressor被 SciKeras 棄用。
我創建了一個包含 ML 模型的函式:
input_shape=X_train[0].shape
def build_model(n_hidden = 1, n_neurons = 30, learning_rate=3e-3, input_shape=input_shape):
grid_model = keras.models.Sequential()
grid_model.add(keras.layers.Flatten(input_shape=input_shape))
for layer in range(n_hidden):
grid_model.add(keras.layers.Dense(n_neurons, activation="relu"))
grid_model.add(keras.layers.Dense(10, activation="softmax"))
opt = tf.keras.optimizers.SGD(learning_rate=learning_rate)
grid_model.compile(loss="sparse_categorical_crossentropy", optimizer=opt, metrics=["accuracy"])
return grid_model
然后我定義了模型超引數來探索:
param_distribs = {
"n_hidden": [0, 1, 2, 3, 4, 5],
"n_neurons": np.arange(1, 300),
"learning_rate": reciprocal(3e-4, 3e-2)
}
然后我使用 SciKeras 圍繞 Keras 模型創建一個包裝器,提供引數空間:
keras_reg = KerasRegressor(build_model, n_hidden=param_distribs["n_hidden"], n_neurons=param_distribs["n_neurons"], learning_rate=param_distribs["learning_rate"], verbose=1)
最后一步是定義一個RandomizedSearchCV物件并使用以下fit方法開始研究:
rnd_search_cv = RandomizedSearchCV(keras_reg, param_distribs, n_iter=10, cv=3)
rnd_search_cv.fit(X_train, y_train, epochs=100, validation_data=(X_valid, y_valid), callbacks=[keras.callbacks.EarlyStopping(patience=10)])
對于每個時代,最后一行給了我以下錯誤:
/home/docker_user/.local/lib/python3.8/site-packages/sklearn/model_selection/_validation.py:776: UserWarning: Scoring failed. The score on this train-test partition for these parameters will be set to nan. Details:
Traceback (most recent call last):
File "/home/docker_user/.local/lib/python3.8/site-packages/sklearn/model_selection/_validation.py", line 767, in _score
scores = scorer(estimator, X_test, y_test)
File "/home/docker_user/.local/lib/python3.8/site-packages/sklearn/metrics/_scorer.py", line 429, in _passthrough_scorer
return estimator.score(*args, **kwargs)
File "/home/docker_user/.local/lib/python3.8/site-packages/scikeras/wrappers.py", line 1100, in score
return self.scorer(y, y_pred, sample_weight=sample_weight, **score_args)
File "/home/docker_user/.local/lib/python3.8/site-packages/scikeras/wrappers.py", line 1697, in scorer
return sklearn_r2_score(y_true, y_pred, **kwargs)
File "/home/docker_user/.local/lib/python3.8/site-packages/sklearn/metrics/_regression.py", line 911, in r2_score
y_type, y_true, y_pred, multioutput = _check_reg_targets(
File "/home/docker_user/.local/lib/python3.8/site-packages/sklearn/metrics/_regression.py", line 100, in _check_reg_targets
check_consistent_length(y_true, y_pred)
File "/home/docker_user/.local/lib/python3.8/site-packages/sklearn/utils/validation.py", line 387, in check_consistent_length
raise ValueError(
ValueError: Found input variables with inconsistent numbers of samples: [18334, 183340]
第二維的因子 10 讓我思考......我還檢查了資料的形狀,它們很好......
print(X_train.shape, y_train.shape)
(55000, 28, 28) (55000,)
你能幫我處理這個錯誤嗎?
uj5u.com熱心網友回復:
顧名思義,scikeras.wrappers.KerasRregressor應該用于回歸并r2_score默認使用。因此,它不會將 softmax 輸出轉換為您在驗證集中擁有的類索引。最后一個密集層的輸出具有大小10(因此因子為 10)。相反,您應該scikeras.wrappers.KerasClassifier默認使用準確度作為評分。簡單地換掉KerasRegressor就KerasClassifier可以了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/482765.html
