基于LSTM的轨迹预测模型:使用Keras实现
基于LSTM的轨迹预测模型:使用Keras实现
本文介绍了一种基于LSTM的轨迹预测模型,使用Keras库实现。该模型可以根据历史轨迹数据预测未来的轨迹。
代码示例
import numpy as np
from keras.layers.core import Dense, Activation, Dropout
from keras.layers import LSTM
from keras.models import Sequential, load_model
from keras.callbacks import Callback
import keras.backend as KTF
import tensorflow as tf
import pandas as pd
import os
import keras.callbacks
import matplotlib.pyplot as plt
# 设定为自增长
os.environ['CUDA_VISIBLE_DEVICES'] = '0'
config = tf.compat.v1.ConfigProto()
config.gpu_options.allow_growth = True
session = tf.compat.v1.Session(config=config)
KTF.tf.compat.v1.keras.backend.set_session(session)
def create_dataset(data, n_predictions, n_next, split_ratio):
'''
对数据进行处理并按照split_ratio划分测试集和训练集
'''
dim = data.shape[1]
train_X, train_Y = [], []
test_X, test_Y = [], []
split_index = int(data.shape[0] * split_ratio)
for i in range(data.shape[0] - n_predictions - n_next - 1):
a = data[i:(i + n_predictions), :]
tempb = data[(i + n_predictions):(i + n_predictions + n_next), :]
b = []
for j in range(len(tempb)):
for k in range(dim):
b.append(tempb[j, k])
if i < split_index:
train_X.append(a)
train_Y.append(b)
else:
test_X.append(a)
test_Y.append(b)
train_X = np.array(train_X, dtype='float64')
train_Y = np.array(train_Y, dtype='float64')
test_X = np.array(test_X, dtype='float64')
test_Y = np.array(test_Y, dtype='float64')
return train_X, train_Y, test_X, test_Y
def NormalizeMult(data, set_range):
'''
返回归一化后的数据和最大最小值
'''
normalize = np.arange(2 * data.shape[1], dtype='float64')
normalize = normalize.reshape(data.shape[1], 2)
for i in range(0, data.shape[1]):
if set_range == True:
list = data[:, i]
listlow, listhigh = np.percentile(list, [0, 100])
else:
if i == 0:
listlow = -90
listhigh = 90
else:
listlow = -180
listhigh = 180
normalize[i, 0] = listlow
normalize[i, 1] = listhigh
delta = listhigh - listlow
if delta != 0:
for j in range(0, data.shape[0]):
data[j, i] = (data[j, i] - listlow) / delta
return data, normalize
def trainModel(train_X, train_Y):
'''
trainX,trainY: 训练LSTM模型所需要的数据
'''
model = Sequential()
model.add(LSTM(
120,
input_shape=(train_X.shape[1], train_X.shape[2]),
return_sequences=True))
model.add(Dropout(0.3))
model.add(LSTM(
120,
return_sequences=False))
model.add(Dropout(0.3))
model.add(Dense(
train_Y.shape[1]))
model.add(Activation('relu'))
model.compile(loss='mse', optimizer='adam', metrics=['acc'])
model.fit(train_X, train_Y, epochs=100, batch_size=64, verbose=1)
model.summary()
return model
if __name__ == "__main__":
train_num = 6
per_num = 1
# set_range = False
set_range = True
# 读入时间序列的文件数据
data = pd.read_csv('11112_testData.csv', sep=',').iloc[0:, 1:5].values
# data = pd.read_csv('11112_testData.csv', sep=',').values
print(data)
print('样本数:{0},维度:{1}'.format(data.shape[0], data.shape[1]))
print(data)
# 画样本数据库
plt.plot(data[:, 1], data[:, 0], c='r', label='result of recognition')
plt.legend(loc='upper left')
plt.grid()
plt.show()
# 归一化
data, normalize = NormalizeMult(data, set_range)
# print(normalize)
# 生成训练数据,并按照70:30划分训练集和测试集
train_X, train_Y, test_X, test_Y = create_dataset(data, train_num, per_num, 0.7)
print('x\n', train_X.shape)
print('y\n', train_Y.shape)
# 训练模型
model = trainModel(train_X, train_Y)
loss, acc = model.evaluate(train_X, train_Y, verbose=2)
print('Loss : {}, Accuracy: {}'.format(loss, acc * 100))
# 保存模型
np.save("traj_model_trueNorm_LSTM.npy", normalize)
model.save("./traj_model_120_LSTM.h5")
代码说明
- 数据预处理:
NormalizeMult函数对数据进行归一化处理,使不同特征之间的量纲一致,有利于模型训练。create_dataset函数将原始数据转换为适合LSTM模型训练的输入输出格式,并按照70:30的比例划分训练集和测试集。
- 模型训练:
- 使用Keras构建LSTM模型,并使用
adam优化器和mse损失函数进行训练。
- 使用Keras构建LSTM模型,并使用
- 模型评估:
- 使用训练集评估模型的损失和准确率。
- 模型保存:
- 使用
np.save保存归一化参数,以便在预测时使用。 - 使用
model.save保存训练好的模型。
- 使用
总结
本文介绍了基于LSTM的轨迹预测模型,并提供了完整的代码示例。该模型可以根据历史轨迹数据预测未来的轨迹,在交通流量预测、无人驾驶等领域具有广泛的应用前景。
注意
- 代码中的
11112_testData.csv文件需要自行准备,该文件包含时间序列数据,每一行代表一个时间点,每一列代表一个特征。 - 代码中的参数
train_num和per_num可以根据实际情况调整,分别代表预测的步长和未来预测的步长。 - 代码中使用 GPU 训练模型,如果您的电脑没有 GPU,可以将
os.environ['CUDA_VISIBLE_DEVICES'] = '0'注释掉。 - 代码中使用
tf.compat.v1版本的 TensorFlow,如果您的 TensorFlow 版本不是 v1,请根据实际情况进行修改。
希望本文能够帮助您理解基于LSTM的轨迹预测模型,并能够在实际项目中应用。
原文地址: https://www.cveoy.top/t/topic/l49s 著作权归作者所有。请勿转载和采集!