【发布时间】: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