У меня есть большая проблема, в которой я хотел бы использовать sklearn.model_selection.GridSearchCV
для поиска гиперпараметров, чтобы найти «лучший» набор для задачи подбора нейронной сети.
Я пробовал много примеровиз этого кода простые, кажется, работают как положено, но более сложные возвращают 0 для grid_result.cv_results_['mean_test_score']
, что не имеет смысла, если только я неправильно понимаю значение mean_test_score
(которое, как я думал, было связано с * 1006)* возвращено из keras).
Это значительно урезанная версия фактического кода, по сути, пытающаяся обучить NN на множествах с несколькими экспонентами:
from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import make_scorer
import numpy
def create_XY_exp(Ndata):
num = np.arange(10, 310, 10)
denom = np.array([10, 80, 120])
A = np.exp(-np.outer(num, 1/denom))
X = np.zeros((Ndata, len(num)))
Y = np.zeros((Ndata, len(denom)))
for ii in range(Ndata):
c = np.random.random((3))
si = np.dot(A, c)
e1 = np.random.normal(0, 0.03, len(num))
X[ii] = si+e1
Y[ii] = c
return X, Y
def create_model(optimizer='adam', init='random_uniform', nnodes=8):
# create model
model = Sequential()
model.add(Dense(nnodes, input_dim=30, kernel_initializer=init, activation='relu'))
model.add(Dense(nnodes, kernel_initializer=init, activation='relu'))
model.add(Dense(nnodes, kernel_initializer=init, activation='relu'))
model.add(Dense(3, kernel_initializer=init, activation='sigmoid'))
# Compile model
model.compile(loss='mean_squared_error', optimizer=optimizer, metrics=['accuracy'])
return model
X, Y = create_XY_exp(100)
# create model
model = KerasClassifier(build_fn=create_model, verbose=1)
nnodes = [30, 40]
param_grid = dict(nnodes=nnodes)
grid = GridSearchCV(estimator=model, param_grid=param_grid, error_score='raise')
grid_result = grid.fit(X, Y)
# summarize results
print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))
means = grid_result.cv_results_['mean_test_score']
stds = grid_result.cv_results_['std_test_score']
params = grid_result.cv_results_['params']
for mean, stdev, param in zip(means, stds, params):
print("\t%f (%f) with: %r" % (mean, stdev, param))
Я ожидалконечный результат имеет среднее значение в конечном> 0. Пример выходных данных приведен ниже.Очевидно, что точность ужасна, так как в приведенном выше коде немного обучающих наборов.acc:
больше 0 для каждых 3 прогонов ниже, но тогда окончательный mean_test_score
равен 0. Я бы подумал, что mean_test_score
должен быть несколько ближе к acc:
от трасс.
Epoch 1/1
66/66 [==============================] - 2s 23ms/step - loss: 0.0761 - acc: 0.3182
34/34 [==============================] - 1s 19ms/step
66/66 [==============================] - 0s 48us/step
Epoch 1/1
67/67 [==============================] - 2s 23ms/step - loss: 0.0830 - acc: 0.3284
33/33 [==============================] - 1s 19ms/step
67/67 [==============================] - 0s 48us/step
Epoch 1/1
67/67 [==============================] - 2s 24ms/step - loss: 0.0789 - acc: 0.2836
33/33 [==============================] - 1s 20ms/step
67/67 [==============================] - 0s 49us/step
Epoch 1/1
66/66 [==============================] - 2s 24ms/step - loss: 0.0761 - acc: 0.2879
34/34 [==============================] - 1s 19ms/step
66/66 [==============================] - 0s 49us/step
Epoch 1/1
67/67 [==============================] - 2s 24ms/step - loss: 0.0830 - acc: 0.3433
33/33 [==============================] - 1s 21ms/step
67/67 [==============================] - 0s 50us/step
Epoch 1/1
67/67 [==============================] - 2s 25ms/step - loss: 0.0789 - acc: 0.3582
33/33 [==============================] - 1s 21ms/step
67/67 [==============================] - 0s 49us/step
Epoch 1/1
100/100 [==============================] - 2s 17ms/step - loss: 0.0794 - acc: 0.3000
Best: 0.000000 using {'nnodes': 30}
0.000000 (0.000000) with: {'nnodes': 30}
0.000000 (0.000000) with: {'nnodes': 40}