【发布时间】: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