一、DAE(Denoising Autoencoders)
去噪自编码器
将能量分解任务看作一个去噪任务,即试图从其他电器产生的背景“噪声”中恢复目标电器的“清洁”电力需求信号

自编码器首先将带有噪声的输入x^~映射到一个隐藏的代理层y:
其中x为目标电器的电力信号,x^~为总信号(带有噪声的信号),其余电器的电力信号被看作需要消除的噪声
在解码过程中,将之前获得的隐藏代理y映射回,在输入空间中重构一个d维向量z
LH(x,z)为重建损失,用于测量重建误差。通过训练优化θ和θ’以减小损失
使用一个比输入维度更小的代码层来实现

一种DAE:
1. Input (length determined by appliance duration)
2. 1D conv (filter size=4, stride=1, number of filters=8, activation function=linear, border mode=valid)
3. Fully connected (N=(sequence length) ×8, activation function=ReLU)
4. Fully connected (N=128; activation function=ReLU)
5. Fully connected (N= (sequence length) ×8, activation function=ReLU)
6. 1D conv (filter size=4, stride=1, number of filters=1, activation function=linear, border mode=valid)
第一层使用卷积是希望网络学习低级的特征检测器,能够均衡的应用于整个输入窗口
最后一层是做一个“反褶积(
deconvolution)”重建数据
参考:
python代码实现:
# Creates the DAE model
model = Sequential() #搭建神经网络
# 1D Conv
model.add(Conv1D(8, 4, activation="linear", input_shape=(time_stamp, 1), padding="same", strides=1)) #第一层要写input_shape
model.add(Flatten())
# Fully Connected Layers
model.add(Dropout(0.2)) #选择一定数量神经元停止工作,增强泛化,减少过拟合
regu_l1 = l1(1e-4)
model.add(Dense((time_stamp-0)*16, activation='relu', activity_regularizer=regu_l1))
model.add(Dropout(0.2))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense((time_stamp-0)*16, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense((time_stamp-0)*8, activation='relu'))
# 1D Conv
model.add(Reshape(((time_stamp-0), 8)))
model.add(Conv1D(1, 4, activation="linear", padding="same", strides=1))

问题
窗口重叠时早期采用计算重叠部分的均值进行处理。这个解决方案的问题是,当一个激活仅部分地包含在滑动窗口中时,那么网络往往会低估输出信号的值。随着窗口的滑动,估计值会逐渐增加,但重叠部分会产生一个总体低估的信号,且随着窗口的滑动,误差会增加。
改进DAE(带中值滤波)
文章中提出可以使用中值滤波代替平均值进行处理。具体来说,由于重叠窗口的功率变化相对较小,所以重叠窗口的输出值可以用一定大小的邻域内所有值的统计中值来代替。使用中值能够保留更大的值


step 1:编码
1、使用一个或多个一维卷积层对输入的数据进行处理,生成一组特征映射
2、每个卷积层都会依次经过一个线性激活函数、一个最大池化层、一个额外的卷积层、一个池化层。形成一个
全连接的多层感知机
3、全连接层使用ReLU函数作为激活函数
step 2:解码
4、通过解卷积(deconvolution)对全连接的多层感知机进行上采样
5、对4结果进行向上池化(Up-pooling 最大池化的逆过程)
6、通过解卷积继续对5的结果进行上采样,获得已解码和重建的降噪信号