3. train_encoder_decoder.py

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 是一个回调函数,用于在训练过程中检测到损失函数返回 NaN(Not 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 #152
    os.environ["CUDA_VISIBLE_DEVICES"]= "{}".format(gpu)

    from tensorflow.python.client import device_lib
    print(device_lib.list_local_devices())

# 这部分代码获取了一系列命令行参数,并将它们分别赋值给变量 
# 这些参数包括dataname数据集名称、nb_batches训练的批次数量、nb_epochs训练周期数、lr学习率、penalty正则化惩罚、dr丢弃率、patience耐心(用于Early Stopping),n_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), name="Inputs")  
    weights_tensor = Input(shape=(n_pre, nb_features), name="Weights") 
    
    # 编码器,这里使用了两个 LSTM 层: 
    # lstm_1 的主要作用是将输入序列转换为一个语义上丰富的固定长度表示(即隐藏状态),并且该表示包含了输入序列的全部信息。这个固定长度的表示将作为解码器的输入,用于生成目标序列。
      # 1. n_hidden:指定 LSTM 层的隐藏单元数,决定了网络的记忆容量和复杂度。
      # 2. dropout=dr 和 recurrent_dropout=dr:分别指定了输入和循环 dropout 的比例,有助于防止过拟合。
      # 3. activation=hidden_activation:设置了 LSTM 单元的激活函数,这里是通过 hidden_activation 参数传递的。
      # 4. return_sequences=True:指定返回完整的输出序列,而不是只返回最后一个时间步的输出。这是为了将完整的输入序列信息编码成隐藏状态序列,以便后续的解码器使用。
    # lstm_2 是一个相同的 LSTM 层,但它只返回最后一个时间步的输出 
    lstm_1 = LSTM(n_hidden, dropout=dr, recurrent_dropout=dr, activation=hidden_activation, return_sequences=True, name='LSTM_1')(inputs) 
    lstm_2 = LSTM(n_hidden, activation=hidden_activation, return_sequences=False, name='LSTM_2')(lstm_1) 

    repeat = RepeatVector(n_post, name='Repeat')(lstm_2) # get the last output of the LSTM and repeats it
    gru_1 = GRU(n_hidden, activation=hidden_activation, return_sequences=True, name='Decoder')(repeat)  # Decoder
    output= TimeDistributed(Dense(output_dim, activation='linear', kernel_regularizer=regularizers.l2(penalty), name='Dense'), name='Outputs')(gru_1)

    model = Model([inputs, weights_tensor], output)

    # model.compile(optimizer=Adam(lr=lr), loss=cl) 对模型进行编译。
    # optimizer=Adam(lr=lr) 指定了优化器为 Adam,并设置了学习率为 lr。
    # loss=cl 指定了损失函数为 cl,即上面定义的加权均方误差函数。
    cl = wrapped_partial(weighted_mse, weights=weights_tensor)
    model.compile(optimizer=Adam(lr=lr), loss=cl)

    print(model.summary()) 
    return model

def train_model(model, dataX, dataY, weights, nb_epoches, nb_batches):

    # Prepare model checkpoints and callbacks

    stopping = EarlyStopping(monitor='val_loss', patience=int(patience), min_delta=0, verbose=1, mode='min', restore_best_weights=True)

    csv_logger = CSVLogger('results/encoder-decoder/{}/training_log_{}_{}_{}_{}_{}_{}_{}_{}.csv'.format(dataname,dataname,imp,hidden_activation,n_hidden,patience,dr,penalty,nb_batches), separator=',', append=False)

    terminate = TerminateOnNaN()

    # 训练过程中会生成一个 history 对象,其中包含了训练过程中的损失和指标等信息,但并没有直接输出最终的参数值
    history = model.fit(x=[dataX,weights], 
        y=dataY, 
        batch_size=nb_batches, 
        verbose=1,
        epochs=nb_epoches, 
        callbacks=[stopping,csv_logger,terminate],
        validation_split=0.2)

def test_model():

    n_post = int(1)
    n_pre =int(t0)-1
    seq_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:i+n_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:i+n_pre])
        dYC.append(x[i+n_pre:i+n_pre+n_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 network
    print('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 test

    print('Generate predictions on full training set')

    preds_train = model.predict([dataXC,wXC], batch_size=int(nb_batches), verbose=1)

    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:i+n_pre]) # weights for outputs
    
    wXT = 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:i+n_pre]) # treated is input

    dataXT = np.array(dXT)

    print('dataXT shape:', dataXT.shape)
  
    preds_test = model.predict([dataXT, wXT], batch_size=int(nb_batches), verbose=1)

    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 1

if __name__ == "__main__":
    main()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/777150.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

全新桌面编辑器

目录 前言 一、链接 ONLYOFFICE 8.1版本 官网下载链接&#xff1a; ONLYOFFICE 在线工具&#xff1a; 下载版本推荐&#xff1a; 二、使用体验 1. 界面设计&#xff1a; 2. 文档编辑功能&#xff1a; 3. 电子表格功能&#xff1a; 4. 演示文稿功能&#xff1a; 5.PDF编…

python-开关灯(赛氪OJ)

[题目描述] 假设有 N 盏灯&#xff08;N 为不大于 5000 的正整数&#xff09;&#xff0c;从 1 到到 N 按顺序依次编号&#xff0c;初始时全部处于开启状态&#xff1b;第一个人&#xff08; 1 号&#xff09;将灯全部关闭&#xff0c;第二个人&#xff08; 2 号&#xff09;将…

nginx修改网站默认根目录及发布(linux、centos、ubuntu)openEuler软件源repo站点

目录 安装nginx配置nginx其它权限配置 安装nginx dnf install -y nginx配置nginx whereis nginxcd /etc/nginx llcd conf.d touch vhost.conf vim vhost.conf 命令模式下输入:set nu或:set number可以显示行号 复制如下内容&#xff1a; server {listen 80;server_name…

基于java+springboot+vue实现的流浪动物管理系统(文末源码+Lw)277

摘 要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对流浪动物信息管理的提升&…

玩转Easysearch语法

Elasticsearch 是一个基于Apache Lucene的开源分布式搜索和分析引擎&#xff0c;广泛应用于全文搜索、结构化搜索、分析等多种场景。 Easysearch 作为Elasticsearch 的国产化替代方案&#xff0c;不仅保持了与原生Elasticsearch 的高度兼容性&#xff0c;还在功能、性能、稳定性…

Spring框架Mvc(2)

1.传递数组 代码示例 结果 2.集合参数存储并进行存储类似集合类 代码示例 postman进行测试 &#xff0c;测试结果 3.用Json来对其进行数据的传递 &#xff08;1&#xff09;Json是一个经常使用的用来表示对象的字符串 &#xff08;2&#xff09;Json字符串在字符串和对象…

Mysql数据库索引、事务相关知识

索引 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引&#xff0c; 并指定索引的类型&#xff0c;各类索引有各自的数据结构实现 查看索引 show index from 表名;创建索引对于非主键、非唯一约束、非外键的字段&#…

JAVA ArrayList应用案例

一案例要求&#xff1a; 二代码&#xff1a; package 重修;import java.util.ArrayList; import java.util.Random; import java.util.Scanner;public class first {public static void main(String[] args) {ArrayList<String>arrayListnew ArrayList<>();array…

ctfshow-web入门-文件包含(web87)巧用 php://filter 流绕过死亡函数的三种方法

目录 方法1&#xff1a;php://filter 流的 base64-decode 方法 方法2&#xff1a;通过 rot13 编码实现绕过 方法3&#xff1a;通过 strip_tags 函数去除 XML 标签 除了替换&#xff0c;新增 file_put_contents 函数&#xff0c;将会往 $file 里写入 <?php die(大佬别秀了…

微软与OpenAI/谷歌与三星的AI交易受欧盟重点关注

近日&#xff0c;欧盟委员会主管竞争事务的副主席玛格丽特维斯塔格(Margrethe Vestager)在一次演讲中透露&#xff0c;欧盟反垄断监管机构将就微软与OpenAI的合作&#xff0c;以及谷歌与三星达成的AI协议寻求更多第三方意见。这意味着微软与 OpenAI、谷歌与三星的 AI 交易及合作…

MySQL中的DDL语句

第一题 输入密码登录mysql&#xff0c;创建数据库zoo&#xff0c;转换到zoo数据库&#xff0c; mysql> create database zoo character set gbk; mysql> use zoo查看创建数据库zoo信息 mysql> show create database zoo;删除数据库zoo mysql> drop database zo…

独立开发者系列(20)——扫码登录

&#xff08;1&#xff09;网页端的安全登录设计 很多大型网站都有登录限制。这里以一个案例作为例子完整解析。理解安全的登录设计方式&#xff0c;无论对于以后做自动化&#xff0c;自动登录网站&#xff0c;获取数据&#xff0c;还是自己开发月租类型的系统非常有用。当前一…

2024菜鸟春招笔试

第一题 解题思路&#xff1a; 签到题&#xff0c;把帖子按好评度降序排列&#xff0c;再将人按升序排列。 第二题 解题思路 从左到右遍历&#xff0c;如果当前元素没有错排&#xff0c;将其与后一个交换&#xff0c;这样两个元素一定都错排。 第三题 、 解题思路 这题当时暴力…

【总线】AXI4第八课时:介绍AXI的 “原子访问“ :独占访问(Exclusive Access)和锁定访问(Locked Access)

大家好,欢迎来到今天的总线学习时间!如果你对电子设计、特别是FPGA和SoC设计感兴趣&#xff0c;那你绝对不能错过我们今天的主角——AXI4总线。作为ARM公司AMBA总线家族中的佼佼者&#xff0c;AXI4以其高性能和高度可扩展性&#xff0c;成为了现代电子系统中不可或缺的通信桥梁…

comsol随机材料参数赋值

comsol随机材料参数赋值 在comsol中定义外部matlab函数 在comsol中定义外部matlab函数 首选项&#xff0c;安全性&#xff0c;允许 材料中&#xff0c;将杨氏模量更改为变量函数 计算 应力有波动&#xff0c;可见赋值成功 也可以看到赋值的材料参数&#xff1a;

matlab 抛物线图像绘制

抛物线图像绘制 x^2y4绘制结果 x^2y4 clc,clear,close all; length10; % 创建一个范围内的 x 和 y 值 x linspace(-length, length, 1000); y linspace(-length, length, 1000);% 创建一个网格来表示 x 和 y 值的组合 [X, Y] meshgrid(x, y);% 计算方程的左边和右边的值 LH…

【启明智显分享】乐鑫HMI方案2.8寸触摸串口屏应用于太阳能控制器

前言 太阳能作为一种无尽的、可再生的能源&#xff0c;在现代社会的能源结构中占据着日益重要的地位。而在太阳能应用系统中&#xff0c;有一种设备是不可或缺的&#xff0c;那就是太阳能控制器。太阳能控制器在太阳能系统中起着至关重要的作用&#xff0c;它保证系统的安全和…

redis学习(005 java客户端 RedisTemplate学习)

黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目 总时长 42:48:00 共175P 此文章包含第16p-第p23的内容 文章目录 java客户端jedisSpringDataRedis项目实现hash哈希操作 java客户端 jedis 测试 ps:如果连接不上&…

C-study(五).2

逻辑运算符 连接两个完整的关系表达式。 && 逻辑与&#xff0c;ab都为真时&#xff0c;a&&b的值真&#xff0c;其余时候假。 || 逻辑或&#xff0c;ab都为假时&#xff0c;a||b的值假&#xff0c;其余时候真。 ! 逻辑非、只需要一个运算对象&#xff0c;a真&a…

维护和管理LDAP之OpenDJ

目录 基本介绍 服务专有名词 安装 命令行工具 密码管理 重置管理员密码 管理服务器进程 管理索引 如何搜索 管理索引 管理目录数据 测试数据 导出数据 导入数据 LDIF文件数据查看和比较 数据存储-Backends 配置连接 开启 HTTP/HTTPS连接 使用 REST访问 -open…