簡體   English   中英

為什么當我把它設置為300時keras只做了10個時代?

[英]Why is keras only doing 10 epochs when I set it to 300?

我正在使用sklearn和Keras的組合與Theano作為后端運行。 我正在使用以下代碼 -

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/10
...
Epoch 2/10

等等

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

你們認為發生了什么? np_epoch=300 ...

什么Keras版本是這個? 如果它大於2.0,那么nb_epoch就變成了epochs。 否則它默認為10。

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

問題的另一個解決方案 :忘掉nb_epoch(不起作用)。 在fit_params中傳遞時期:

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

那會有用。 fit_params直接進入Fit方法,它將獲得正確的時代。

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

我認為sklearn所說的“Epoch”是你的交叉驗證的一步。 所以它有300次訓練10次:-)可能嗎? 嘗試使用verbose=1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM