【问题标题】:Low results after half of dataset in keras modelkeras 模型中一半数据集后的低结果
【发布时间】:2021-04-21 11:36:03
【问题描述】:

我想制作一个神经网络(使用 keras、sklearn、tensorflow)来预测给定数据集(1 个维度数组)的第 (n+1) 个值。因此,例如,如果我有一个列表 [2,3,12,1,5,3] 作为输入,我想得到一个 [2,3,12,1,5,3,x] 作为输出。

这是我的真实样本和预测: https://i.stack.imgur.com/ZwpjD.png

我对这个结果并不满意,在一半的样本之后,我的预测几乎变成了常数函数。有人可以帮助我了解在 X 一半之后导致这种“恒定异常”的原因是什么。

可能是因为:

  • 神经网络结构
  • 少量训练样本(50-80)
  • 非常多样化的输入数据集

这是我的设置:

    def compile_model(self):
        self.model.compile(
            optimizer=keras.optimizers.Adam(),  # Optimizer
            loss=keras.losses.mean_squared_error,
        )

    def fit_model(self, verbose=0):
        return self.model.fit(
            self.train_x[:int(len(self.train_x) * 0.66)],
            self.train_y[:int(len(self.train_x) * 0.66)],
            epochs=900,
            # steps_per_epoch=10,
            batch_size=10,
            verbose=verbose,
            validation_data=(self.train_y[int(len(self.train_x) * 0.66):],
                             self.train_x[int(len(self.train_x) * 0.66):])
        ).history

结构:

  def setup_model(self):
        self.model.add(Dense(99, input_dim=1, activation='tanh', kernel_initializer='he_uniform'))
        self.model.add(Dense(256, activation='tanh', kernel_initializer='he_uniform'))
        self.model.add(Dense(90, activation='tanh', kernel_initializer='he_uniform'))
        self.model.add(Dropout(0.2))
        self.model.add(Dense(45, activation='tanh', kernel_initializer='he_uniform'))
        self.model.add(Dense(20, activation='tanh', kernel_initializer='he_uniform'))
        self.model.add(Dense(10, activation='tanh', kernel_initializer='he_uniform'))
        self.model.add(Dense(1, activation='tanh', kernel_initializer='he_uniform'))

【问题讨论】:

  • 由于您正在尝试预测线性值,因此请尝试从最后一个密集层中删除 tanh 激活。这可能会有所帮助。
  • 您为什么要在整个网络上使用 tanh 激活?你知道它会带来什么后果吗?
  • @Dr.Snoopy 好吧,我注意到这给出了最小的损失(mse)。好吧,我还实施了本地搜索,以找到激活和每层神经元数量之间的一些良好组合。不过好像这个带唐的更好一些。
  • @Frightera 好吧,你想把它改成什么?到 Sigmoid?
  • Tanh 和 sigmoid 导致梯度消失,这不是现代神经网络使用的激活。

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


【解决方案1】:

已解决:我使用简单的 f(x)=y 依赖项进行预测,因此我的模型仅基于日索引进行学习,例如 f(0)=123,f(1)=124。我所做的是将列表 [2,3,12,1,5,3] 分成几部分: x=[2,3,12],y=1 ; x=[3,12,1],y=5 ; x=[12,1,5],y=3;现在我的神经网络学习基于少数样本,这让我用更少的样本获得了完美的结果,如果我想知道列表的 n+1 值是 x=[1,5,3],我的预测 x 是 x=[1,5,3] 从这几天我可以得到更好的结果。

【讨论】:

    猜你喜欢
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 2021-08-12
    • 2021-12-26
    • 2019-05-24
    • 1970-01-01
    相关资源
    最近更新 更多