RIPGeo代码理解(六)main.py(运行模型进行训练和测试)

​代码链接:RIPGeo代码实现

    ├── preprocess.py # 预处理数据集并为模型运行执行IP聚类
    ├── main.py # 运行模型进行训练和测试
    ├── test.py #加载检查点,然后测试

一、导入各种模块和数据库

import torch.nn

from lib.utils import *
import argparse
import numpy as np
import random, os
from lib.model import *
# import wandb
import copy

整体功能是准备运行一个 PyTorch 深度学习模型的环境,具体的功能实现需要查看 lib.utils、lib.model 中的代码,以及整个文件的后续部分。

1、from lib.utils import *:从 lib.utils 模块中导入所有内容。

2、from lib.model import *:从 lib.model 模块中导入所有内容。

3、import copy:导入 copy 模块,用于复制对象,通常用于创建对象的深拷贝

二、参数初始化(通过命令行参数)

parser = argparse.ArgumentParser()
# parameters of initializing
parser.add_argument('--seed', type=int, default=1024, help='manual seed')
parser.add_argument('--model_name', type=str, default='RIPGeo')
parser.add_argument('--dataset', type=str, default='New_York', choices=["Shanghai", "New_York", "Los_Angeles"],
                    help='which dataset to use')

这部分代码的目的是通过命令行参数设置一些初始化的参数,例如随机数种子、模型名称和数据集名称。这使得在运行脚本时可以通过命令行参数来指定这些参数的值。

1、parser = argparse.ArgumentParser():创建一个 argparse.ArgumentParser 对象,用于解析命令行参数。

2、parser.add_argument('--seed', type=int, default=1024, help='manual seed'):添加一个命令行参数,名称为 '--seed',表示随机数种子,类型为整数,默认值为 1024help 参数是在命令行中输入 --help 时显示的帮助信息。

3、parser.add_argument('--model_name', type=str, default='RIPGeo'):添加一个命令行参数,名称为 '--model_name',表示模型的名称,类型为字符串,默认值为 'RIPGeo'

4、parser.add_argument('--dataset', type=str, default='New_York', choices=["Shanghai", "New_York", "Los_Angeles"], help='which dataset to use'):添加一个命令行参数,名称为 '--dataset',表示数据集的名称,类型为字符串,默认值为 'New_York',choices 参数指定了可选的值为 ["Shanghai", "New_York", "Los_Angeles"],用户只能从这三个值中选择。

三、训练过程参数设置

# parameters of training
parser.add_argument('--beta1', type=float, default=0.9)
parser.add_argument('--beta2', type=float, default=0.999)

parser.add_argument('--lr', type=float, default=2e-3)
parser.add_argument('--harved_epoch', type=int, default=5)
parser.add_argument('--early_stop_epoch', type=int, default=50)
parser.add_argument('--saved_epoch', type=int, default=100)

这部分代码的目的是设置一些训练过程中的超参数,例如优化器的动量参数、学习率、权重参数等。这些参数在训练过程中会影响模型的更新和收敛速度。

1、parser.add_argument('--beta1', type=float, default=0.9):添加一个命令行参数,名称为 '--beta1',表示 Adam 优化器的第一个动量(momentum)参数,类型为浮点数,默认值为 0.9。

2、parser.add_argument('--beta2', type=float, default=0.999):添加一个命令行参数,名称为 '--beta2',表示 Adam 优化器的第二个动量参数,类型为浮点数,默认值为 0.999。

3、parser.add_argument('--lr', type=float, default=2e-3):添加一个命令行参数,名称为 '--lr',表示学习率,类型为浮点数,默认值为 2e-3。

4、parser.add_argument('--harved_epoch', type=int, default=5):添加一个命令行参数,名称为 '--harved_epoch',表示当连续多少个epoch的性能没有增加时,学习率减半,类型为整数,默认值为 5。

5、parser.add_argument('--early_stop_epoch', type=int, default=50):添加一个命令行参数,名称为 '--early_stop_epoch',表示当连续多少个epoch的性能没有增加时,训练停止,类型为整数,默认值为 50。

6、parser.add_argument('--saved_epoch', type=int, default=100):  添加一个命令行参数,名称为 '--saved_epoch',表示为测试保存多少个checkpoint(epoch),类型为整数,默认值为 100。

四、模型参数设置

# parameters of model
parser.add_argument('--dim_in', type=int, default=30, choices=[51, 30], help="51 if Shanghai / 30 else")
parser.add_argument('--dim_med', type=int, default=32)
parser.add_argument('--dim_z', type=int, default=32)
parser.add_argument('--eta', type=float, default=0.1)
parser.add_argument('--zeta', type=float, default=0.1)
parser.add_argument('--step', type=int, default=2)
parser.add_argument('--mu', type=float, default=0.2)
parser.add_argument('--lambda_1', type=float, default=1)
parser.add_argument('--lambda_2', type=float, default=1)
parser.add_argument('--c_mlp', type=bool, default=True)
parser.add_argument('--epoch_threshold', type=int, default=50)

opt = parser.parse_args()

这部分用于定义模型的结构和训练过程中的一些重要参数。

1、parser.add_argument('--dim_in', type=int, default=30, choices=[51, 30], help="51 if Shanghai / 30 else"): 添加一个命令行参数,名称为 ''--dim_in',表示输入数据的维度,类型为整数,默认值为 30,可选的有[51,30],如果是上海数据集,维度为51,否则为30

2、parser.add_argument('--dim_med', type=int, default=32): 添加一个命令行参数,名称为 '--dim_med',表示中间层的维度,类型为整数,默认值为 32。

3、parser.add_argument('--dim_z', type=int, default=32): 添加一个命令行参数,名称为 '--dim_z',表示向量表示的维度,类型为整数,默认值为 32。

4、parser.add_argument('--eta', type=float, default=0.1): 添加一个命令行参数,名称为 '--eta',表示数据扰动程度,默认值为 0.1。

5、parser.add_argument('--zeta', type=float, default=0.1): 添加一个命令行参数,名称为 '--zeta',表示参数扰动程度,默认值为 0.1。

6、parser.add_argument('--step', type=int, default=2): 添加一个命令行参数,名称为 '--step',表示单参数扰动下梯度上升次数,类型为整数,默认值为 2。

7、parser.add_argument('--mu', type=float, default=0.2): 添加一个命令行参数,名称为 '--mu',表示参数扰动的内学习率,默认值为 0.2。

8、parser.add_argument('--lambda_1', type=float, default=1): 添加一个命令行参数,名称为 '--lambda_1',表示损失函数中数据扰动的权衡系数,默认值为 1。

9、parser.add_argument('--lambda_2', type=float, default=1): 添加一个命令行参数,名称为 '--lambda_2',表示损失函数中参数扰动的权衡系数,默认值为 1。

10、parser.add_argument('--c_mlp', type=bool, default=True): 添加一个命令行参数,名称为 '--c_mlp',表示在预测是否使用collaborative_mlp时默认值为 True。

11、parser.add_argument('--epoch_threshold', type=int, default=50): 添加一个命令行参数,名称为 '--epoch_threshold',表示当我们开始在数据和参数中添加扰动时,类型为整数,默认值为 50。

12、opt = parser.parse_args(): 将命令行参数解析成Python对象。简单来说,就是通过parser解析命令行传入的参数,并将其赋值给变量pt。

五、设置随机种子数

if opt.seed:
    print("Random Seed: ", opt.seed)
    random.seed(opt.seed)
    torch.manual_seed(opt.seed)
torch.set_printoptions(threshold=float('inf'))

这一部分的目的是确保在使用随机数的场景中,每次运行程序得到的随机结果是可复现的。通过设置相同的随机数种子,可以使得每次运行得到相同的随机数序列。

1、如果 opt 对象中的 seed 属性存在(不为 0 或 False 等假值),则执行以下操作:

  • 打印随机数种子的信息。
  • 使用 random 模块设置 Python 内建的随机数生成器的种子。
  • 使用 PyTorch 的 torch 模块设置随机数种子。

2、torch.set_printoptions(threshold=float('inf')):设置 PyTorch 的打印选项,将打印的元素数量限制设置为无穷大,即不限制打印的元素数量。这样可以确保在打印张量时,所有元素都会被打印出来,而不会被省略。

六、过滤所有警告信息

warnings.filterwarnings('ignore')

过滤掉所有警告信息,将警告信息忽略。这通常用于在代码中避免显示一些不影响程序执行的警告信息,以保持输出的清晰。在某些情况下,警告信息可能是有用的,但如果明确知道这些警告对程序执行没有影响,可以选择忽略它们。

七、动态选择运行环境

device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
print("device:", device)
print("Dataset: ", opt.dataset)
cuda = True if torch.cuda.is_available() else False
Tensor = torch.cuda.FloatTensor if cuda else torch.FloatTensor

这部分代码的目的是根据硬件环境动态选择运行模型的设备,并选择相应的 PyTorch 张量类型。如果有可用的 GPU,就使用 GPU 运行模型和 GPU 张量类型;否则,使用 CPU 运行模型和 CPU 张量类型。

1、device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu'):创建一个 PyTorch 设备对象,表示运行模型的设备。如果 CUDA 可用(即有可用的 GPU),则使用 'cuda:0' 表示第一个 GPU,否则使用 'cpu' 表示 CPU。

2、print("device:", device):打印设备的信息,即使用的是 GPU 还是 CPU。

3、cuda = True if torch.cuda.is_available() else False:根据 CUDA 是否可用设置一个布尔值,表示是否使用 GPU。如果 CUDA 可用,则 cuda 为 True,否则为 False。

4、Tensor = torch.cuda.FloatTensor if cuda else torch.FloatTensor:根据上一步得到的 cuda 布尔值选择使用 GPU 还是 CPU 上的 PyTorch 张量类型。如果 cuda 为 True,则 Tensor 被设置为 torch.cuda.FloatTensor,表示在 GPU 上的浮点数张量类型,否则设置为 torch.FloatTensor,表示在 CPU 上的浮点数张量类型。

八、加载数据(训练测试)

'''load data'''
train_data = np.load("./datasets/{}/Clustering_s1234_lm70_train.npz".format(opt.dataset),
                     allow_pickle=True)
test_data = np.load("./datasets/{}/Clustering_s1234_lm70_test.npz".format(opt.dataset),
                    allow_pickle=True)
train_data, test_data = train_data["data"], test_data["data"]
print("data loaded.")

这部分代码的目的是加载训练集和测试集的数据,数据文件的路径根据 opt.dataset 的值确定(见四、模型参数设置)。

train_data = np.load("./datasets/{}/Clustering_s1234_lm70_train.npz".format(opt.dataset), allow_pickle=True):使用 NumPy 的 load 函数加载训练数据。数据集的路径根据opt.dataset的取值而动态确定。allo

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

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

相关文章

162、应急响应——网站入侵篡改指南Webshell内存马查杀漏洞排查时间分析

文章目录 IIS&.NET—注入—基于时间配合日志分析Apache&PHP—漏洞—基于漏洞配合日志分析Tomcat&JSP—弱口令—基于后门配合日志分析查杀常规后门查杀内存马 需要了解: 异常检测、处置流程、分析报告等 网站被入侵会出现异常:流量异常、防护…

Git版本控制

这是两个学习Git推荐必看的文档,第一个链接是Git的官方权威文档,第二个链接是国内程序员在开发中,总结的Git快速入门教程,掌握这个,也足够应付在工作中的场景。 Git权威书籍《ProGit》中文版https://gitee.com/progit…

Web框架开发-Ajax

一、 Ajax准备知识:json 1、json(Javascript Obiect Notation,JS对象标记)是一种轻量级的数据交换格式 1 2 它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。…

从redis安装到使用再到源码和底层原理分析指南【万字长文】

Redis 安装redis-cli记录单线程多路IO复用Redis字符串Redis列表 事务Redis悲观锁和乐观锁AOF主从集群概念slots Redis应用问题解决缓存穿透缓存击穿缓存雪崩分布式锁 重启和停止redis server配置登陆密码 配置外网访问Redis源码学习server守护进程实现server处理信号redis obje…

每日一题——LeetCode2549.统计桌面上的不同数字

方法一 模拟 维护一个数组arr&#xff0c;初始值为n,每次循环将arr[i] % j(1<j<n) 如果结果为1则将j加入&#xff0c; 最后将arr转为Set集合去重&#xff0c;Set的长度就是答案 var distinctIntegers function(n) {let arr[]arr.push(n)for(let i0;i<arr.length;i…

JAVA毕业设计131—基于Java+Springboot+Vue的餐厅点餐系统(源代码+数据库+4000字文档)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootVue的餐厅点餐系统(源代码数据库4000字文档)131 一、系统介绍 本项目前后端分离&#xff0c;分为管理员、用户两种角色 1、用户&#xff1a; 注册、登录、点餐…

SpringBoot2.x 整合SpringDocJavadocknife4j实现无注解零入侵式接口文档

说明 基于 javadoc 无注解零入侵生成规范的 openapi 结构体。 文档工具使用 由于框架采用 openapi 行业规范 故市面上大部分的框架均支持 可自行选择 例如: apifox apipost postman torna knife4j 等 根据对应工具的文档接入即可 Swagger升级SpringDoc指南 常见功能如下 其他…

RHEL9部署Docker环境

华子目录 Docker引擎架构docker引擎架构示意图执行过程示例 RHEL9上安装Docker1.系统要求2.安装yum-utils工具包3.yum安装docker-ce4.配置docker镜像加速docker拉取镜像的过程配置阿里云镜像仓库重新加载守护进程重启Docker服务 5.拉取并运行hello-world镜像6.测试是否安装成功…

【Godot4.2】基础知识 - Godot中的2D向量

概述 在Godot中&#xff0c;乃至一切游戏编程中&#xff0c;你应该都躲不开向量。这是每一个初学者都应该知道和掌握的内容&#xff0c;否则你将很难理解和实现某些其实原理非常简单的东西。 估计很多刚入坑Godot的小伙伴和我一样&#xff0c;不一定是计算机专业或编程相关专…

ROS机器人入门第二课:ROS集成开发环境搭建

文章目录 ROS机器人入门第二课&#xff1a;ROS集成开发环境搭建一、安装终端&#xff08;一&#xff09;安装Terminator&#xff08;二&#xff09;添加到收藏夹&#xff08;三&#xff09;Terminator 常用快捷键第一部份&#xff1a;关于在同一个标签内的操作第二部份&#xf…

【开发环境搭建篇】Nacos的安装和配置

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

01-机器学习概述

机器学习的定义 机器学习是一门从数据中研究算法的科学学科。 机器学习直白来讲&#xff0c; 就是根据已有的数据&#xff0c;进行算法选择&#xff0c;并基于算法和数据 构建模型&#xff0c;最终对未来进行预测。 机器学习就是一个模拟人决策过程的一种程序结构。 机器学…

系统大屏可视化展示平台解决方案(原件)

1.系统概述 1.1.需求分析 1.2.重难点分析 1.3.重难点解决措施 2.系统架构设计 2.1.系统架构图 2.2.关键技术 2.3.接口及要求 3.系统功能设计 3.1.功能清单列表 3.2.数据源管理 3.3.数据集管理 3.4.视图管理 3.5.仪表盘管理 3.6.移动端设计 3.7.系统权限设计 3.8.数据查询过程设…

隐私计算实训营学习三:隐私计算框架的架构和技术要点

文章目录 一、隐语架构二、产品层三、算法层3.1 PSI与PIR3.2 Data Analysis-SCQL3.3 Federated Learning 四、计算层4.1 混合调度编译-RayFed4.2 密态引擎4.3 密码原语YACL 五、资源管理层六、互联互通七、跨域管控 一、隐语架构 1、完备性&#xff1a;支持多种技术&#xff0…

QT:QTableWidget表格中加入勾选框

1.新建QTableWidget控件&#xff1a;tableWidget_TestResult 2.举例&#xff1a;在第一行第一列添加一个勾选框 //添加选择框QTableWidgetItem* check0 new QTableWidgetItem();check0->setCheckState(Qt::Checked);ui->tableWidget_TestResult->setItem(0, 0, chec…

Redis如何删除大key

参考阿里云Redis规范 查找大key&#xff1a; redis-cli --bigkeys 1、String类型&#xff1a; Redis 4.0及以后版本提供了UNLINK命令&#xff0c;该命令与DEL命令类似&#xff0c;但它会在后台异步删除key&#xff0c;不会阻塞当前客户端&#xff0c;也不会阻塞Redis服务器的…

C语言函数和数组

目录 一.数组 一.一维数组&#xff1a; 1.一维数组的创建: 2.一维数组的初始化&#xff1a; 3.一维数组的使用 4.一维数组在内存中的存储&#xff1a; 二.二维数组&#xff1a; 三.数组越界&#xff1a; 四.数组作为函数参数&#xff1a; 二.函数 一.函数是什么&…

NVIDIA最新 Blackwell架构简介

NVIDIA Blackwell架构简介 在AI和大型语言模型&#xff08;LLMs&#xff09;迅速发展的领域中&#xff0c;追求实时性能和可扩展性至关重要。从医疗保健到汽车行业&#xff0c;组织正深入探索生成性AI和加速计算解决方案的领域。对生成性AI解决方案的需求激增&#xff0c;促使企…

代码随想录算法训练营第二十八天|● 93.复原IP地址 ● 78.子集 ● 90.子集II (JS写法)

93 复原IP地址 题目链接/文章讲解&#xff1a;https://programmercarl.com/0093.%E5%A4%8D%E5%8E%9FIP%E5%9C%B0%E5%9D%80.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1XP4y1U73i/ 思路&#xff1a; /*** param {string} s* return {string[]}*/ var resto…

Java数据结构-顺序表

目录 1. 顺序表的相关概念1.1 线性表1.2 顺序表2. 功能实现2.1 整体框架2.2 乱七八糟的功能(bushi)2.2.1 判断容量是否满2.2.2 返回顺序表当前长度2.2.3 扩容2.2.4 清空整个顺序表 2.3 插入数据2.3.1 头插数据2.3.2 尾插数据2.3.3 指定位置插入 2.4 删除数据2.4.1 删除第一次出…