neural networks )

RUL预测文献

最近有道友问了一下关于《Remaining useful life estimation in prognostics using deep convolution neural networks1。论文复现的问题。因此,这里简单码了一点代码。但是和论文中的模型不完全一样。论文中用的应该是2D卷积,这里直接采用1D卷积替代看看能否达到类似的效果。

文献中的DCNN模型

5层卷积+1个Flatten层+Dropout+Full-Connected层+输出层: 在这里插入图片描述

代码

供参考的模型代码

inputt=Input(shape=(x_train.shape[1],x_train.shape[2]))
x = tf.keras.layers.Conv1D(filters=10,kernel_size=10,activation='tanh',padding='same',
                           kernel_initializer='glorot_uniform')(inputt)
x = tf.keras.layers.Conv1D(filters=10,kernel_size=10,activation='tanh',padding='same',
                           kernel_initializer='glorot_uniform')(x)
x = tf.keras.layers.Conv1D(filters=10,kernel_size=10,activation='tanh',padding='same',
                           kernel_initializer='glorot_uniform')(x)
x = tf.keras.layers.Conv1D(filters=10,kernel_size=10,activation='tanh',padding='same',
                           kernel_initializer='glorot_uniform')(x)
x = tf.keras.layers.Conv1D(filters=10,kernel_size=3,activation='tanh',padding='same',
                           kernel_initializer='glorot_uniform')(x)
x = tf.keras.layers.Flatten()(x)
x = tf.keras.layers.Dropout(0.5)(x)
x = tf.keras.layers.Dense(100,activation='tanh')(x)
x = tf.keras.layers.Dense(1,activation='relu')(x)

DCNN_model=Model(inputs=inputt,outputs=x)
#查看网络结构
DCNN_model.summary()
#编译模型 RMSprop,Adam,Adadelta,Nadam,Adamax,Adagrad
"""分段学习率"""
def scheduler(epoch):
    if epoch > 200:
        return 0.0001
    else:
        return 0.001
"""打印学习率,方便查看"""
def get_lr_metric(optimizer):
    def lr(y_true, y_pred):
        return optimizer.lr#无衰减策略的学习率
    return lr

optimizer_diy =tf.keras.optimizers.Adam(learning_rate=0.001)
lr_metric = get_lr_metric(optimizer_diy)

DCNN_model.compile(optimizer=optimizer_diy,loss='mse',metrics=['mse','mae',RMSE,Scoring_2008,lr_metric]) 

完整代码

最近还是有小伙伴反映代码运行有点小问题哈,可能是keras和Tensorflow的代码混用。现在修改了一个TF2.1版本的代码,已经运行没有任何问提。https://www.aliyundrive.com/s/zWwvUjn3qNf

此外,PyTorch版本的代码做CMAPSSRUL预测,今天我也写了一份,模型可以自行修改为RNN或者一维CNN。Pytorch版本代码的特点:①包含RNN和CNN的输入类型,随意切换。②评价指标加入训练过程。③自定义学习率计划。④训练过程的早期停止。⑤ 验证测试、所有结果保存⑥还有模型的查看,参数打印等。

训练过程代码

由于论文中并没有提及验证集的划分,可能是没有使用。也有可能采用了比较有争议的做法:将测试集作为验证集,每一个epoch就预测一次。因此,我也把测试集直接放在模型的训练过程中,最后只取最好的epoch。
关于模型的训练过程中,是否需要验证集(valid data)?测试集能不能作为验证集?以及这样做带来的额问题,我推荐知乎的南开博士大佬发的一篇博客https://zhuanlan.zhihu.com/p/719612362

Batch_size=512
save_dir="../DCNN_复现/FD001_30time/002/"
if not os.path.exists(save_dir):
                os.makedirs(save_dir)

History = DCNN_model.fit(x_train, y_train, epochs=250, batch_size=Batch_size,validation_data=(x_test,y_test),
                        verbose=2,
            callbacks =[keras.callbacks.EarlyStopping(monitor ='val_loss', min_delta=0,patience=125, verbose=0, mode='min'),
                        keras.callbacks.ModelCheckpoint(os.path.join(save_dir, 'model_Weights_best.h5'),
                                                        monitor='val_loss',save_best_only=True,
                                                        save_weights_only=True, mode='min', verbose=0),
                        keras.callbacks.LearningRateScheduler(scheduler)])

损失函数可视化

在这里插入图片描述

FD001测试集整体RUL预测可视化

在这里插入图片描述

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评价指标

FD001测试集:

评价指标
MSE191.78433227539062
MAE10.294214248657227
RMSE13.84862232208252
Scoring_2008301.401123046875
跑了10次,中间有5次梯度消失。达不到论文的效果,后面试试Conv2D再看看。

  1. Li X, Ding Q, Sun J Q. Remaining useful life estimation in prognostics using deep convolution neural networks[J]. Reliability Engineering & System Safety, 2018, 172: 1-11. ↩︎

  2. 如何正确使用机器学习中的训练集、验证集和测试集? ↩︎

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐