重庆做网站,企业建站都有什么网站,codeus wordpress,酷家乐在线3d云设计平台train_encoder_decoder.py
#__future__ 模块提供了一种方式#xff0c;允许开发者在当前版本的 Python 中使用即将在将来版本中成为标准的功能和语法特性。此处为了确保代码同时兼容Python 2和Python 3版本中的print函数
from __future__ import print_function # 导入标准库…train_encoder_decoder.py
#__future__ 模块提供了一种方式允许开发者在当前版本的 Python 中使用即将在将来版本中成为标准的功能和语法特性。此处为了确保代码同时兼容Python 2和Python 3版本中的print函数
from __future__ import print_function # 导入标准库和第三方库#os 是一个标准库模块全称为 operating system用于提供与操作系统交互的功能。导入os.path模块用于处理文件和目录路径
import os.path
#从os模块中导入了path子模块可以直接使用path来调用os.path中的函数上面的代码可以不用写
from os import path #导入了sys模块用于系统相关的参数和函数
import sys
#导入了math模块提供了数学运算函数
import math
#导入了NumPy库并使用np作为别名NumPy是用于科学计算的基础库
import numpy as np
#导入了Pandas库并使用pd作为别名Pandas是用于数据分析的强大库
import pandas as pd # 导入深度学习相关库
# keras 是一个机器学习和深度学习的库。backend 模块提供了对底层深度学习框架如TensorFlow、Theano等的访问接口使得在不同的后端之间进行无缝切换变得更加容易。
import tensorflow as tf # 导入了Keras的backend模块并使用K作为别名用于访问后端引擎的函数
from keras import backend as K
# Model 类在 Keras 中允许用户以函数式 API 的方式构建更为复杂的神经网络模型。通过使用 Model 类可以自由地定义输入层、输出层和中间层并将它们连接起来形成一个完整的模型。
from keras.models import Model # 1. LSTM (Long Short-Term Memory) 和 GRU (Gated Recurrent Unit) 都是循环神经网络 (RNN) 的变体可以用来学习长期依赖关系用于处理序列数据。
# 2. 在处理序列数据时经常需要将某个层如 Dense 层应用于序列中的每一个时间步。TimeDistributed 可以将这样的层包装起来使其能够处理整个序列。
# 3. 在函数式 API 中可以使用 Input 来定义模型的输入节点指定输入的形状和数据类型。
# 4. 在神经网络中Dense 层是最基本的层之一每个输入节点都与输出节点相连用于学习数据中的非线性关系。
# 5. RepeatVector接受一个 2D 张量作为输入并重复其内容 n 次生成一个3D张量用于序列数据处理中的某些操作例如将上下文向量重复多次以与每个时间步相关联。
from keras.layers import LSTM, GRU, TimeDistributed, Input, Dense, RepeatVector # 1. CSVLogger 是一个回调函数用于将每个训练周期的性能指标如损失和指标值记录到 CSV 文件中。训练完成后可以使用记录的数据进行分析和可视化帮助了解模型在训练过程中的表现
# 2. EarlyStopping 是一个回调函数用于在训练过程中根据验证集的表现来提前终止训练。它监控指定的性能指标如验证损失并在连续若干个周期内没有改善时停止训练防止模型过拟合。
# 3. TerminateOnNaN 是一个回调函数用于在训练过程中检测到损失函数返回 NaNNot a Number时提前终止训练。这可以帮助捕捉和处理训练过程中出现的数值问题避免模型继续训练无效参数
from keras.callbacks import CSVLogger, EarlyStopping, TerminateOnNaN# regularizers 用于定义正则化项减少模型的过拟合通过向模型的损失函数添加惩罚项来限制模型参数的大小或者复杂度。
from keras import regularizers # Adam (Adaptive Moment Estimation) 优化器是基于随机梯度下降 (Stochastic Gradient Descent, SGD) 的方法之一但它结合了动量优化和自适应学习率的特性:
# 1. 动量(Momentum)类似于经典的随机梯度下降中的动量项Adam会在更新参数时考虑上一步梯度的指数加权平均值以减少梯度更新的方差从而加速收敛;
# 2. 自适应学习率Adam根据每个参数的梯度的一阶矩估计均值和二阶矩估计方差来自动调整学习率。这种自适应学习率的机制可以使得不同参数有不同的学习率从而更有效地优化模型。
from keras.optimizers import Adam # 1. 假设有一个函数 func(a, b, c)通过 partial(func, 1) 可以创建一个新函数相当于 func(1, b, c)其中 1 是已经固定的参数。
# 2. update_wrapper 是一个函数用于更新后一个函数的元信息比如文档字符串、函数名等到前一个函数上
from functools import partial, update_wrapper
def wrapped_partial(func, *args, **kwargs):partial_func partial(func, *args, **kwargs)update_wrapper(partial_func, func)return partial_func# 这是一个自定义的损失函数计算加权的均方误差Mean Squared Error
# y_true是真实值y_pred是预测值weights是权重
# axis-1指定了在计算均值时应该沿着最内层的轴进行操作即在每个样本或数据点上进行平均而不是在整个批次或特征维度上进行平均
def weighted_mse(y_true, y_pred, weights):return K.mean(K.square(y_true - y_pred) * weights, axis-1)# 这部分代码用于选择使用的GPU设备。它从命令行参数中获取一个整数值gpu如果gpu小于3则设置CUDA环境变量以指定使用的GPU设备
import os
gpu int(sys.argv[-13])
if gpu 3:os.environ[CUDA_DEVICE_ORDER]PCI_BUS_ID # see issue #152os.environ[CUDA_VISIBLE_DEVICES] {}.format(gpu)from tensorflow.python.client import device_libprint(device_lib.list_local_devices())# 这部分代码获取了一系列命令行参数并将它们分别赋值给变量
# 这些参数包括dataname数据集名称、nb_batches训练的批次数量、nb_epochs训练周期数、lr学习率、penalty正则化惩罚、dr丢弃率、patience耐心用于Early Stoppingn_hidden神经网络中隐藏层的数量hidden_activation隐藏层激活函数
imp sys.argv[-1]
T sys.argv[-2]
t0 sys.argv[-3]
dataname sys.argv[-4]
nb_batches sys.argv[-5]
nb_epochs sys.argv[-6]
lr float(sys.argv[-7])
penalty float(sys.argv[-8])
dr float(sys.argv[-9])
patience sys.argv[-10]
n_hidden int(sys.argv[-11])
hidden_activation sys.argv[-12]# results_directory 是一个字符串表示将要创建的结果文件夹路径dataname 是之前从命令行参数中获取的数据集名称。
# .format(dataname) 是字符串的格式化方法它会将 dataname 变量的值插入到占位符 {} 的位置。
# 如果这个文件夹路径不存在就使用 os.makedirs 函数创建它。这个路径通常用于存储训练模型的结果或者日志。
results_directory results/encoder-decoder/{}.format(dataname)
if not os.path.exists(results_directory):os.makedirs(results_directory)# 定义了一个函数 create_model用于创建、编译和返回一个循环神经网络RNN模型
def create_model(n_pre, n_post, nb_features, output_dim, lr, penalty, dr, n_hidden, hidden_activation): creates, compiles and returns a RNN model param nb_features: the number of features in the model# 这里定义了两个输入层# 1. inputs 是一个形状为 (n_pre, nb_features) 的输入张量用于模型的主输入# 2. weights_tensor 是一个形状相同的张量用于传递权重或其他需要的信息inputs Input(shape(n_pre, nb_features), nameInputs) weights_tensor Input(shape(n_pre, nb_features), nameWeights) # 编码器这里使用了两个 LSTM 层 # lstm_1 的主要作用是将输入序列转换为一个语义上丰富的固定长度表示即隐藏状态并且该表示包含了输入序列的全部信息。这个固定长度的表示将作为解码器的输入用于生成目标序列。# 1. n_hidden指定 LSTM 层的隐藏单元数决定了网络的记忆容量和复杂度。# 2. dropoutdr 和 recurrent_dropoutdr分别指定了输入和循环 dropout 的比例有助于防止过拟合。# 3. activationhidden_activation设置了 LSTM 单元的激活函数这里是通过 hidden_activation 参数传递的。# 4. return_sequencesTrue指定返回完整的输出序列而不是只返回最后一个时间步的输出。这是为了将完整的输入序列信息编码成隐藏状态序列以便后续的解码器使用。# lstm_2 是一个相同的 LSTM 层但它只返回最后一个时间步的输出 lstm_1 LSTM(n_hidden, dropoutdr, recurrent_dropoutdr, activationhidden_activation, return_sequencesTrue, nameLSTM_1)(inputs) lstm_2 LSTM(n_hidden, activationhidden_activation, return_sequencesFalse, nameLSTM_2)(lstm_1) repeat RepeatVector(n_post, nameRepeat)(lstm_2) # get the last output of the LSTM and repeats itgru_1 GRU(n_hidden, activationhidden_activation, return_sequencesTrue, nameDecoder)(repeat) # Decoderoutput TimeDistributed(Dense(output_dim, activationlinear, kernel_regularizerregularizers.l2(penalty), nameDense), nameOutputs)(gru_1)model Model([inputs, weights_tensor], output)# model.compile(optimizerAdam(lrlr), losscl) 对模型进行编译。# optimizerAdam(lrlr) 指定了优化器为 Adam并设置了学习率为 lr。# losscl 指定了损失函数为 cl即上面定义的加权均方误差函数。cl wrapped_partial(weighted_mse, weightsweights_tensor)model.compile(optimizerAdam(lrlr), losscl)print(model.summary()) return modeldef train_model(model, dataX, dataY, weights, nb_epoches, nb_batches):# Prepare model checkpoints and callbacksstopping EarlyStopping(monitorval_loss, patienceint(patience), min_delta0, verbose1, modemin, restore_best_weightsTrue)csv_logger CSVLogger(results/encoder-decoder/{}/training_log_{}_{}_{}_{}_{}_{}_{}_{}.csv.format(dataname,dataname,imp,hidden_activation,n_hidden,patience,dr,penalty,nb_batches), separator,, appendFalse)terminate TerminateOnNaN()# 训练过程中会生成一个 history 对象其中包含了训练过程中的损失和指标等信息但并没有直接输出最终的参数值history model.fit(x[dataX,weights], ydataY, batch_sizenb_batches, verbose1,epochsnb_epoches, callbacks[stopping,csv_logger,terminate],validation_split0.2)def test_model():n_post int(1)n_pre int(t0)-1seq_len int(T)wx np.array(pd.read_csv(data/{}-wx-{}.csv.format(dataname,imp)))print(raw wx shape, wx.shape) wXC []for i in range(seq_len-n_pre-n_post):wXC.append(wx[i:in_pre]) wXC np.array(wXC)print(wXC shape:, wXC.shape)x np.array(pd.read_csv(data/{}-x-{}.csv.format(dataname,imp)))print(raw x shape, x.shape) dXC, dYC [], []for i in range(seq_len-n_pre-n_post):dXC.append(x[i:in_pre])dYC.append(x[in_pre:in_pren_post])dataXC np.array(dXC)dataYC np.array(dYC)print(dataXC shape:, dataXC.shape)print(dataYC shape:, dataYC.shape)nb_features dataXC.shape[2]output_dim dataYC.shape[2]# create and fit the encoder-decoder networkprint(creating model...)model create_model(n_pre, n_post, nb_features, output_dim, lr, penalty, dr, n_hidden, hidden_activation)train_model(model, dataXC, dataYC, wXC, int(nb_epochs), int(nb_batches))# now testprint(Generate predictions on full training set)preds_train model.predict([dataXC,wXC], batch_sizeint(nb_batches), verbose1)print(predictions shape , preds_train.shape)preds_train np.squeeze(preds_train)print(predictions shape (squeezed), preds_train.shape)print(Saving to results/encoder-decoder/{}/encoder-decoder-{}-train-{}-{}-{}-{}-{}-{}.csv.format(dataname,dataname,imp,hidden_activation,n_hidden,patience,dr,penalty,nb_batches))np.savetxt(results/encoder-decoder/{}/encoder-decoder-{}-train-{}-{}-{}-{}-{}-{}.csv.format(dataname,dataname,imp,hidden_activation,n_hidden,patience,dr,penalty,nb_batches), preds_train, delimiter,)print(Generate predictions on test set)wy np.array(pd.read_csv(data/{}-wy-{}.csv.format(dataname,imp)))print(raw wy shape, wy.shape) wY []for i in range(seq_len-n_pre-n_post):wY.append(wy[i:in_pre]) # weights for outputswXT np.array(wY)print(wXT shape:, wXT.shape)y np.array(pd.read_csv(data/{}-y-{}.csv.format(dataname,imp)))print(raw y shape, y.shape) dXT []for i in range(seq_len-n_pre-n_post):dXT.append(y[i:in_pre]) # treated is inputdataXT np.array(dXT)print(dataXT shape:, dataXT.shape)preds_test model.predict([dataXT, wXT], batch_sizeint(nb_batches), verbose1)print(predictions shape , preds_test.shape)preds_test np.squeeze(preds_test)print(predictions shape (squeezed), preds_test.shape)print(Saving to results/encoder-decoder/{}/encoder-decoder-{}-test-{}-{}-{}-{}-{}-{}.csv.format(dataname,dataname,imp,hidden_activation,n_hidden,patience,dr,penalty,nb_batches))np.savetxt(results/encoder-decoder/{}/encoder-decoder-{}-test-{}-{}-{}-{}-{}-{}.csv.format(dataname,dataname,imp,hidden_activation,n_hidden,patience,dr,penalty,nb_batches), preds_test, delimiter,)def main():test_model()return 1if __name__ __main__:main()