我正在使用与Theano一起运行的sklearn和Keras的组合作为其后端。我正在使用以下代码 -
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
...
答案 0 :(得分:12)
这是什么Keras版本?如果它大于2.0,那么nb_epoch就变成了epochs。否则它默认为10。
答案 1 :(得分:7)
在Keras 2.0中,nb_epoch
参数已重命名为epochs
,因此当您设置epochs=300
时,它会运行300个纪元。如果您使用nb_epoch=300
,则默认为10。
答案 2 :(得分: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方法,它将获得正确的时代。
答案 3 :(得分:0)
您的函数中的参数名称应为epochs
而不是nb_epochs
。
但是要非常小心。例如,我用传统的方式来训练我的ANN来声明参数(nb_epochs = number
),并且它工作(iPython控制台只向我显示了一些警告),但当我在{{中插入相同的参数名称时1}},它不起作用。
答案 4 :(得分:-1)
我认为sklearn称之为" Epoch"是您的交叉验证的一步。所以它有300次训练10次:-)可能吗?试试verbose=1