2017-04-03 78 views
2

我正在使用與Theano一起運行的sklearn和Keras作爲其後端。我使用的是當我開始運行的最後一部分是 -爲什麼keras只有在設置爲300時纔會執行10個紀元?

Epoch 1/10 
... 
Epoch 2/10 

等下面的代碼 -

import numpy as np 
import pandas as pd 
from pandas import Series, DataFrame 
import keras 
from keras.callbacks import EarlyStopping, ModelCheckpoint 
from keras.constraints import maxnorm 
from keras.models import Sequential 
from keras.layers import Dense, Dropout 
from keras.optimizers import SGD 
from keras.wrappers.scikit_learn import KerasClassifier 
from keras.constraints import maxnorm 
from keras.utils.np_utils import to_categorical 
from sklearn.model_selection import cross_val_score 
from sklearn.preprocessing import LabelEncoder 
from sklearn.model_selection import StratifiedKFold 
from sklearn.preprocessing import StandardScaler 
from sklearn.pipeline import Pipeline 
from sklearn.model_selection import train_test_split 
from datetime import datetime 
import time 
from datetime import timedelta 
from __future__ import division 

seed = 7 
np.random.seed(seed) 

Y = data['Genre'] 
del data['Genre'] 
X = data 

encoder = LabelEncoder() 
encoder.fit(Y) 
encoded_Y = encoder.transform(Y) 

X = X.as_matrix().astype("float") 

calls=[EarlyStopping(monitor='acc', patience=10), ModelCheckpoint('C:/Users/1383921/Documents/NNs/model', monitor='acc', save_best_only=True, mode='auto', period=1)] 

def create_baseline(): 
    # create model 
    model = Sequential() 
    model.add(Dense(18, input_dim=9, init='normal', activation='relu')) 
    model.add(Dense(9, init='normal', activation='relu')) 
    model.add(Dense(12, init='normal', activation='softmax')) 
    # Compile model 
    sgd = SGD(lr=0.01, momentum=0.8, decay=0.0, nesterov=False) 
    model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy']) 
    return model 

np.random.seed(seed) 
estimators = [] 
estimators.append(('standardize', StandardScaler())) 
estimators.append(('mlp', KerasClassifier(build_fn=create_baseline, nb_epoch=300, batch_size=16, verbose=2))) 
pipeline = Pipeline(estimators) 
kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=seed) 
results = cross_val_score(pipeline, X, encoded_Y, cv=kfold, fit_params={'mlp__callbacks':calls}) 
print("Baseline: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100)) 

結果

它應該是Epoch 1/300和它工作得很好,當我在不同的筆記本上運行它。

你們認爲發生了什麼? np_epoch=300 ...

+0

這是什麼Keras版本?如果它的2.0,那麼nb_epochs被更改爲只是時代。 –

+0

做出答案。我忘了所有關於更改... – NickTheInventor

回答

8

這是什麼Keras版本?如果它大於2.0,那麼nb_epoch被更改爲只是時代。否則它默認爲10.

+0

好笑。我有凱拉斯2.0.8,當我改變nb_epoch時代,我得到**「ValueError:時代不是一個合法的參數。」**因此,他們看起來像他們改回nb_epoch。 – agcala

+0

@agcala它的時代,而不是時代。複數。 –

+0

去圖。我錯了。 – agcala

-1

我認爲什麼sklearn稱爲「時代」是你的交叉驗證的一步。所以它有10次訓練300次:-)是可能的嗎?與verbose=1

+0

我試過'verbose = 1'。所做的就是添加更多有關時代的信息,最終使程序以指數級速度運行。即使我這樣做,它仍然只有10個時代... – NickTheInventor

+0

如果你改變分裂的數量呢? –

+0

仍然不會改變任何東西。 – NickTheInventor

6

在Keras 2.0 nb_epoch參數更名爲epochs嘗試,所以當你設置epochs=300運行300個時代。如果您使用nb_epoch=300,則它將默認爲10。

0

您的問題的另一種解決方案:忘記nb_epoch(不起作用)。通過在fit_params時代:

results = cross_val_score(pipeline, X, encoded_Y, cv=kfold, 
      fit_params={'epochs':300,'mlp__callbacks':calls}) 

而且這將工作。 fit_params直接進入Fit方法,它會得到正確的時代。

0

函數中的參數名稱應該是epochs而不是nb_epochs。 雖然要非常小心。例如,我使用老式的方式來聲明參數(nb_epochs = number),並且它工作正常(iPython控制檯只顯示了一些警告),但是當我在cross_val_score function中插入相同的參數名稱時,它不起作用。

相關問題