时间序列预测(十五)——有关Python项目框架的实例分析
#1024程序员节|征文#
在之前的学习中,已经对时间序列预测的相关内容有了大致的了解。为了进一步加深理解,并能够将所学知识应用于实际中,我决定找一个完整的Python框架来进行深入学习。经过寻找,我终于找到了一篇非常具有参考价值的源代码,非常感激。
接下来,我将详细记录自己的学习过程和心得,以便更好地掌握和应用时间序列预测技术。
这个项目的目录结构如下,展示了一个使用不同深度学习框架(Keras、PyTorch 和 TensorFlow)来进行股票价格预测的 Python 框架,包含多个模型文件和预测图像。
stock_predict_with_LSTM-master
│
├── data # 存放数据集
│ └── stock_data.csv
│
├── figure # 存放预测结果的图像
│ ├── continue_predict_high_with_pytorch.png
│ ├── continue_predict_low_with_pytorch.png
│ ├── predict_high_with_pytorch.png
│ └── predict_low_with_pytorch.png
│
├── model # 存放不同框架下的模型文件
│ ├── __pycache__ # Python 缓存目录
│ │ ├── __init__.cpython-38.pyc
│ │ └── model_pytorch.cpython-38.pyc
│ ├── __init__.py # 包声明文件
│ └── model_pytorch.py # PyTorch 模型实现
│
├── .gitignore # Git忽略文件,列出不提交到仓库的文件类型
├── LICENSE # 项目的许可证
├── main.py # 项目的主入口,通常是执行的主程序
├── README.md # 项目说明文档,介绍如何运行和使用该项目
├── requirements.txt # 列出项目依赖的 Python 包
一、data文件
该文件夹主要用于存放数据集,这里只有一个数据集,是.csv文件,部分数据如下图所示。
index_code | date | open | close | low | high | volume | money | change |
sh000001 | 1990/12/20 | 104.3 | 104.39 | 99.98 | 104.39 | 197000 | 85000 | 0.044109 |
sh000001 | 1990/12/21 | 109.07 | 109.13 | 103.73 | 109.13 | 28000 | 16100 | 0.045407 |
sh000001 | 1990/12/24 | 113.57 | 114.55 | 109.13 | 114.55 | 32000 | 31100 | 0.049666 |
sh000001 | 1990/12/25 | 120.09 | 120.25 | 114.55 | 120.25 | 15000 | 6500 | 0.04976 |
sh000001 | 1990/12/26 | 125.27 | 125.27 | 120.25 | 125.27 | 100000 | 53700 | 0.041746 |
sh000001 | 1990/12/27 | 125.27 | 125.28 | 125.27 | 125.28 | 66000 | 104600 | 7.98E-05 |
sh000001 | 1990/12/28 | 126.39 | 126.45 | 125.28 | 126.45 | 108000 | 88000 | 0.009339 |
二、figure文件夹
该文件夹主要用于存放不同框架(如 PyTorch、Keras、TensorFlow)进行股票高价和低价预测的结果图像。
三、model文件夹
1、__pycache__文件夹
__pycache__
目录是 Python 自动生成的,用于存储已编译的字节码文件(.pyc
文件)。这些文件通常不需要手动编辑或提交到版本控制系统中,但 .gitignore
文件(后面介绍)通常会包含规则来忽略这些文件。
2、__init__.py文件
主要是用于声明 model
是一个 Python 包,可以被导入到其他模块中。文件夹里为空。
主要展示使用Keras的深度学习框架来构建 LSTM 模型进行股票预测
3、model_pytorch.py文件(主要学习)
主要展示使用PyTorch的深度学习框架来构建 LSTM 模型进行股票预测
(1)定义模型类
定义一个名为Net
的类,包含了LSTM(长短期记忆)层和全连接层。这个模型通过LSTM层处理时间序列数据,捕获数据中的长期依赖关系,然后通过全连接层将LSTM的输出(形状是 [batch_size, sequence_length, hidden_size])映射到期望的输出大小(形状是[batch_size, hidden_size])。
# 定义模型类
class Net(Module): ''' 定义包含LSTM和全连接层的PyTorch模型,用于时间序列预测。''' # 其中,Config 是一个用于配置模型训练、验证和预测过程的参数集合,# 通常定义在一个单独的配置文件或类中(这里定义在main.py)。它包含关于模型结构、训练设置、数据路径等的关键参数。def __init__(self, config): super(Net, self).__init__() # 初始化LSTM层:输入为config.input_size,隐藏单元为config.hidden_size,层数为config.lstm_layers # batch_first=True表示输入张量的第一个维度是批次大小,dropout=config.dropout_rate指定在LSTM层之间应用的dropout率,以防止过拟合。 self.lstm = LSTM(input_size=config.input_size, hidden_size=config.hidden_size, num_layers=config.lstm_layers, batch_first=True, dropout=config.dropout_rate) # 初始化全连接层 :用于将LSTM的最后输出映射为期望的输出大小 self.linear = Linear(in_features=config.hidden_size, out_features=config.output_size) def forward(self, x, hidden=None): # 前向传播 lstm_out, hidden = self.lstm(x, hidden) # 提取LSTM的最后时间步输出,输入到全连接层 linear_out = self.linear(lstm_out[:, -1, :]) return linear_out, hidden
lstm_out[:, -1, :]
仅提取了 LSTM 输出的最后一个时间步的数据。其中 : 表示选择所有样本(在第一个维度上);-1 表示选择最后一个时间步(在第二个维度上),这并不是说第二个维度“消失了”,而是说它在这个特定的索引操作中不再以原来的大小存在,被“压缩”了; : 表示选择该时间步的所有隐藏状态特征(在第三个维度上)。因此,这个操作的结果是一个形状为 [batch_size, hidden_size] 的张量。 属于单步预测。
(2)定义训练函数
def train(config, logger, train_and_valid_data):
这里的输入有三个:
Config 是用于配置模型的参数集合,logger 用于输出训练日志,train_and_valid_data 是包含训练和验证数据的元组或列表(train_X, train_Y, valid_X, valid_Y)
a、首先要分离数据,并创建数据加载器
分离成训练和验证两个数据集,这里使用DataLoader
和TensorDataset
创建数据加载器,可以分批次输入数据并计算损失,降低对计算资源的需求
# 创建DataLoader train_loader = DataLoader(TensorDataset(train_X, train_Y), batch_size=config.batch_size) valid_loader = DataLoader(TensorDataset(valid_X, valid_Y), batch_size=config.batch_size)
TensorDataset(train_X, train_Y)
将训练集特征和目标打包到一起,使得DataLoader
能够一次性处理对应的输入和目标DataLoader
用于将TensorDataset
生成的小批次数据集,用config.batch_size
指定每个批次的样本数量。
b、设置设备,并将模型移动到指定设备
device = torch.device("cuda:0" if config.use_cuda and torch.cuda.is_available() else "cpu")
这段代码用于检测用户配置和系统是否满足 GPU 的使用条件。如果满足(即use_cuda=True
且系统检测到 GPU),则选择 cuda:0
(第一个 GPU)作为训练设备;否则,选择 cpu
之后将模型移动到指定设备
# 初始化模型并移动到指定设备 model = Net(config).to(device)
这里还涉及到 “
增量训练”,
# 增量训练(如果配置中启用了增量训练) ,加载已保存的模型参数 if config.add_train: model.load_state_dict(torch.load(config.model_save_path + config.model_name))
具体介绍可参考这篇文章介绍:
时间序列预测(十三)——增量训练(Incremental Learning)-CSDN博客
c、
初始化优化器和损失函数
使用Adam优化器来更新模型参数。使用均方误差(MSE)作为损失函数。
d、 训练循环
在所有的训练周期(epoch)内都要进行俩个模式:训练模式和评估模式。
model.train() # 设置模型为训练模式
在训练模式下,遍历训练数据加载器,进行前向传播、计算损失、反向传播和参数更新。根据配置决定是否清除隐藏状态的梯度。如果启用了可视化,则绘制训练损失。
这里损失计算时会有问题,需要将_train_Y 的形状与pred_Y 形状(二维)匹配,以便能够正确计算损失
_train_Y = _train_Y[:, -1, :] # 选择最后一个时间步的输出,形状为 [64, 2]
结束后,设置模型为评估模式。
model.eval() # 设置模型为评估模式
遍历验证数据加载器,计算验证损失。计算并输出当前轮次的训练和验证损失。如果启用了可视化,则绘制每个轮次的训练和验证损失。
这里也有问题,需要将_valid_Y 的形状与pred_Y 形状(二维)匹配,以便能够正确计算损失
_valid_Y = _valid_Y[:, -1, :] # 选择最后一个时间步的输出,形状 [64, 2]
最后还设置了早停机制。
if valid_loss_cur < valid_loss_min: valid_loss_min = valid_loss_cur bad_epoch = 0 # 保存最优模型 torch.save(model.state_dict(), config.model_save_path + config.model_name) else: bad_epoch += 1 if bad_epoch >= config.patience: # 若验证集损失未减小,则提前终止训练 logger.info(" The training stops early in epoch {}".format(epoch)) break
根据早停机制,如果验证损失达到新低(即当前验证损失小于之前记录的最小验证损失),则保存模型并重置早停计数器;否则(即,验证损失没有改善),则增加早停计数器,如果早停计数器超过了配置的耐心值(patience
),则提前终止训练。
有关训练模式和评估模式的区别可以参考下面这篇文章:
时间序列预测(十二)——训练模式、评估模式和预测模式的区别-CSDN博客
(3)定义预测函数
def predict(config, test_X):
这里的输入有两个:
Config 是用于配置模型的参数集合,test_X
:是测试数据集。
之后和训练函数有些相似
a、创建数据加载器
# 转换测试数据为Tensor test_X = torch.from_numpy(test_X).float() test_set = TensorDataset(test_X) test_loader = DataLoader(test_set, batch_size=1)
b、设置设备,并将模型移动到指定设备
device = torch.device("cuda:0" if config.use_cuda and torch.cuda.is_available() else "cpu") model = Net(config).to(device) model.load_state_dict(torch.load(config.model_save_path + config.model_name))
c、进行预测
首先,将模型设置为评估模式
model.eval()
之后,遍历测试数据加载器,对于每个批次的数据:将数据移动到指定的设备上,使用模型进行预测,并更新隐藏状态。
这里还会使用 torch.squeeze(pred_X, dim=0)
移除预测结果中多余的维度(这是由于数据加载器 DataLoader
的批次大小设为1(batch_size=1
),那么预测结果 pred_X
的形状会是 [1, sequence_length, features]
,其中第一个维度(批次维度)仅包含单个元素。为简化后续处理,可移除该批次维度,使 pred_X
形状变为 [sequence_length, features]
。)。
也使用 torch.cat((result, cur_pred), dim=0)
,将每次预测的结果cur_pred
在指定的维度(这里是维度0,即行的方向)上与result进行
拼接,添加到result
中,从而汇总所有的预测结果。
data_X = _data[0].to(device) pred_X, hidden_predict = model(data_X, hidden_predict) cur_pred = torch.squeeze(pred_X, dim=0) # 移除多余的维度 result = torch.cat((result, cur_pred), dim=0) # 拼接预测结果
最后使用 detach()
方法将 result
从计算图中分离,并移动到CPU上,使用 .numpy()
方法将Tensor转换为NumPy数组,以便后续处理。
return result.detach().cpu().numpy()
四、剩下的文件
1、.gitignore
:
用于告诉 Git 哪些文件或文件夹不应该提交到版本控制系统中。通常包含 .pyc
缓存文件、虚拟环境文件等。
2、LICENSE
:
项目的开源许可证,指明项目的使用权利和限制。这里是一个宽松的开源许可证Apache许可证2.0
3、main.py
:
该文件是项目的主入口,应该包含整个项目的运行逻辑。通常从这里加载数据、构建模型并进行训练和预测。
(1)配置类 (Config
)
a、数据参数:
定义特征列和目标列的索引,设置预测的天数。
b、网络参数:
包括输入输出大小、LSTM层数、隐藏层大小、dropout概率和时间步长。
c、训练参数:
训练和验证的设置(如批量大小、学习率、训练周期等),并配置随机种子以确保结果可复现。
d、路径参数:
定义数据、模型、图形和日志文件的保存路径,并创建必要的目录。
(2)数据处理类 (Data
)
a、数据读取:
def read_data(self):
读取CSV文件,如果处于调试模式 (debug_mode
),则只读取部分数据(debug_num
行)。否则,读取的数据包含特定的特征列 (feature_columns
)。最后返回数据值和列名
b、获取训练和验证数据:
def get_train_and_valid_data(self):
从归一化后的数据中提取特征数据和标签数据,根据是否连续训练 (do_continue_train
),采用不同的方式(非连续训练模式和连续训练模式,都是滑动窗口)生成训练样本 (train_x
和 train_y
),使用 train_test_split
方法划分训练集和验证集。
c、获取测试数据:
def get_test_data(self, return_label_data=False) -> np.ndarray:
这里取训练数据之后的所有数据作为测试特征数据,根据时间步长 (sample_interval) 生成测试样本 (test_x
)。这里的样本之间是不重叠的,具体采样方式如下图所示。
如果 return_label_data
为 True
,则同时返回测试样本和标签数据,否则只返回测试样本。
(3) 日志记录函数 (load_logger
)
def load_logger(config: Config) -> logging.Logger:
创建和配置日志记录器,根据配置决定将日志输出到屏幕 (此时do_log_print_to_screen为
True) 和文件 (此时do_log_save_to_file为
True)。
(4)绘图函数 (draw
)
def draw(config: Config, origin_data: Data, logger, predict_norm_data: np.ndarray):
用于绘制真实值和预测值的函数,便于可视化模型的预测效果。
可能是前面形状的修改,导致这里predict_data
与label_data
也出现了形状问题,做了一些修改的。
这里还有问题,在修改中,,,,,
(5)主函数(main)
def main(config):
(6)if __name__ == "__main__"(最重要、必不可少)
这部分代码是Python脚本的标准做法,用于确保当脚本被直接运行时才执行某些代码。
a、导入 argparse库,
b、创建并配置 argparse
解析器
parser = argparse.ArgumentParser()
# 可以根据需要添加更多参数
args = parser.parse_args()
创建一个 ArgumentParser
实例,并调用 parse_args
方法来解析命令行参数
c、创建配置实例并设置属性
con = Config() # 创建配置实例
for key in dir(args): # 遍历 args 的所有属性 if not key.startswith("_"): # 排除内部属性 setattr(con, key, getattr(args, key)) # 将属性值赋给配置
创建了一个 Config
类的实例,用于存储配置信息。然后,遍历 args
对象的所有属性,将这些属性的值复制到 con
配置对象中。这里使用一个条件来排除以 _
开头的属性,这些属性通常是 argparse
内部使用的。
d、运行主函数
main(con) # 运行主函数
最后,这行代码调用 main
函数,并将配置对象 con
作为参数传递给它。
4、README.md
:
这个文件通常提供项目的介绍和使用说明,帮助用户理解如何设置和运行项目。
5、requirements.txt
:
该文件主要是列出项目的依赖包。本项目的依赖包如下:
pandas>=1.0.0
argparse
tensorflow>=2.5.0
matplotlib>=3.0.2
numpy>=1.14.6
scipy>=1.1.0
torch>=1.8.0
scikit-learn>=0.20.0
visdom
要安装 requirements.txt
文件中列出的所有依赖,可以使用 Python 的包管理工具 pip
在命令行中,导航到包含 requirements.txt
文件的目录,并运行以下命令:
pip install -r requirements.txt
这里的 -r
选项告诉 pip 从一个文件中读取依赖包列表,并进行安装。
到此就完全讲解结束了,以下是运行结果
五、运行结果
总结:
经过学习,可以做以下几点拓展:
- 多步预测:可以尝试为多步预测的时间序列预测模型。
- 更多模型:可以尝试加入更多的时间序列预测模型,如 GRU(Gated Recurrent Unit)或双向 LSTM,并观察它们与现有模型的表现对比。
- 新的数据集:可以尝试将该框架应用到其他时间序列数据集上,如温度预测、电力负荷预测等,以扩展其应用场景。
参考文章:
hichenway/stock_predict_with_LSTM: Predict stock with LSTM supporting pytorch, keras and tensorflow (github.com)
相关文章:
时间序列预测(十五)——有关Python项目框架的实例分析
#1024程序员节|征文# 在之前的学习中,已经对时间序列预测的相关内容有了大致的了解。为了进一步加深理解,并能够将所学知识应用于实际中,我决定找一个完整的Python框架来进行深入学习。经过寻找,我终于找到了一篇非常具…...
ETL、ELT和反向ETL都有什么不同?怎么选择?
数据处理是现代企业中不可或缺的一部分。随着数据量的不断增长,如何高效地处理、转换和加载数据变得尤为重要。本文将介绍三种常见的数据处理方式:ETL、ELT和反向ETL,帮助读者更好地理解和选择适合自己业务需求的方式。 一、ETL 定义&#…...
linux 中文实用型手册 基于RHEL(红帽系)
硬件系统 Updated by wangjing on 2024-10-28 at 02:36:57 in Tongzhou District, Beijing. 硬件信息 机器型号 dmidecode | grep "Product Name"CPU型号 cat /proc/cpuinfo |grep "model name" | uniqWWWCPU详情 lscpuCPU个数 cat /proc/cpuinfo |grep &q…...
Hash表算法
哈希表 理论知识(本文来自于代码随想录摘抄)什么是哈希常见的三种哈希结数组:set:map:其他常用方法或者技巧(自己总结的) 练习题和讲解有效的字母移位词349. 两个数组的交集1. 两数之和454. 四数相加 II15. 三数之和 总…...
MySQL企业常见架构与调优经验分享
文章目录 一、选择 PerconaServer、MariaDB 还是 MYSQL二、常用的 MYSQL 调优策略三、MYSOL 常见的应用架构分享四、MYSOL 经典应用架构 观看学习课程的笔记,分享于此~ 课程:MySQL企业常见架构与调优经验分享 mysql官方优化文档 调优MySQL参数 一、选择 …...
C++引用类型变量
引用变量的主要用途是用作函数的形参。这样函数将使用原始数据,而不是副本。除指针之外,引用也为处理大型结构提供了一种非常方便的途径。 再C中使用&符号标识引用。也就是说C给&符号赋予了另一个含义,将其用来声明引用。 引用的声…...
《C++23 新特性:现代软件开发的变革力量》
在软件开发的快速演进中,C作为一种强大且广泛应用的编程语言,不断推陈出新以适应日益复杂的开发需求。C23 的到来,为现代软件开发带来了诸多新的机遇和挑战。它的新特性不仅影响着开发者的编程习惯,也在代码效率、可维护性以及软件…...
Educational Codeforces Round 88 E. Modular Stability
题目链接 Educational Codeforces Round 88 E. Modular Stability 思路 对于任意的非负整数 x x x,我们要满足 x % a % b x % b % a x \% a \% b x \% b \% a x%a%bx%b%a。因为 a < b a < b a<b,所以只有 b b b为 a a a的倍数时才满足条件…...
Android中SurfaceView与GLSurfaceView 的关系
SurfaceView 与 GLSurfaceView 的关系 在 Android 开发中,SurfaceView 和 GLSurfaceView 是实现自定义渲染效果的关键组件。它们提供了不同的渲染方式,适用于不同的应用场景。我们将通过以下几个方面详细说明 SurfaceView 和 GLSurfaceView 的特点及实现…...
numpy——数学运算
一、标量——矢量 import numpy as npa 3.14 b np.array([[9, 5], [2, 7]])print(a) print(b)# ---------- 四则运算 ---------- print(a b) # np.add print(a - b) # np.subtract print(a * b) # np.multiply print(a / b) # np.divide 二、矢量——矢量 import nump…...
【工具】Charles对360浏览器抓包抓包
Charles 和 switchy sharp 配合,可以对 Chrome 进行抓包也可以配合对360安全浏览器抓包。 本文以Windows 电脑中的配置为例,介绍如何实现抓包。(Mac中操作基本一致) 1.安装Charles 可根据自己的电脑下载对应的版本:…...
【HarmonyOS】判断应用是否已安装
【HarmonyOS】判断应用是否已安装 前言 在鸿蒙中判断应用是否已安全,只是通过包名是无法判断应用安装与否。在鸿蒙里新增了一种判断应用安装的工具方法,即:canOpenLink。 使用该工具函数的前提是,本应用配置了查询标签querySch…...
Qt Designer客户端安装和插件集(pyqt5和pyside2)
GitHub - PyQt5/QtDesignerPlugins: Qt Designer PluginsQt Designer Plugins. Contribute to PyQt5/QtDesignerPlugins development by creating an account on GitHub.https://github.com/PyQt5/QtDesignerPlugins 一、下载客户端 https://github.com/PyQt5/QtDesigner/rel…...
基于边缘计算的智能门禁系统架构设计分析
案例 阅读以下关于 Web 系统架构设计的叙述,回答问题1至问题3。 【说明】 某公司拟开发一套基于边缘计算的智能门禁系统,用于如园区、新零售、工业现场等存在来访被访业务的场景。来访者在来访前,可以通过线上提前预约的方式将自己的个人信息…...
鸿蒙实现相机拍照及相册选择照片
前言: 1.如果你的应用不是存储类型或者相机拍照类型,你就需要用 kit.CameraKit Api 实现相机拍照和相册选择照片功能,如果你不用这个的话,你使用 picker.PhotoViewPicker ,你就需要申请权限,那你提交应用审…...
「C/C++」C++17 之 std::filesystem::recursive_directory_iterator 目录及子目录迭代器
✨博客主页何曾参静谧的博客📌文章专栏「C/C」C/C程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…...
智能EDA小白从0开始 —— DAY30 冉谱微RFIC-GPT
在科技日新月异的今天,电子设计自动化(EDA)行业正以前所未有的速度推动着半导体产业的革新与发展,引领着全球电子产业迈向更加智能化、高效化的未来。作为EDA领域的佼佼者,冉谱公司始终站在技术创新的前沿,…...
Android -- 调用系统相册之图片裁剪保存
前言 最近线上反馈,部分vivo手机更换头像时调用系统相册保存图片失败,经本人测试,确实有问题。 经修复后,贴出这块的代码供小伙伴们参考使用。 功能 更换头像选择图片: 调用系统相机拍照,调用系统图片…...
读《道德经》让人感到心胸气闷?董仲舒篡改
为什么读《道德经》会让人感到心胸气闷?难道是董仲舒篡改所致? 作为世界智慧源头的《老子》,享誉古今中外,是世界历史上最伟大的著作之一。 然而,很多人读《道德经》时会感到心胸气闷,这究竟是为什么呢&am…...
D52【python 接口自动化学习】- python基础之模块与标准库
day52 标准库 学习日期:20241029 学习目标:模块与标准库 -- 67 标准库:Python默认提供的便携功能有哪些? 学习笔记 标准库中的常见组件 如何通过官方文档学习标准 from urllib.request import urlopen with urlopen(http://ww…...
基于yolov8的布匹缺陷检测系统,支持图像、视频和摄像实时检测【pytorch框架、python源码】
更多目标检测和图像分类识别项目可看我主页其他文章 功能演示: 基于yolov8的布匹缺陷检测系统,支持图像、视频和摄像实时检测【pytorch框架、python源码】_哔哩哔哩_bilibili (一)简介 基于yolov8的布匹缺陷检测系统是在 PyTo…...
SQL Server 中,将单行数据转换为多行数据
在 SQL Server 中,将单行数据转换为多行数据通常涉及到将某个字段中的逗号分隔的值拆分成多行。这种操作通常称为“拆分”或“展开”(Explode)。以下是一些常用的方法来实现这一目标: 1. 使用内置函数 STRING_SPLIT 从 SQL Serv…...
解决数组两数之和问题与逻辑推理找出谋杀案凶手
给定一个整数数组nums和一个整数目标值target(2<nums.length<10^4),请你在该数组中找出和为目标值target 的那两个整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。 你可以按任意顺序返…...
uniapp的IOS证书申请(测试和正式环境)及UDID配置流程
1.说明 本教程只提供uniapp在ios端的证书文件申请(包含正式环境和开发环境)、UDID配置说明,请勿用文档中的账号和其他隐私数据进行测试,请勿侵权! 2.申请前准备 证书生成网站:苹果应用上传、解析&#x…...
windows 安装apex_Nvidia Apex安装
参见windows 安装apex_Nvidia Apex安装 重点: 1、在安装前先检查一下,电脑的cuda版本和pytorch内的cuda版本是否一样,不一样的话就把低版本的进行升级; $ git clone https://github.com/NVIDIA/apex$ cd apex2、在保证cuda版本一…...
Laravel5 抓取第三方网站图片,存储到本地
背景 近期发现,网站上的部分图片无法显示, 分析发现,是因为引用的第三方网站图片(第三方服务器证书已过期) 想着以后显示的方便 直接抓取第三方服务器图片,转存到本地服务器 思路 1. 查询数据表࿰…...
DevOps和CI/CD以及在微服务架构中的作用
DevOps 和 CI/CD 是现代软件开发和运维中两个重要的概念,它们之间有紧密的联系,但也有不同的侧重点。以下是对这两个概念的详细介绍和比较。 1. DevOps 定义: DevOps 是一种文化、运动和实践,旨在通过促进开发(Development)和运维(Operations)团队之间的协作,提升软…...
Rust 力扣 - 5. 最长回文子串
文章目录 题目描述题解思路题解代码题解链接 题目描述 题解思路 从中心点先寻找和中心点相等的左右端点,在基于左右端点进行往外扩散,直至左右端点不相等或者越界,然后左右端点这个范围内就是我们找寻的回文串,我们遍历中心点&am…...
DDOS防护介绍
DDoS攻击的基本概念 分布式拒绝服务攻击(DDoS)是一种网络攻击方式,攻击者通过控制多个被感染的计算机(僵尸网络)同时向目标服务器发送大量的网络请求,导致目标服务器资源耗尽,无法正常提供服务…...
深入了解 kotlinx-datetime:配置与使用指南
深入了解 kotlinx-datetime:配置与使用指南 在Kotlin多平台开发中,处理日期和时间是常见的需求。kotlinx-datetime库提供了强大且简洁的API来帮助开发者应对这一挑战。本文将详细介绍如何配置kotlinx-datetime库,并通过生动的示例演示其核心…...
wordpress 插入文章/河北网站建设案例
KUKA机器人码垛程序怎么写(案例)注:本文章文字、图片部分来自网络版权归原作者,侵删。工博士提供了KUKA,Yaskawa,ABB,Kawasaki和FANUC等各种新型机器人。我们相信,我们真正地在协助第四次工业革命的进步&am…...
三木做网站/深圳互联网公司排行榜
欢迎访问XYNUOJ 1080: 习题5-7 求和 时间限制: 1 Sec 内存限制: 12 MB提交: 62 解决: 57[提交][状态][讨论版][Edit] [TestData]题目描述 求如下式子的和 请将结果定义为double类型。 注意求平方,不要用C数学库中提供的函数pow。 输入 无输出 小数点后保留6位小数…...
临沂住房和城乡建设厅网站/直通车关键词优化口诀
前几天撸项目代码时, 由一个技术点间接牵扯出了这东西. 所以就来总结一下. 深拷贝 拷贝对象每个层级的属性. 作用的对象是 js中引用类型的对象,基本类型没有涉及. 本质上将引用类型的对象在堆上重新开辟一块新的空间进行存放. 1 var p_1 {name: 病猫, age: 22}; 2…...
做网站的费用/如何把一个关键词优化到首页
电厂的安全问题一直是发电企业高度关注的问题,安全隐患大体上分为21大类,包括火灾、爆炸、中毒和窒息、水害、坍塌、滑坡、泄漏、腐蚀、触电、坠落、机械伤害、煤与瓦斯突出、公路设施伤害、公路车辆伤害、铁路设施伤害、铁路车辆伤害、水上运输伤害、港…...
网站支持asp/杭州seo技术培训
iOS 获取图片有三种方法: 1. 直接调用摄像头拍照 2. 从相册中选择 3. 从图库中选择 UIImagePickerController 是系统提供的用来获取图片和视频的接口; 用UIImagePickerController 类来获取图片视频,大体分为以下几个步骤: 1. 初始…...
企业注册资金需要实缴吗/广州网站优化服务商
【编者按】本文转载自个人博客Heidi格物志,作者为heidixie。本文通过对产品设计的理解、以及对用户本身的了解,对交互设计的理论、意识以及交互方法进行分析。 用户不需要成为一个设计师或者专业的学者,将产品研究透彻才去使用。你能理解用户…...