【问题标题】:Keras predict only working for one set of variablesKeras 预测仅适用于一组变量
【发布时间】:2020-11-22 04:36:00
【问题描述】:

我有一系列相关的 X 变量,我想用它们来预测 Y,其中 X 在每个系列之间略有不同。

    if train=='A':
        pred = df[['X1','X2','X3','X4','X5','X6','X7','X8','Y']]
    
    elif train=='B':
        pred = df[['X1','X2','X3','X4','X5','X6','X7','X8','Y']]
    
    elif train=='C':
        pred = df[['X1','X2','X3b','X4','X5','X6','X7','X8','Y']]
    
    elif train=='D':
        pred = df[['X1','X2','X3b','X4','X5','X6','X7','X8','Y']]
    
    elif train == 'E':
        pred = df[['X1','X2b','X3b','X4','X5','X6','X7','X8','Y']]

然后我尝试为上面的所有向量预测y,依次为'A'、'B'、'C'、'D'、'E'传递pred

    ....

    X = pred.drop(axis=1, columns=['Y'])
    # normalize data
    X = X.astype('float32') / 255.
    y = pred['Y']
    # normalize data
    y = y.astype('float32') / 255.

    network = Sequential()

    network.add(Dense(8, input_shape=(8,), activation='relu'))
    network.add(Dense(6, activation='relu'))
    network.add(Dense(6, activation='relu'))
    network.add(Dense(4, activation='relu'))
    network.add(Dense(1, activation='relu'))

    network.compile('adam', loss='mse', metrics=['mae'])

    network.fit(X, y, epochs=2)

    y_hat = network.predict(X, verbose=1)

然而,大多数时候,预测会失败,y_hat 会生成一个 0.000 数组:

[[0.]
 [0.]
 [0.]
 [0.]
 [0.]
 [0.]
 [0.]
 ..]]

除非train == 'D',当网络预测一个有意义的数组时,像这样:

[[0.00562879]
 [0.00741612]
 [0.0066563 ]
 [0.00720819]
 [0.00596035]
 [0.00612469]
 [0.00808392]
 ....]]

关于为什么我的keras 模型预测适用于“D”变量,总是在第四次迭代中以及如何解决这个问题的任何想法?对我来说毫无意义

PS:

如果我只为“D”运行模型,它也不起作用。所以看起来模型在第四次迭代后“流行起来”......所以我认为它与一些初始化过程有关......

【问题讨论】:

    标签: pandas tensorflow keras


    【解决方案1】:

    也许将Relu 切换为LeaklyReLU 可以解决问题

    从使用 Scikit-Learn、Keras 和 TensorFlow 概念、工具和技术构建智能系统的动手机器学习,Aurélien Géron,2019 年

    很遗憾,ReLU 激活函数并不完美。它存在一个被称为死亡 ReLU 的问题:在训练期间,一些神经元实际上“死亡”,这意味着它们停止输出除 0 以外的任何值。在某些情况下,您可能会发现网络的一半神经元已经死亡,尤其是如果您使用大的学习率。当一个神经元的权重被调整到其输入的加权总和对于训练集中的所有实例都是负数时,一个神经元就会死亡。发生这种情况时,它只是一直输出零,而梯度下降不再影响它,因为当输入为负时,ReLU 函数的梯度为零。

    你可以像这样使用LeaklyReLU

    from tensorflow.keras.layers import LeakyReLU # for leakly relu
    
    model.add(Dense(8, input_shape=(8,)))
    model.add(LeakyReLU(alpha=0.05))
    model.add(Dense(5))
    

    【讨论】:

    • 会试试的。你知道语法以及如何传递参数吗?我应该将其导入为from keras.layers import LeakyReLU吗?
    • 是的,就是这样:keras.layers import LeakyReLU,然后是network.add(Dense(8, input_shape=(8,), activation=LeakyReLU(alpha=0.1)))
    • @8-BitBorges :) 刚刚编辑了我的帖子,很高兴我提供了帮助 :)
    猜你喜欢
    • 1970-01-01
    • 2017-08-27
    • 2016-05-10
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多