自动编码器用于时间序列振动数据异常检测的数据比例是多少
What proportions of data to feed an auto-encoder for abnormality detection on time series vibration data
作为自动编码器和深度学习的菜鸟,我遇到了以下问题。
我正在尝试使用自动编码器对振动数据集执行异常检测,从 nasa
的参考集开始
每个数据集由单独的文件组成,这些文件是按特定时间间隔记录的 1 秒振动信号快照。每个文件包含 20,480 个点,采样率设置为 20 kHz。
因此该集合包含新轴承和完整轴承的数据,以及出现损坏的轴承。
我使用了一个 Keras + Tensorflow 示例,这个最近的 IBM example 构建了一个 11 层自动编码器。
# 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
IBM 文章中指出:
"LSTMs want their input to contain windows of times",
在此之后,3 轴 * 3000 个样本的示例时间序列被分成 3*10 个块,每块 300 个样本。
当在实际的 nasa 数据集上尝试使用自动编码器时,无论是好的数据,完整的轴承还是轴承上有实际故障的文件,我都很难了解如何:
将我的 20,480 个示例文件整理成小块或批次,适合训练网络
决定第一层应该有多少个神经元
确定epochs
和batch_size
在神经元数量和训练运行次数之间找到一个良好的平衡,作为一种合理的权衡,允许进行实验,而不需要花费数小时的迭代时间。
在尝试使用几个实验选择的维度进行实验时,我能够通过编码器改善损失,但在尝试为一组检测到的实际缺陷提供数据之前,可能会达到一个或多个局部最小值。
我可能会猜测像上面这样的数据集可以像音频片段一样处理,例如训练 NN 识别特定振动特征的内容,并根据已知 类 进行映射,就像振动特征的 shazam,但我不确定相似性是否足够重叠。
通常使用 FFT 内容识别轴承损坏,但我看不到自动编码器在频率仓上工作,因为预计 LSTM 仅在时间序列数据上表现出色。
任何有关如何在上述过程中取得进展的线索,将不胜感激 ;-)
要在频率数据上使用 LSTM,请计算短时傅里叶变换。在 Python 中,您可以使用 librosa.sftf()
。您将获得一个新的时间序列,其时间采样率降低(比如 10 毫秒),序列中的每一帧都是那个小 window 时间内的频率内容(傅里叶系数)。
作为自动编码器和深度学习的菜鸟,我遇到了以下问题。 我正在尝试使用自动编码器对振动数据集执行异常检测,从 nasa
的参考集开始每个数据集由单独的文件组成,这些文件是按特定时间间隔记录的 1 秒振动信号快照。每个文件包含 20,480 个点,采样率设置为 20 kHz。
因此该集合包含新轴承和完整轴承的数据,以及出现损坏的轴承。
我使用了一个 Keras + Tensorflow 示例,这个最近的 IBM example 构建了一个 11 层自动编码器。
# 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
IBM 文章中指出:
"LSTMs want their input to contain windows of times",
在此之后,3 轴 * 3000 个样本的示例时间序列被分成 3*10 个块,每块 300 个样本。
当在实际的 nasa 数据集上尝试使用自动编码器时,无论是好的数据,完整的轴承还是轴承上有实际故障的文件,我都很难了解如何:
将我的 20,480 个示例文件整理成小块或批次,适合训练网络
决定第一层应该有多少个神经元
确定
epochs
和batch_size
在神经元数量和训练运行次数之间找到一个良好的平衡,作为一种合理的权衡,允许进行实验,而不需要花费数小时的迭代时间。
在尝试使用几个实验选择的维度进行实验时,我能够通过编码器改善损失,但在尝试为一组检测到的实际缺陷提供数据之前,可能会达到一个或多个局部最小值。
我可能会猜测像上面这样的数据集可以像音频片段一样处理,例如训练 NN 识别特定振动特征的内容,并根据已知 类 进行映射,就像振动特征的 shazam,但我不确定相似性是否足够重叠。
通常使用 FFT 内容识别轴承损坏,但我看不到自动编码器在频率仓上工作,因为预计 LSTM 仅在时间序列数据上表现出色。
任何有关如何在上述过程中取得进展的线索,将不胜感激 ;-)
要在频率数据上使用 LSTM,请计算短时傅里叶变换。在 Python 中,您可以使用 librosa.sftf()
。您将获得一个新的时间序列,其时间采样率降低(比如 10 毫秒),序列中的每一帧都是那个小 window 时间内的频率内容(傅里叶系数)。