我正在尝试建立一个机器学习模型来对带有随机噪声的直线进行去噪。这里有一些例子。红点是标签,蓝点是训练数据。每个时间序列数据的长度为 100。
我使用如下模型拟合数据。
model = tf.keras.Sequential()
model.add(tf.keras.layers.LSTM(8, activation='tanh', input_shape = (100,1),return_sequences=True))
model.add(tf.keras.layers.Dense(8, activation='relu'))
model.add(tf.keras.layers.Dense(1, activation='linear'))
model.summary()
Model: "sequential_18"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
lstm_18 (LSTM) (None, 100, 8) 320
_________________________________________________________________
dense_36 (Dense) (None, 100, 8) 72
_________________________________________________________________
dense_37 (Dense) (None, 100, 1) 9
=================================================================
Total params: 401
Trainable params: 401
Non-trainable params: 0
_________________________________________________________________
该模型可以去除大量噪声,但输出不如直线平滑,因此我正在考虑将 1D 拉普拉斯运算应用于最后一个密集层以对其输出进行正则化。这是我写的。
class Laplacian1D(tf.keras.regularizers.Regularizer):
def __init__(self,alpha=0.1):
self.alpha = alpha
def __call__(self,x):
kernel = tf.constant([-1.0,2.0,-1.0],shape=(3,1,1))
dx = tf.nn.conv1d(x,filters=kernel,stride=1,padding='VALID')
penalty = self.alpha*tf.math.reduce_mean(tf.math.square(dx))
return penalty
def get_config(self):
return {'alpha': float(self.alpha)}
然后我将它用作最后一个密集层的活动正则化器。但是,经过几个小批量后,损失总是变成nan 。如果我的代码有问题或者 keras/tensorflow 不支持这种正则化,我不会这样做,因为拉普拉斯算子涉及多个输出,而不仅仅是一个。谁能解释这里发生了什么?