import numpy as np import tensorflow as tf import matplotlib.pyplot as plt HIDDEN_SIZE = 200 # LSTM中隐藏节点的个数。 NUM_LAYERS = 5 # LSTM的层数。 TIMESTEPS = 10 # 循环神经网络的训练序列长度。 train_data_len = 10000 # 训练数据个数。 test_data_len = 1000 # 测试数据个数。 period_sin = 0.01 # 采样间隔。 def generate_data(seq): X = [] y = [] for i in range(len(seq) - TIMESTEPS): X.append([seq[i: i + TIMESTEPS]]) y.append([seq[i + TIMESTEPS]]) return np.array(X, dtype=np.float32), np.array(y, dtype=np.float32) def lstm_model(): model = tf.keras.Sequential() model.add(tf.keras.layers.LSTM(HIDDEN_SIZE, return_sequences=False, input_shape=(TIMESTEPS, 1))) model.add(tf.keras.layers.Dense(1)) # 输出层 model.compile(optimizer='adam', loss='mean_squared_error') return model def train(model, train_X, train_y): model.fit(train_X, train_y, batch_size=32, epochs=30) def predict_future(model, initial_input, future_steps=1000): predictions = [] input_seq = initial_input for _ in range(future_steps): pred = model.predict(input_seq) predictions.append(pred[0, 0]) input_seq = np.roll(input_seq, -1, axis=1) input_seq[0, -1, 0] = pred return np.array(predictions) test_start = (train_data_len + TIMESTEPS) * period_sin test_end = test_start + (test_data_len + TIMESTEPS) * period_sin # 创建训练集数据 train_X, train_y = generate_data(np.sin(np.linspace( 0, test_start, train_data_len + TIMESTEPS, dtype=np.float32)) + 2 * np.cos(np.linspace( 0, test_start, train_data_len + TIMESTEPS, dtype=np.float32))) test_X, test_y = generate_data(np.sin(np.linspace( test_start, test_end, test_data_len + TIMESTEPS, dtype=np.float32)) + 2 * np.cos(np.linspace( 0, test_start, test_data_len + TIMESTEPS, dtype=np.float32))) train_X = train_X.squeeze(axis=1) test_X = test_X.squeeze(axis=1) train_X = np.expand_dims(train_X, axis=-1) test_X = np.expand_dims(test_X, axis=-1) model = lstm_model() train(model, train_X, train_y) last_input = test_X[-1:] future_predictions = predict_future(model, last_input, future_steps=1000) future_time = np.linspace(test_end, test_end + 1000 * period_sin, 1000) future_real_values = np.sin(future_time) + 2 * np.cos(future_time) plt.figure(figsize=(10, 6)) plt.plot(future_predictions, label='Predicted Future Values', color='r') plt.plot(future_real_values, label='Real Future Values (sin)', color='b', linestyle='--') plt.legend() plt.xlabel('Time (s)') plt.ylabel('Displacement (um/Hz^1/2)') plt.title('Prediction vs. Real Values for Future Data') plt.show()