2017-10-29 4 views
1

나는 기본적인 다중 계층 신경망에서 뉴런의 수를 그리드 검색하는 방법을 스스로 배우려고합니다. 나는 Keras뿐만 아니라 Python의 GridSearchCV와 KerasClasifier를 사용하고 있습니다. 아래의 코드는 다른 데이터 세트에서도 잘 작동하지만 몇 가지 이유로 아이리스 데이터 세트에서 작동하지 않을 수 있습니다. 이유를 찾을 수 없기 때문에 여기에서 뭔가 빠져 있습니다. 내가 얻을 결과는 : 나는 두 값 만 검색 그림의 목적과 계산 효율성을 위해뉴런 수에 대한 GridSearchCV

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)) 

. 나는 그런 간단한 질문을하는 것에 대해 진심으로 사과드립니다. 저는 Deep Learning 커뮤니티가 파이썬을 사용하고 있다는 것을 깨달았 기 때문에 Python을 처음 사용하고 R에서 전환했습니다.

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

을 당신은 다른 동작을 볼 수 :

+1

코드를 보지 않았지만 GridSearch에서 DL을 찾았습니까? 나쁜 생각 IMO. 더 많은 뉴런을 넣을 때까지 (병목 현상이 발생할 때까지), 더 나은 것들이 (이론적으로)있을 것입니다. 그렇다고해서 당신의 아키텍처가 좋다는 것을 의미하지는 않습니다. – Nain

+0

전적으로 당신을 이해합니다. 나는 이미 8 개의 뉴런을 가진 모델을 실행했고 좋은 정확도를 얻었다. 필자는 Python을 처음 사용하기 때문에 가능한 경우 인공적인 분석을 수행하려고합니다. –

+0

(1) 첫 번째 의견이 없습니다. 그것은 훈련 손실 (그리고 좋은 fitting-params)에 관해서는 사실일지도 모르지만 그것은 CV를 사용하여 실행 가능한 접근법 (더 간단한 계획이 더 좋을 수있는 곳)입니다! (2) 적어도 데이터가 누락되어 코드가 재생성되지 않습니다 (3) 다른 데이터 세트가 작동하는 이유는 무엇입니까? 당신은 그들이 일하고 있다는 것을 어떻게 추론 했습니까? 이 제품과 다른 제품의 차이점은 무엇입니까? 아이리스는 실제로 가장 간단한 데이터 세트 중 하나이며 완벽한 점수가 가능합니다. (4) 스코어가 스코어를 확인하는지 확인하십시오 (점수 대 손실, 아마도 일부 스코어러 기능 사용). – sascha

답변

1

는 하하, 이것은 아마 내가 스택 오버플로에 경험 한 재미있는 일이 :) 확인합니다. 귀하의 모델이 완벽한 점수를 얻는 이유는 (cross_entropy0이 최고의 모델과 동일 함) 귀하의 데이터를 섞어 보지 않았으며 Iris은 3 개의 균형 잡힌 수업으로 구성되어 있기 때문에 각 피드에 타겟 :

[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] 

이러한 문제는 모든 모델에서 쉽게 해결할 수 있으므로 완벽한 일치를 얻었습니다.

전에 데이터를 섞어보십시오. 예상되는 동작이 발생해야합니다.

+0

오, 롤 예, 맞습니다! Geeezzz 하하 나는 이제 나 자신이 싫어. 너가 확실히 맞아. 나는 그 시점을 놓쳤다. 대신에 방법 자체에 완전히 집중했다. 나는 기본적으로 모델과 혼동을 일으켰다 고 생각한다. 고맙습니다! 그리고 나는 미안하다! –

+0

당신은 그것을 얻었다, 친구! –