【问题标题】:Finding the optimum learning rate & epochs in a Neural Network在神经网络中找到最佳学习率和时期
【发布时间】:2019-11-25 18:27:57
【问题描述】:

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

  • epochs: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)

为了创建由学习率和 epochs 组成的 20 个组合,首先,我创建了 lr 和 epochs 的随机值:

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

我的问题是我不知道如何将其放入 NN 的代码中,以便找出哪个组合可以提供模型的最佳精度。

【问题讨论】:

  • 你看过hparams吗?
  • @learner 是的,但没办法,或者我没看到

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


【解决方案1】:

没有必要优化您可以轻松使用的时期数 所以只需将您的时期设置一个大数字(例如 300 )并添加:

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

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

restore_best_weights=True

【讨论】:

  • 嗨@parsa,这听起来不错,但是这是代替cross_val_score吗?我应该如何修改代码?
  • @Panri93 嗯,不完全是。由于消耗了很多过程,你需要计算一个 cross_val_score,你无法在深度神经网络中做到这一点。因此,您可以使用一些函数和参数来找到最佳值,例如,您可以使用下降 lr 等等。希望我能帮忙
  • @Panri93 有几种方法可以修改您的代码。使用回调是其中之一,您可以在此处通过示例找到它们:“keras.io/callbacks”或者您可以使用 tensorboard,它将帮助您改进代码
【解决方案2】:

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

#SGD Optimizer
sgd = SGD(lr=0.1)

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

此外,正如 parsa 所说,选择正确的 epoch 数是基于验证结果,它显示了您的模型在哪里过度拟合。有一点是,纪元数达到最佳的地方。

【讨论】:

    猜你喜欢
    • 2016-10-27
    • 2019-01-12
    • 2016-07-11
    • 2020-05-15
    • 2016-05-01
    • 2014-06-07
    • 2012-07-09
    • 1970-01-01
    • 2016-05-25
    相关资源
    最近更新 更多