作为自动编码器和深度学习的菜鸟,我在努力解决以下问题。 我正在尝试使用自动编码器对振动数据集执行异常检测,从nasa
的参考集开始每个数据集由单个文件组成,这些文件是以特定间隔记录的1秒振动信号快照。每个文件由20,480个点组成,采样率设置为20 kHz。
因此,该集合包含new&的数据。完整的轴承,以及承受新出现的损坏。
我使用了Keras + Tensorflow示例,使用最近的IBM example,构建了一个11层自动编码器。
2030
在IBM的文章中说:
“LSTM希望他们的输入包含时间窗口”,
此后,3轴* 3000样本的示例时间序列被划分为3 * 10块300个样本。
当在实际的nasa数据集上尝试自动编码器时,无论是OK数据,对于完整的轴承还是轴承上有实际故障的文件,我都很难找到,如何:
将我的20,480个样本文件塑造成适合培训网络的小吃或批次
决定第一层中应该有多少神经元
确定# design network
model = Sequential()
model.add(LSTM(50,input_shape=(timesteps,dim),return_sequences=True))
model.add(LSTM(50,input_shape=(timesteps,dim),return_sequences=True))
model.add(LSTM(50,input_shape=(timesteps,dim),return_sequences=True))
model.add(LSTM(50,input_shape(timesteps,dim),return_sequences=True))
model.add(LSTM(50,input_shape=(timesteps,dim),return_sequences=True))
model.add(LSTM(50,input_shape=(timesteps,dim),return_sequences=True))
model.add(LSTM(50,input_shape=(timesteps,dim),return_sequences=True))
model.add(LSTM(50,input_shape=(timesteps,dim),return_sequences=True))
model.add(LSTM(50,input_shape=(timesteps,dim),return_sequences=True))
model.add(LSTM(50,input_shape=(timesteps,dim),return_sequences=True))
model.add(LSTM(50,input_shape=(timesteps,dim),return_sequences=True))
model.add(Dense(3))model.compile(loss='mae', optimizer='adam')
def train(data):
data.shape = (s_t, timesteps, dim)
model.fit(data, data, epochs=50, batch_size=72, validation_data=(data, data), verbose=0, shuffle=False,callbacks=[LossHistory()])
data.shape = (samples, dim)
def score(data):
data.shape = (s_t, timesteps, dim)
yhat = model.predict(data)
yhat.shape = (samples, dim)
return yhat
和epochs
在神经元数量和训练次数之间取得良好的平衡,作为合理的权衡,允许进行实验,而无需花费数小时的时间。
在尝试使用几个实验选择的尺寸时,我可以通过编码器改善损耗,但可能会在尝试输入检测到实际缺陷的集合之前达到一个或多个局部最小值。
我猜想像上面这样的数据集可以像对待音频一样对待,例如:训练NN识别某个振动特征的内容,并映射知识类,如振动签名的shazam,但我不确定相似性是否足够重叠。
通常使用FFT内容识别轴承损坏,但我无法看到自动编码器在频率仓上工作,因为LSTM预计仅在时间序列数据上优越。
关于如何在上面取得进展的任何线索,将受到高度赞赏;-)
答案 0 :(得分:0)
要对频率数据使用LSTM,请计算短时傅立叶变换。在Python中,您可以使用librosa.sftf()
。您将获得一个新的时间序列,并在时间上降低了采样率(例如10ms),并且序列中的每个帧都是该小时间窗口内的频率内容(傅立叶系数)。