采用LSTM模型预测物体损伤加速度

                                                               采用LSTM模型预测物体损伤加速度

                                                                                                                   ------楼房混凝土损伤加速度预测为例

        物体暴露在外界环境中或多或少的都会受到静力的破坏或者自身结构损伤的影响。因此,物体的损坏程度在相关领域都会采用一些方法或者手段进行测量,所以都会有一个可计数的衡量标准。当物体在不受外界因素的影响下时,(或者说不受自然因素影响时,其物体内部的损伤程度是和自身材料性质是相关的,基本都会有一个可以拟合的损伤曲线图-损伤快慢与物体材料性质相关)。当该物品被放到空气中,受多方面因素影响时,其损伤的曲线特征将不在能够进行可公式拟合预测了。我们以楼房损伤的加速度为例进行讲解。

     当一栋大厦在建好后,在不受物力冲击力(例如:爆破/施工等相关)的影响后,其楼房/大坝等在自然环境下会受日晒雨淋的影响。其损伤的程度将不在按照混凝土本身预期的加速度。为了能够预测楼房/大坝等在建成后其损伤加速度,我们打算引入具有时间序列的LSTM模型进行预测。为了能够更好的进行训练模型,我们收集了某个水库大坝其结构损伤加速度的数据。其数据如下所示:

[[[0.68580303]]
 [[0.57895305]]
 [[0.48873176]]
 [[0.43342541]]
 [[0.40326111]]
 [[0.37377471]]
 [[0.33626879]]
 [[0.30774234]]
 [[0.30598   ]]
 [[0.32385629]]
。。。。。

为了能够实现lstm模型进行预测,我们首先进行读取数据:

df = pd.read_csv("nodemage.csv")
data = np.array(df['speed'])

然后对数据进行标准化预处理:这是一方面是为了加快模型的训练速度,另一个方面是为了更好的拟合模型。

data=data.reshape(-1,1)
scaler = MinMaxScaler(feature_range=(0, 1))
normalize_data= scaler.fit_transform(data)

构建数据集是为了能够进行单维度的预测,其代码入下:

for i in range(len(train_data) - time_step - 1):
    x = train_data[i:i + time_step]
    y = train_data[i + time_step:i + time_step + 1]
    train_x.append(x.tolist())
    train_y.append(y.tolist())

最后,构建模型进行预测。

def rmse_koss(y_true, y_pred):#自定义损失函数
    return K.sqrt(K.mean(K.square(y_pred - y_true), axis=-1))*2
model = Sequential()
#model.add(LSTM(100, input_shape=(train_X.shape[1], train_X.shape[2])))
model.add(LSTM(50, activation='sigmoid',input_shape=(train_X.shape[1], train_X.shape[2]), return_sequences=False))
# model.add(LSTM(20))
model.add(Dense(1,activation='linear'))
model.compile(loss=rmse_koss, optimizer='adam')
# fit network
history =model.fit(train_X, train_y, epochs=250, batch_size=200,verbose=1,validation_data=(test_X, test_y))

其损伤函数图如下图所示:

                                          

但是在最后进行输出的时候,千万别忘了进行反归一化,将预测出的结果进行还原。其代码如下所示:

trainPredict_dataset_like = zeros(shape=(len(trainPredict),normalize_data.shape[1]))
trainPredict_dataset_like[:, 0] = trainPredict[:, 0]
inv_trainPredict = scaler.inverse_transform(trainPredict_dataset_like)[:, 0]
print("trainPredict_value")
print(inv_trainPredict)

最后,我们为了方便观察模型的预测结果的好坏,我们分别在一个图上画出了真实值real_value/模型训练输出值train_value和拟合预测输出值test_value.

在这里我将不在给出其RMSE和MSE的指标了,大家可以自行去复现该方法。相关问题可以联系:525894654

发布了38 篇原创文章 · 获赞 192 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/weixin_40651515/article/details/96302745