Python 神经元最佳数量的测试——Keras/Tensorflow

Python 神经元最佳数量的测试——Keras/Tensorflow,python,tensorflow,keras,Python,Tensorflow,Keras,我试图为一个简单的三层神经网络找到最佳的神经元数量。为了做到这一点,我保持了我的训练/测试分裂的随机状态,并通过中间层神经元的数量迭代。 我有6个参数,用于预测第七个使用三层-输入(6个神经元),隐藏(I个神经元)和输出(1个神经元) 然而,每次我运行它,我都会得到完全不同的答案,这些答案并不一致——让我无法回答有多少中间层是“最好的” 我使用的是一个相对较小的数据集——100个样本。网络是否使用随机权重/偏差初始化?还是我还遗漏了什么?对tensorflow/keras学习者的任何帮助都将是巨

我试图为一个简单的三层神经网络找到最佳的神经元数量。为了做到这一点,我保持了我的训练/测试分裂的随机状态,并通过中间层神经元的数量迭代。 我有6个参数,用于预测第七个使用三层-输入(6个神经元),隐藏(I个神经元)和输出(1个神经元)

然而,每次我运行它,我都会得到完全不同的答案,这些答案并不一致——让我无法回答有多少中间层是“最好的”

我使用的是一个相对较小的数据集——100个样本。网络是否使用随机权重/偏差初始化?还是我还遗漏了什么?对tensorflow/keras学习者的任何帮助都将是巨大的帮助

results = []
for i in range(1,10):
    x_train, x_test, y_train, y_test = train_test_split(x,y,test_size=0.2, random_state = 45)
    model = Sequential()
    model.add(Dense(6,input_dim = x.shape[1], activation = "relu"))
    model.add(Dense(i,activation = "relu"))
    model.add(Dense(1))
    model.compile(loss = "mean_squared_error", optimizer = "adam")
    monitor = EarlyStopping(monitor = "val_loss", min_delta = 1e-3, patience= 9000, verbose = 0, mode="auto")

    model.fit(x,y,validation_data = (x_test,y_test), callbacks = [monitor], verbose= 0, epochs = 1000)

    pred = model.predict(x_test)
    score = np.sqrt(metrics.mean_squared_error(pred,y_test))
    print ("Score (RMSE): {}".format(score))
    results.append(score)
如果有帮助的话,以下是我每次跑步得到的结果范围(我认为会有点类似):


此事件可能发生在任何神经网络项目中。当您使用相同的输入和相同数量的神经元运行模型时,您将获得不同的性能

此事件的主要原因是Python中的随机数生成器

如果要为每个模拟运行提供相同的结果,则必须设置随机数生成器的种子

例如:

random.seed(5)
在我的一个项目中,我使用以下命令:

random.seed(np.abs(noise_ratio*100))
它可以包含代码的一个变量

因此,如果我想更正您的代码:

results = []
for i in range(1,10):
    random.seed(10)
    x_train, x_test, y_train, y_test = train_test_split(x,y,test_size=0.2, random_state = 45)
    model = Sequential()
    model.add(Dense(6,input_dim = x.shape[1], activation = "relu"))
    model.add(Dense(i,activation = "relu"))
    model.add(Dense(1))
    model.compile(loss = "mean_squared_error", optimizer = "adam")
    monitor = EarlyStopping(monitor = "val_loss", min_delta = 1e-3, patience= 9000, verbose = 0, mode="auto")

    model.fit(x,y,validation_data = (x_test,y_test), callbacks = [monitor], verbose= 0, epochs = 1000)

    pred = model.predict(x_test)
    score = np.sqrt(metrics.mean_squared_error(pred,y_test))
    print ("Score (RMSE): {}".format(score))
    results.append(score)
除此之外,一些研究人员认为必须使用k-fold或运行代码十次,并给出结果的平均值作为最终结果。我建议第二种方法


写一个循环10次,并给出结果的平均值作为最终结果

抱歉花了这么长时间才回来,我做了很多测试!当与我一起使用时,将kernel_初始值设定项定义为“uniform”时,设置随机种子是有效的。谢谢
results = []
for i in range(1,10):
    random.seed(10)
    x_train, x_test, y_train, y_test = train_test_split(x,y,test_size=0.2, random_state = 45)
    model = Sequential()
    model.add(Dense(6,input_dim = x.shape[1], activation = "relu"))
    model.add(Dense(i,activation = "relu"))
    model.add(Dense(1))
    model.compile(loss = "mean_squared_error", optimizer = "adam")
    monitor = EarlyStopping(monitor = "val_loss", min_delta = 1e-3, patience= 9000, verbose = 0, mode="auto")

    model.fit(x,y,validation_data = (x_test,y_test), callbacks = [monitor], verbose= 0, epochs = 1000)

    pred = model.predict(x_test)
    score = np.sqrt(metrics.mean_squared_error(pred,y_test))
    print ("Score (RMSE): {}".format(score))
    results.append(score)