在神经网络中找到最佳学习率和时期

时间:2019-11-25 18:27:57

标签: python tensorflow machine-learning keras neural-network

我创建了一个单层神经网络,其中有两个输出(每个类分别为0或1),并且通过Sigmoid方法和SGD优化器进行了训练。我还训练了没有任何隐藏层的NN。此外,我已经使用StratifiedKFold进行了4次拆分,验证了模型的性能。训练后的模型的设计具有lr = 0.1和epochs = 150,但是,我不知道这些值是否在优化模型。因此,我想运行20种学习率参数和历元的组合,以查看最准确的结果,并从中获得这些参数的组合。低于限制:

  • 时期:介于10和150之间的值
  • 学习率:介于0.01和1之间的值

请,请参见下面的代码:

from sklearn.model_selection import StratifiedKFold
from keras.models import Sequential
from keras.layers.core import Dense
from keras import layers
from keras.optimizers import SGD
from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.model_selection import cross_val_score

#Function to create the NN model
def create_model():    
    #Neural Network model
    ann = Sequential()
    #Number of columns of training dataset
    n_cols = x_train.shape[1]
    #Output
    ann.add(Dense(units=1,activation='sigmoid',input_shape=(n_cols,)))
    #SGD Optimizer
    sgd = SGD(lr=0.1)
    #Compile with SGD optimizer and binary_crossentropy
    ann.compile(optimizer=sgd,
                loss='binary_crossentropy',
                metrics=['accuracy'])
    return ann

#Creating the model
model=KerasClassifier(build_fn=create_model,epochs=150,batch_size=10,verbose=0)
#Evaluating the model using StratifiedKFold
kfold = StratifiedKFold(n_splits=4, shuffle=True, random_state=2)
results=cross_val_score(model,x_train,y_train,cv=kfold)
#Accuracies
print(results)

要创建由学习率和时期构成的20种组合,首先,我创建了lr和时期的随机值:

   #Epochs
   epo = np.random.randint(10,150)
   #Learning Rate
   learn = np.random.randint(0.01,1)

我的问题是,我不知道如何将其拟合到NN的代码中,才能找到哪种组合能够提供最佳的模型准确性。

2 个答案:

答案 0 :(得分:1)

无需优化您可以轻松使用的提前停止的时间段数,当您的损失或准确性没有改善时,该时间段将停止 因此只需将您的历元设置为一个大数字(例如300)并添加:

keras.callbacks.callbacks.EarlyStopping(monitor='val_loss', min_delta=0.1)

您还可以通过以下方式调用最佳权重(在模型开始过拟合之前):

restore_best_weights=True

答案 1 :(得分:0)

首先在create_model()函数中,定义了将学习率作为参数传递给的优化程序:

#SGD Optimizer
sgd = SGD(lr=0.1)

这是优化过程的起始学习率,从这一点出发,优化器将处理最佳学习率。 不过,您可以在循环中重复调用create_model()函数并将一个学习率参数传递给循环,以传递几个初始学习率。

此外,正如parsa所说,选择正确的纪元号是基于验证结果的,该结果显示了模型过度拟合的地方。关键是,纪元数达到了最佳。