【发布时间】:2021-03-26 04:56:41
【问题描述】:
我正在尝试训练 ANN 执行回归。该数据集由 7 个参数的约 10k 数据点组成。我正在使用this basic regression example from Tensorflow.
但是,在训练期间,损失值从第一个 epoch 到最后一个 epoch 返回 NaN 值。我尝试了不同的正则化技术(归一化、dropout、L1/L2 权重正则化),但均未成功。
关于这可能是什么原因以及如何解决的任何建议?
下面是一些有用的code-sn-ps和图片:
型号
def build_and_compile_model(norm):
model = keras.Sequential([
norm,
layers.Dense(10, activation='relu', kernel_regularizer=regularizers.l1_l2(l1=1e-5, l2=1e-4),
bias_regularizer=regularizers.l2(1e-4),
activity_regularizer=regularizers.l2(1e-5)),
layers.Dense(1)
])
model.add(Dropout(0.2, input_shape=(6,)))
model.compile(loss='mean_absolute_error',
optimizer=tf.keras.optimizers.Adam(0.0001))
return model
dnn_model = build_and_compile_model(normalizer)
dnn_model.summary()
培训
%%time
history = dnn_model.fit(
train_features, train_labels,
validation_split=0.2,
verbose=0, epochs=100)
hist = pd.DataFrame(history.history)
hist['epoch'] = history.epoch
print(hist.head())
print(hist.tail())
# PRINT:
loss val_loss epoch
0 NaN NaN 0
1 NaN NaN 1
2 NaN NaN 2
3 NaN NaN 3
4 NaN NaN 4
loss val_loss epoch
95 NaN NaN 95
96 NaN NaN 96
97 NaN NaN 97
98 NaN NaN 98
99 NaN NaN 99
Wall time: 26.1 s
数据检查
最后一行是输出参数。
【问题讨论】:
-
您的数据集中有 inf (np.inf) 值吗?
-
检查您的数据框中是否没有任何
NaN值 -
NaN 表示您的损失已成为无限。尝试降低您的学习率(例如 0.000001 甚至为零),这样您就可以查看您的模型是否以糟糕的方式学习或者问题出在其他问题上。作为一个建议,我说删除
norm层和正则化器并尝试最简单的网络版本,直到它工作为止 -
@Yefet 我尝试使用
dataset.replace([np.inf, -np.inf], np.nan)将所有 inf 值替换为 NaN 值,但没有成功。但是,它在使用dataset.dropna(inplace=True)删除所有 NaN 值时也有效。不过,这会显着减少数据集。 NaN 值真的会以这种方式影响训练吗? -
@BDouchet 见上面的评论。它在删除所有 NaN 值时有效,但它会将数据集从 10k 数据点显着减少到 3k 数据点,从而导致训练效果不佳。我想我必须尝试训练参数才能让它发挥作用!
标签: tensorflow keras deep-learning neural-network regression