正如之前所说的,在研究深度学习做负荷辨识时,我们更应该关注的是网络的输入和输出分别是什么。如果大家想发文章的话,或许这个远比你的网络结构来的重要。毕竟网络你只需要换一换就不一样了。神经网络做分类时,输出一般是固定的,也就是01向量。而输入则“五花八门”,常见的有各种各样的特征值组成的向量,有图像特征(一般是VI轨迹),还有采样序列,但这并不能限制研究者们的创造力,研究者们开始研究以下几种组合:1)将特征值和图像特征直接融合,即输入是向量和图像数据;2)将特征值用热码表示,并和图像矩阵拼接起来,输入仍然是图像;3)输出不局限于类别,可以同时输出分类和分解的结果等。本篇仅取其中两种情况作为示范。
当特征值作为输入时,这类算法就和机器学习类似。首先也是获得特征样本数据,然后将标签和特征拼接在一起。不同的地方在于,深度学习还需要对模型的输出做处理,将标签的1,2,3...处理成[1,0,0,...]、[0,1,0,...]、[0,0,1,0,...]。深度学习的理论我就不赘述了。
这里取4种电器为例。代码不一定要这么写,我这里是简单处理,若有很多种类别,不应该这么写,而是先创建一个空的list或者数组,然后在指定位置写1,其他位置为0。
def label_convert(labels):
Labels = []
# 将标签转化为一个0-1向量,标签作为1出现的位置。(表示神经网络输出层第i个神经元)
for label in labels:
if label == 1:
Labels.append([1, 0, 0, 0])
elif label == 2:
Labels.append([0, 1, 0, 0])
elif label == 3:
Labels.append([0, 0, 1, 0])
else:
Labels.append([0, 0, 0, 1])
return np.array(Labels)
结果如下:
因为数据比较简单,所以我直接用多层感知机(BP神经网络)就足够了。
def BP_NN(num_input, num_output):
model = Sequential()
model.add(Dense(32, activation='relu',input_shape=(num_input,)))
model.add(Dropout(0.5))
# Fully Connected Layers
model.add(Dense(32, activation='relu'))
model.add(Dense(num_output, activation='softmax'))
return model
保存每一步的训练参数,又或者使用早停机制。
取训练时最好的网络。先初始化网络,然后将对应的参数文件输入网络。然后直接预测测试数据即可。
数据处理部分与2中的代码一样。下面展示所用电器的采样波形。
冰箱
吹风机
微波炉低档位
微波炉高档位
电灯
网络借鉴负荷分解的典型网络seq2point,将其修改为分类网络。
相比于2中的训练,这个网络训练收敛的更快,结果更好。
对深度学习做负荷辨识的研究不多,我认为难点可能是确定输入的形式,以及找到合适的网络实现它。之后若有更深的理解,我会回来补充。