【问题标题】:GridSearchCV for number of neuronsGridSearchCV 用于神经元数量
【发布时间】:2018-04-10 15:51:51
【问题描述】:

我正在尝试自己学习如何在基本的多层神经网络中对神经元数量进行网格搜索。我正在使用 Python 的 GridSearchCV 和 KerasClasifier 以及 Keras。下面的代码非常适用于其他数据集,但由于某些原因我无法使其适用于 Iris 数据集,我找不到原因,我在这里遗漏了一些东西。我得到的结果是:

Best: 0.000000 using {'n_neurons': 3} 0.000000 (0.000000) with: {'n_neurons': 3} 0.000000 (0.000000) with: {'n_neurons': 5}

from pandas import read_csv

import numpy
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import StandardScaler

from keras.wrappers.scikit_learn import KerasClassifier
from keras.models import Sequential
from keras.layers import Dense
from keras.utils import np_utils
from sklearn.model_selection import GridSearchCV

dataframe=read_csv("iris.csv", header=None)
dataset=dataframe.values
X=dataset[:,0:4].astype(float)
Y=dataset[:,4]

seed=7
numpy.random.seed(seed)

#encode class values as integers
encoder = LabelEncoder()
encoder.fit(Y)
encoded_Y = encoder.transform(Y)

#one-hot encoding
dummy_y = np_utils.to_categorical(encoded_Y)

#scale the data
scaler = StandardScaler()
X = scaler.fit_transform(X)

def create_model(n_neurons=1):
    #create model
    model = Sequential()
    model.add(Dense(n_neurons, input_dim=X.shape[1], activation='relu')) # hidden layer
    model.add(Dense(3, activation='softmax')) # output layer
    # Compile model
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model

model = KerasClassifier(build_fn=create_model, epochs=100, batch_size=10, initial_epoch=0, verbose=0)
# define the grid search parameters
neurons=[3, 5]

#this does 3-fold classification. One can change k. 
param_grid = dict(n_neurons=neurons)
grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=-1)
grid_result = grid.fit(X, dummy_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("%f (%f) with: %r" % (mean, stdev, param))

为了说明和计算效率的目的,我只搜索两个值。对于提出这么简单的问题,我深表歉意。顺便说一下,我是 Python 新手,从 R 转过来的,因为我意识到深度学习社区正在使用 python。

【问题讨论】:

  • 没有看你的代码,而是看 GridSearch for DL,真的吗?海事组织的坏主意。你放置的神经元越多(直到你遇到瓶颈),事情就会越好(理论上),但这并不意味着你的架构也很好
  • 我完全理解你。我已经用 8 个神经元运行了该模型,并获得了很好的准确性。由于我是 Python 新手,如果可能的话,我只想进行一些人工分析。
  • (1) 我不同意第一条评论。关于训练损失(和良好的拟合参数)可能是正确的,但使用 CV 这是一种可行的方法(更简单的方案可能更好)! (2) 代码不可重现,因为至少缺少数据 (3) 其他哪些数据集有效?你是如何推断他们在工作的?这个和其他的有什么区别? Iris 实际上是最简单的数据集之一,并且有可能获得完美的分数 (4) 确保您检查分数正在做它应该做的事情(分数与损失;也许使用一些明确的记分器功能)(5)检查最佳资源的预测

标签: python neural-network keras grid-search


【解决方案1】:

哈哈,这可能是我在 Stack Overflow 上经历过的最有趣的事情了 :) 检查:

grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=-1, cv=5)

您应该会看到不同的行为。您的模型获得满分的原因(就cross_entropy 具有0 而言,这相当于可能的最佳模型)是因为您没有对数据进行洗牌,并且因为Iris 包含三个平衡的类别,每个提要有一个像目标一样的类:

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 (first fold ends here) 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 (second fold ends here)2 2 2 2 2 2 2 2 2 2 2
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 2 2]

这样的问题很容易被每个模型解决 - 所以这就是为什么你有一个完美的匹配。

在此之前尝试打乱您的数据 - 这应该会导致预期的行为。

【讨论】:

  • 哦,哈哈,是的,你是对的! Geeezzz 哈哈我现在讨厌自己。你是绝对正确的。我错过了这一点,而是完全专注于方法本身。我想我对 model.fit 默认改组感到困惑。谢谢!我很抱歉!
  • 你明白了,伙计!
猜你喜欢
  • 2016-08-12
  • 2018-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-23
  • 2014-11-07
  • 1970-01-01
  • 2020-06-11
相关资源
最近更新 更多