【问题标题】:Why is keras only doing 10 epochs when I set it to 300?当我将它设置为 300 时,为什么 keras 只执行 10 个 epoch?
【发布时间】:2017-04-03 19:08:00
【问题描述】:

我正在使用 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_epochs 更改为仅 epochs。
  • 让这个答案。我忘记了所有的变化......

标签: python neural-network keras data-science


【解决方案1】:

这是什么 Keras 版本?如果大于 2.0,则 nb_epoch 更改为仅 epochs。否则默认为 10。

【讨论】:

  • 有趣。我有 Keras 2.0.8,当我将 nb_epoch 更改为 epoch 时,我得到 "ValueError: epoch is not a legal parameter." 所以看起来他们将其改回 nb_epoch。
  • @agcala 它的时代,而不是时代。复数。
  • 看图。我的错。
【解决方案2】:

在 Keras 2.0 中,nb_epoch 参数已重命名为 epochs,因此当您设置 epochs=300 时,它会运行 300 个 epoch。如果您使用nb_epoch=300,它将默认为 10。

【讨论】:

    【解决方案3】:

    您的问题的另一种解决方案:忘记 nb_epoch(不起作用)。在 fit_params 中传递 epoch:

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

    那会奏效。 fit_params 直接进入 Fit 方法,它会得到正确的时期。

    【讨论】:

      【解决方案4】:

      函数中的参数名称应为epochs 而不是nb_epochs。 不过要非常小心。例如,我使用声明参数的老式方法 (nb_epochs = number) 训练了我的 ANN,并且它有效(iPython 控制台只向我显示了一些警告),但是当我在 cross_val_score function 中插入相同的参数名称时,它没有用。

      【讨论】:

        【解决方案5】:

        我认为 sklearn 所谓的“Epoch”是您交叉验证的一个步骤。所以它进行了 300 次训练 10 次 :-) 这可能吗?试试verbose=1

        【讨论】:

        • 我试过verbose=1。所做的只是添加更多关于时代的信息,最终使程序运行速度呈指数级下降。即使我这样做了,它仍然只执行 10 个 epoch...
        • 如果更改分割数会怎样?
        • 仍然没有改变任何东西。
        • 那10个不能凭空冒出来,换个耐心试试?
        猜你喜欢
        • 1970-01-01
        • 2019-04-27
        • 2021-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-24
        相关资源
        最近更新 更多