PyTorch与TensorFlow模型全方位解析:保存、加载与结构可视化
目录
- 前言
- 一、保存整个模型
- 二、pytorch模型的加载
- 2.1 只保存的模型参数的加载方式:
- 2.2 保存结构和参数的模型加载
- 三、pytorch模型网络结构的查看
- 3.1 print
- 3.2 summary
- 3.3 netron
- 3.3.1 解决方法1
- 3.3.2 解决方法2
- 3.4 TensorboardX
- 四、tensorflow 框架的线性回归
- 4.1 tensorflow模型的定义
- 4.1.1 tf.keras.Sequential
- 4.1.2 tf.keras.Sequential()另一种方式
- 4.1.3 就是写一个类重写实现网络的搭建
- 4.1.4 tensorflow中最常用的
- 4.2 tensorflow模型的保存
- 4.2.1 保存为 .h5
- 4.2.2 只保存参数
- 4.3 tensorflow模型的加载
- 4.3.1 模型加载 针对方式1
- 4.3.2 加载只保存参数,包括权重w及偏置b
- 4.4 tensorflow模型网络结构的查看
- 4.4.1 summary() 模型搭建好就有summary()
- 4.4.2 使用netron
- 4.4.3 最经典的 tensorboard 方法
- 总结
前言
书接上文
PyTorch 线性回归详解:模型定义、保存、加载与网络结构-CSDN博客本文全面阐述了PyTorch框架下线性回归的实现过程,涵盖了模型定义的不同方式(如nn.Sequential、nn.ModuleList等)、模型保存方法(torch.save()),以及模型加载和网络结构查看。结合具体代码示例,旨在帮助读者深入理解并掌握PyTorch在解决线性回归问题中的应用。https://blog.csdn.net/qq_58364361/article/details/147329215?spm=1011.2415.3001.10575&sharefrom=mp_manage_link
一、保存整个模型
保存:要保存整个模型,包括其结构和参数,可以使用torch.save()函数保存整个模型。
将整个模型保存到名为"entire_model.pth"的文件中。但是要注意,保存整个模型可能会占用更多的磁盘空间,并且不如保存状态字典灵活,因为状态字典可以与不同的模型结构兼容。
import torch
import numpy as np# 1. 数据准备
# 定义原始数据,包含x和y值
data = [[-0.5, 7.7], [1.8, 98.5], [0.9, 57.8],[0.4, 39.2], [-1.4, -15.7],[-1.4, -37.3], [-1.8, -49.1],[1.5, 75.6], [0.4, 34.0],[0.8, 62.3]]
# 将数据转换为NumPy数组,方便后续处理
data = np.array(data)
# 从NumPy数组中提取x和y数据
x_data = data[:, 0] # 所有行的第0列,即x值
y_data = data[:, 1] # 所有行的第1列,即y值# 2. 数据转换为Tensor
# 将NumPy数组转换为PyTorch张量,这是使用PyTorch进行计算的基础
x_train = torch.tensor(x_data, dtype=torch.float32) # 将x数据转换为float32类型的张量
y_train = torch.tensor(y_data, dtype=torch.float32) # 将y数据转换为float32类型的张量# 3. 使用DataLoader加载数据
# 导入DataLoader和TensorDataset
from torch.utils.data import DataLoader, TensorDataset# 将x_train和y_train组合成一个数据集
dataset = TensorDataset(x_train, y_train) # 创建一个TensorDataset,将x和y数据配对# 使用DataLoader创建数据加载器,用于批量处理数据
dataloader = DataLoader(dataset, batch_size=2, shuffle=False) # batch_size=2表示每次加载2个样本,shuffle=False表示不打乱数据顺序# 4. 定义模型
import torch.nn as nn # 导入torch.nn模块,通常简写为nn,包含神经网络相关的类和函数# 定义线性回归模型
class LinearModel(nn.Module): # 继承nn.Module,这是所有神经网络模块的基类# 构造函数,用于初始化模型def __init__(self):super(LinearModel, self).__init__() # 调用父类的构造函数# 定义一个线性层,输入维度为1,输出维度为1self.layers = nn.Linear(1, 1) # 创建一个线性层,用于学习线性关系# 前向传播函数,定义模型的计算过程def forward(self, x):# 将输入x通过线性层x = self.layers(x) # 将输入数据通过线性层进行计算return x # 返回计算结果# 5. 初始化模型
# 创建模型实例
model = LinearModel() # 实例化线性回归模型# 6. 定义损失函数
# 使用均方误差作为损失函数
criterion = nn.MSELoss() # 创建MSELoss实例,用于计算损失# 7. 定义优化器
# 使用随机梯度下降算法作为优化器
optimizer = torch.optim.SGD(model.parameters(), lr=0.01) # 创建SGD优化器,用于更新模型参数, lr是学习率# 8. 训练模型
# 设置迭代次数
epoches = 500 # 设置迭代次数# 循环迭代训练模型
for n in range(1, epoches + 1): # 迭代epoches次epoch_loss = 0 # 初始化epoch损失# 遍历dataloader,获取每个batch的数据for batch_x, batch_y in dataloader: # 遍历dataloader,每次返回一个batch的x和y数据# 增加x_batch的维度,以匹配线性层的输入维度x_batch_add_dim = batch_x.unsqueeze(1) # 在第1维增加一个维度,将x_batch从[batch_size]变为[batch_size, 1]# 使用模型进行预测y_pre = model(x_batch_add_dim) # 将x_batch输入模型,得到预测值# 计算损失batch_loss = criterion(y_pre.squeeze(1), batch_y) # 计算预测值和真实值之间的均方误差, squeeze(1) 移除维度为1的维度# 梯度更新optimizer.zero_grad() # 清空优化器中的梯度,避免累积# 计算损失函数对模型参数的梯度batch_loss.backward() # 反向传播,计算梯度# 根据优化算法更新参数optimizer.step() # 使用优化器更新模型参数epoch_loss = epoch_loss + batch_loss # 累加每个batch的损失avg_loss = epoch_loss / (len(dataloader)) # 计算平均损失# 打印训练信息if n % 100 == 0 or n == 1: # 每100次迭代打印一次信息print(model) # 打印模型结构torch.save(model, f'model_{n}.pth') #保存模型print(f"epoches:{n},loss:{avg_loss}") # 打印迭代次数和损失值
二、pytorch模型的加载
模型的保存有两种方式,模型的加载也有两种方式
加载:
要加载保存的模型,使用torch.load()函数
2.1 只保存的模型参数的加载方式:
加载模型需要3步骤:
步骤1:需要模型结构(保存时搭建的模型)
步骤2:使用torch.load("model.pth")加载模型参数
步骤3::实例化模型(model)使用model.load_state_dict(torch.load("model.pth"))将model和参数结合起来
import torch.nn as nn
import torch
import numpy as np# 示例数据
data = [[-0.5, 7.7], [1.8, 98.5], [0.9, 57.8], [0.4, 39.2], [-1.4, -15.7], [-1.4, -37.3], [-1.8, -49.1], [1.5, 75.6],[0.4, 34.0], [0.8, 62.3]]
data = np.array(data)
x_data = data[:, 0] # 获取 x 数据
y_data = data[:, 1] # 获取 y 数据x_train = torch.tensor(x_data, dtype=torch.float32) # 将 x 数据转换为 PyTorch 张量
y_train = torch.tensor(y_data, dtype=torch.float32) # 将 y 数据转换为 PyTorch 张量from torch.utils.data import DataLoader, TensorDatasetdataset = TensorDataset(x_train, y_train) # 创建 TensorDataset
dataloader = DataLoader(dataset, batch_size=2, shuffle=False) # 创建 DataLoaderimport torch.nn as nnclass LinearModel(nn.Module):"""线性模型类"""def __init__(self):"""初始化线性模型"""super(LinearModel,self,).__init__()# 定义一个线性层self.layers = nn.Linear(1, 1)def forward(self,x):"""前向传播函数:param x: 输入张量:return: 输出张量"""x = self.layers(x) # 通过线性层return xmodel = LinearModel() # 实例化线性模型model.load_state_dict(torch.load("model_1.pth")) # 加载模型参数model.eval() # 设置为评估模式
x_test = torch.tensor([[-0.5]], dtype=torch.float32) # 创建测试数据
with torch.no_grad(): # 禁用梯度计算y_pre = model(x_test) # 进行预测
print(y_pre) # 打印预测结果
2.2 保存结构和参数的模型加载
加载模型需要2步骤:
步骤1:需要模型结构
步骤2:使用torch.load("entire_model.pth")加载模型
import torch
import numpy as np# 准备数据:输入特征和对应的目标值
data = [[-0.5, 7.7], [1.8, 98.5], [0.9, 57.8], [0.4, 39.2], [-1.4, -15.7], [-1.4, -37.3], [-1.8, -49.1], [1.5, 75.6],[0.4, 34.0], [0.8, 62.3]]
data = np.array(data)
# 提取输入特征 (x) 和目标值 (y)
x_data = data[:, 0]
y_data = data[:, 1]# 将数据转换为 PyTorch 张量,并指定数据类型为 float32
x_train = torch.tensor(x_data, dtype=torch.float32)
y_train = torch.tensor(y_data, dtype=torch.float32)# 导入 DataLoader 和 TensorDataset
from torch.utils.data import DataLoader, TensorDataset# 创建 TensorDataset,将 x_train 和 y_train 组合成数据集
dataset = TensorDataset(x_train, y_train)
# 创建 DataLoader,用于批量加载数据
dataloader = DataLoader(dataset, batch_size=2, shuffle=False)import torch.nn as nn# 定义线性模型类
class LinearModel(nn.Module):def __init__(self):super(LinearModel,self,).__init__()# 定义一个线性层,输入维度为 1,输出维度为 1self.layers = nn.Linear(1, 1)def forward(self,x):# 定义前向传播过程x = self.layers(x)return x# 加载预训练的模型
model = torch.load("model_1.pth")# 将模型设置为评估模式,禁用 dropout 等
model.eval()
# 创建一个测试数据
x_test = torch.tensor([[-0.5]], dtype=torch.float32)
# 在无梯度计算的环境下进行预测
with torch.no_grad():# 使用加载的模型进行预测y_pre = model(x_test)
# 打印预测结果
print(y_pre)
三、pytorch模型网络结构的查看
3.1 print
print(model) 能打印出网络结构,不能检测模型搭建是否正确
print(model)
仅打印模型结构。
import torch.nn as nn # 导入神经网络模块
import torch # 导入 torch
import numpy as np # 导入 numpy# 定义数据集,包含输入和输出
data = [[-0.5, 7.7], [1.8, 98.5], [0.9, 57.8], [0.4, 39.2], [-1.4, -15.7], [-1.4, -37.3], [-1.8, -49.1], [1.5, 75.6],[0.4, 34.0], [0.8, 62.3]]
data = np.array(data) # 将数据转换为 numpy 数组
x_data = data[:, 0] # 获取输入数据
y_data = data[:, 1] # 获取输出数据x_train = torch.tensor(x_data, dtype=torch.float32) # 将输入数据转换为 tensor
y_train = torch.tensor(y_data, dtype=torch.float32) # 将输出数据转换为 tensorfrom torch.utils.data import DataLoader, TensorDataset # 导入 DataLoader 和 TensorDatasetdataset = TensorDataset(x_train, y_train) # 将输入和输出数据组合成 dataset
dataloader = DataLoader(dataset, batch_size=2, shuffle=False) # 创建 dataloader,用于批量加载数据import torch.nn as nn # 导入神经网络模块# 定义线性模型
class LinearModel(nn.Module):def __init__(self):super(LinearModel,self,).__init__() # 调用父类构造函数self.layers = nn.Linear(1, 1) # 定义一个线性层,输入维度为 1,输出维度为 1self.layers1 = nn.Linear(2, 2) # 定义一个线性层,输入维度为 2,输出维度为 2def forward(self,x): # 定义前向传播函数x = self.layers(x) # 通过第一个线性层x = self.layers1(x) # 通过第二个线性层return x # 返回输出model = LinearModel() # 实例化模型
print(model) # 打印模型结构
3.2 summary
先安装 pip install torchsummary
torchsummary
主要用于查看模型结构 并且检测网络是否搭建正确,不正确就报错
import torch.nn as nn # 导入神经网络模块
import torch # 导入torch
import numpy as np # 导入numpy# 准备数据
data = [[-0.5, 7.7], [1.8, 98.5], [0.9, 57.8], [0.4, 39.2], [-1.4, -15.7], [-1.4, -37.3], [-1.8, -49.1], [1.5, 75.6],[0.4, 34.0], [0.8, 62.3]]
data = np.array(data) # 转换为numpy数组
x_data = data[:, 0] # 获取x数据
y_data = data[:, 1] # 获取y数据x_train = torch.tensor(x_data, dtype=torch.float32) # 转换为torch张量
y_train = torch.tensor(y_data, dtype=torch.float32) # 转换为torch张量from torch.utils.data import DataLoader, TensorDataset # 导入DataLoader和TensorDatasetdataset = TensorDataset(x_train, y_train) # 创建数据集
dataloader = DataLoader(dataset, batch_size=2, shuffle=False) # 创建数据加载器import torch.nn as nn # 导入神经网络模块# 定义线性模型
class LinearModel(nn.Module):def __init__(self):super(LinearModel,self,).__init__() # 调用父类初始化方法self.layers = nn.Linear(1, 2) # 定义线性层1,输入维度1,输出维度2self.layers1 = nn.Linear(2, 5) # 定义线性层2,输入维度2,输出维度5def forward(self,x): # 定义前向传播函数x = self.layers(x) # 通过线性层1x = self.layers1(x) # 通过线性层2return x # 返回输出model = LinearModel() # 实例化模型from torchsummary import summary # 导入summarysummary(model,input_size=(1,), # 输入尺寸device="cpu" # 设备)
3.3 netron
pip install --upgrade netron
netron
pycharm 终端下输入 pip install netron -i Simple Index
下载好后,在终端下输入 netron,在浏览器上输入 http://localhost:8080 即可
netron
用于模型文件的可视化,
问题:netron对pytorch支持不好,层和层之间没有连线
3.3.1 解决方法1
什么是 JIT?
首先要知道 JIT 是一种概念,全称是 Just In Time Compilation,中文译为「即时编译」,是一种程序优化的方法
将模型保存为脚本文件分两步
step1,先转化为脚本模型
script_model=torch.jit.script(model)
step2保存为文件
torch.jit.save(script_model,"script_model.pth")
使用netron打开有连线了
import torch.nn as nn # 导入神经网络模块
import torch # 导入torch
import numpy as np # 导入numpy# 准备数据
data = [[-0.5, 7.7], [1.8, 98.5], [0.9, 57.8], [0.4, 39.2], [-1.4, -15.7], [-1.4, -37.3], [-1.8, -49.1], [1.5, 75.6],[0.4, 34.0], [0.8, 62.3]]
data = np.array(data) # 转换为numpy数组
x_data = data[:, 0] # 获取x数据
y_data = data[:, 1] # 获取y数据x_train = torch.tensor(x_data, dtype=torch.float32) # 转换为torch张量
y_train = torch.tensor(y_data, dtype=torch.float32) # 转换为torch张量
print(x_train) # 打印x_train
import torch.nn as nn # 再次导入神经网络模块criterion = nn.MSELoss() # 定义均方误差损失函数# 定义线性模型
class LinearModel(nn.Module):def __init__(self):super(LinearModel,self,).__init__() # 调用父类初始化方法self.layers = nn.Linear(1, 1) # 定义线性层1,输入维度1,输出维度1self.layers1 = nn.Linear(1, 2) # 定义线性层2,输入维度1,输出维度2def forward(self,x): # 定义前向传播函数x = self.layers(x) # 通过线性层1x = self.layers1(x) # 通过线性层2return x # 返回输出model = LinearModel() # 实例化模型
script_model = torch.jit.script(model) # 将模型转换为 TorchScript
torch.jit.save(script_model, 'script_model.pth') # 保存 TorchScript 模型
3.3.2 解决方法2
转成ONNX保存,ONNX(Open Neural Network Exchange)是一个开放的深度学习模型交换格式,它允许在不同的深度学习框架之间共享、迁移和使用模型。ONNX的目标是提供一个通用的中间表示,使得各种深度学习框架(如pytorch tensorflow MXNeE等)之间能够更轻松交换模型,并且能够在不同框架之间进行模型的部署和推理。
转化为ONNX模型,如果不能运行就安装onnx
安装命令 pip install onnx -i Simple Index
import torch.nn as nn # 导入神经网络模块
import torch # 导入torch
import numpy as np # 导入numpy# 准备数据,这里是一些二维数据点
data = [[-0.5, 7.7], [1.8, 98.5], [0.9, 57.8], [0.4, 39.2], [-1.4, -15.7], [-1.4, -37.3], [-1.8, -49.1], [1.5, 75.6],[0.4, 34.0], [0.8, 62.3]]
data = np.array(data) # 将数据转换为numpy数组,方便后续处理
x_data = data[:, 0] # 从数据中提取x坐标
y_data = data[:, 1] # 从数据中提取y坐标x_train = torch.tensor(x_data, dtype=torch.float32) # 将x坐标转换为torch张量,并指定数据类型为float32
y_train = torch.tensor(y_data, dtype=torch.float32) # 将y坐标转换为torch张量,并指定数据类型为float32
print(x_train) # 打印x_train,用于调试
import torch.nn as nn # 再次导入神经网络模块,虽然已经导入过,但为了代码完整性保留criterion = nn.MSELoss() # 定义均方误差损失函数,用于衡量模型预测值和真实值之间的差距# 定义一个线性模型类,继承自nn.Module
class LinearModel(nn.Module):def __init__(self):# 调用父类的初始化方法super(LinearModel,self,).__init__()# 定义一个线性层,输入维度为1,输出维度为1self.layers = nn.Linear(1, 1)# 定义一个线性层,输入维度为1,输出维度为2self.layers1 = nn.Linear(1, 2)# 定义一个线性层,输入维度为2,输出维度为2self.layers2 = nn.Linear(2, 2)def forward(self,x):# 定义模型的前向传播过程x = self.layers(x) # 将输入x通过第一个线性层x = self.layers1(x) # 将第一个线性层的输出通过第二个线性层x = self.layers2(x) # 将第二个线性层的输出通过第三个线性层return x # 返回模型的输出model = LinearModel() # 实例化线性模型torch.onnx.export(model, # 要导出的模型torch.rand(1, 1), # 模型的输入,这里使用一个随机张量"model1.onnx" # 导出的onnx模型的文件名)
3.4 TensorboardX
TensorboardX 这个工具使得 pytorch 框架也可以使用到 Tensorboard 的便捷功能。
安装:
pip install TensorboardX -i Simple Index
tensorboardX
可以记录和可视化模型训练过程中的指标以及模型结构。,
求换到logs路径下执行下面命令
#tensorboard --logdir ./logs
python -m tensorboard.main --logdir="./logs"
就可以通过http://localhost:6006/ 查看了
import torch # 导入torch
import numpy as np # 导入numpydata = [[-0.5, 7.7], [1.8, 98.5], [0.9, 57.8], [0.4, 39.2], [-1.4, -15.7], [-1.4, -37.3], [-1.8, -49.1], [1.5, 75.6],[0.4, 34.0], [0.8, 62.3]] # 定义数据集
data = np.array(data) # 将数据转换为numpy数组
x_data = data[:, 0] # 获取x坐标数据
y_data = data[:, 1] # 获取y坐标数据x_train = torch.tensor(x_data, dtype=torch.float32) # 将x数据转换为torch张量,指定数据类型
y_train = torch.tensor(y_data, dtype=torch.float32) # 将y数据转换为torch张量,指定数据类型
print(x_train) # 打印x_train,用于调试
import torch.nn as nn # 再次导入神经网络模块,避免潜在的未定义错误criterion = nn.MSELoss() # 定义均方误差损失函数class LinearModel(nn.Module): # 定义线性模型def __init__(self): # 定义初始化方法super(LinearModel,self,).__init__() # 调用父类初始化方法self.layers = nn.Linear(1, 1) # 定义线性层,输入维度为1,输出维度为1def forward(self,x): # 定义前向传播函数x = self.layers(x) # 将输入x通过线性层return x # 返回输出model = LinearModel() # 实例化线性模型
from tensorboardX import SummaryWriter # 导入SummaryWriter,用于TensorBoard可视化writer = SummaryWriter(logdir="logs") # 创建SummaryWriter实例,指定日志存储路径
optimizer = torch.optim.SGD(model.parameters(), lr=0.01) # 定义优化器,使用随机梯度下降算法epoches = 500 # 定义训练轮数
for n in range(1, epoches + 1): # 循环训练y_prd = model(x_train.unsqueeze(1)) # 模型预测,unsqueeze(1)将x_train的维度从(N,)变为(N,1)loss = criterion(y_prd.squeeze(1), y_train) # 计算损失,squeeze(1)将y_prd的维度从(N,1)变为(N,)optimizer.zero_grad() # 梯度清零loss.backward() # 反向传播,计算梯度optimizer.step() # 更新模型参数writer.add_scalar("loss", loss, n) # 将损失值写入TensorBoardwriter.add_scalar("learing_rate", optimizer.param_groups[0]["lr"], n) # 将学习率写入TensorBoardif n % 10 == 0 or n == 1: # 每10轮打印一次损失值print(f"epoches:{n},loss:{loss}") # 打印轮数和损失值writer.add_graph(model, torch.rand(1, 1)) # 将模型结构写入TensorBoard
writer.close() # 关闭SummaryWriter
四、tensorflow 框架的线性回归
从以下5个方面对深度学习框架tensorflow框架的线性回归进行介绍
1.tensorflow模型的定义
2.tensorflow模型的保存
3.tensorflow模型的加载
4.tensorflow模型网络结构的查看
5.tensorflow框架线性回归的代码实现
上面这5方面的内容,让大家,掌握并理解tensorflow框架实现线性回归的过程。
tensorflow官网
https://www.tensorflow.org/guide/keras/sequential_modelhttps://www.tensorflow.org/guide/keras/sequential_model
下面这个网址也可以使用
Module: tf | TensorFlow v2.16.1## TensorFlowhttps://tensorflow.google.cn/api_docs/python/tf
4.1 tensorflow模型的定义
什么是tf.keras?
tf.keras的功能是实现tensorflow模型搭建、模型训练和模型预测
4.1.1 tf.keras.Sequential
import tensorflow as tfmodel=tf.keras.Sequential([tf.keras.layers.Dense(1,#输出特征的维度
input_shape=(1,)#输入的特征维度
)] #使用序列层需要在列表中添加线性层)
4.1.2 tf.keras.Sequential()另一种方式
import tensorflow as tf
#方案2的第1种方法
model=tf.keras.Sequential() #申请一个序列的对象
model.add(tf.keras.Input(shape=(1,)))
model.add(tf.keras.layers.Dense(1))
#方案2的第2种方法
model=tf.keras.Sequential()
model.add(tf.keras.layers.Dense(1,input_shape=(1,)))
4.1.3 就是写一个类重写实现网络的搭建
import tensorflow as tf
from tensorflow.keras import Modelclass Linear(Model):#初始化def __init__(self):super(Linear,self).__init__()#定义网络层self.linear=tf.keras.layers.Dense(1)#和pytroch有点不同,pytorch使用forward 这里使用call函数调用def call(self,x,**kwargs):x=self.linear(x)return x
model=Linear()
4.1.4 tensorflow中最常用的
import tensorflow as tf
#直接写个函数
def linear():#input 表示输入的特征维度信息,且要指定数据类型input=tf.keras.layers.Input(shape=(1,),dtype=tf.float32)#下面层数搭建必须要把上一次的输入使用圆括号括起来y=tf.keras.layers.Dense(1)(input)#最后网络网络搭建以后必须使用tf.keras.models.Model进行封装,且输入参数(inputs)为输入的维度信息,输出参数(outputs)为最后一层网络输出model=tf.keras.models.Model(inputs=input,outputs=y)#返回模型return model
model=linear()
4.2 tensorflow模型的保存
模型的保存方式
4.2.1 保存为 .h5
HDF5文件 后缀名 .h5
保存参数、模型结构、训练的配置等等
只针对函数或者顺序模型的方式 方案3不支持
model.save('./my_model.h5')
4.2.2 只保存参数
保存参数包括权重w及偏置b
model.save_weights('./model.weights.h5')
import tensorflow as tf
from tensorflow.keras import Model#tensorflow最常用的搭建方式
#直接写个函数
def linear():#input 表示输入的特征维度信息,且要指定数据类型input=tf.keras.layers.Input(shape=(1,),dtype=tf.float32)#下面层数搭建必须要把上一次的输入使用圆括号括起来y=tf.keras.layers.Dense(1)(input)#最后网络网络搭建以后必须使用tf.keras.models.Model进行封装,且输入参数(inputs)为输入的维度信息,输出参数(outputs)为最后一层网络输出model=tf.keras.models.Model(inputs=input,outputs=y)#返回模型return model
model=linear()model.save('./my_model.h5')#保存为参数方式
model.save_weights('./model.weights.h5')
4.3 tensorflow模型的加载
4.3.1 模型加载 针对方式1
import tensorflow as tf
from tensorflow.keras import Model
#针对第一个方案 所有的参数都保存了
# 模型的加载方式 # 方式1: HDF5文件 后缀名 .h5
#加载参数、模型结构、训练的配置等等
#方式1:与pytorch区别,pytorch需要原来的模型结构,
# 在tensorflow里面可以不给原来的模型结构load_model=tf.keras.models.load_model('my_model.h5')
print(load_model)
4.3.2 加载只保存参数,包括权重w及偏置b
import tensorflow as tf
def linear():#input 表示输入的特征维度信息,且要指定数据类型input=tf.keras.layers.Input(shape=(1,),dtype=tf.float32)#下面层数搭建必须要把上一次的输入使用圆括号括起来y=tf.keras.layers.Dense(1)(input)#最后网络网络搭建以后必须使用tf.keras.models.Model进行封装,且输入参数(inputs)为输入的维度信息,输出参数(outputs)为最后一层网络输出model=tf.keras.models.Model(inputs=input,outputs=y)#返回模型return model
model=linear()model.load_weights('model.weights.h5')
print(model)
4.4 tensorflow模型网络结构的查看
4.4.1 summary() 模型搭建好就有summary()
print(model.summary())
4.4.2 使用netron
netron pycharm 终端下输入 pip install netron
下载好后,在终端下输入 netron,
在浏览器上输入 http://localhost:8080 即可
打开一个模型后刷新就可以打开另一个模型
4.4.3 最经典的 tensorboard 方法
#在计算图中添加模型
tensorboard_callback=tf.keras.callbacks.TensorBoard(log_dir='./logs')
#callbacks需要一个列表
model.fit(x_train,y_train,epochs=epochs,callbacks=[tensorboard_callback])
下载tensorboard 终端 下载 pip install tensorboard ,下载成功后,切到日志写入的文件夹的上一个文件夹所在位置 ,输入python -m tensorboard.main --logdir="./logs" 下面会出来一个网址 http://localhost:6006/ 在浏览器打开就可以了。会显示缺少这个包,将six安装上 pip install six
效果图
模型训练好网络查看代码
#导入库
import tensorflow as tf
import numpy as np
from tensorflow.keras import Model
#设置随机化种子
seed=1
#设置随机数种子 确保每次的运行结果一致
tf.random.set_seed(seed)# 1.散点输入 定义输入数据
data = [[-0.5, 7.7], [1.8, 98.5], [0.9, 57.8], [0.4, 39.2], [-1.4, -15.7], [-1.4, -37.3], [-1.8, -49.1], [1.5, 75.6], [0.4, 34.0], [0.8, 62.3]]
#转化为数组
data=np.array(data)
# 提取x 和y
x_data=data[:,0]
y_data=data[:,1]#转化为tensorflow用的张量 创建张量
x_train=tf.constant(x_data,dtype=tf.float32)
y_train=tf.constant(y_data,dtype=tf.float32)#可以将numpy数组或者tensorflow张量 把数据切成(x_train_i,y_train_i)
dataset=tf.data.Dataset.from_tensor_slices((x_train,y_train))
#shuffle是打乱,但是这个buffer_size是啥?
# buffer_size规定了乱序缓冲区的大小,且要求缓冲区大小小于或等于数据集的完整大小;
# 假设数据集的大小为10000,buffer_size为1000,最开始算法会把前1000个数据放入缓冲区;
#当从缓冲区内的这1000个数据中随机选出一个元素后,这个元素的位置会被数据集的第1001个数据替换;然后再从
#这1000个元素中随机选择第2个元素,第2个会被数据集中第1002个数据替换,以此类推,此外buffer_size不宜过大
# ,过大会导致内存爆炸
dataset=dataset.shuffle(buffer_size=10)
#数据集的batch是2
dataset=dataset.batch(2)
#预取训练的方式,CPU取数据,GPU tpu会取出来一批数据,在cpu上没效果 效果会改善延迟和吞吐量
dataset=dataset.prefetch(buffer_size=tf.data.experimental.AUTOTUNE)# 方案4
def linear():input=tf.keras.layers.Input(shape=(1,),dtype=tf.float32)y=tf.keras.layers.Dense(1)(input)model=tf.keras.models.Model(inputs=input,outputs=y)return model
model=linear()
# #3.定义损失函数和优化器
optimizer=tf.keras.optimizers.SGD(learning_rate=0.01)
#模型配置
model.compile(optimizer=optimizer,#配置优化器loss="mean_squared_error"#配置使用什么损失函数)#查看网络结构
#方法1:summary()
#结构中None是batch
print(model.summary())#方法2 使用netron
# netron pycharm 终端下输入 pip install netron
# 下载好后,在终端下输入 netron,
# 在浏览器上输入 http://localhost:8080 即可
# 打开一个模型后刷新就可以打开另一个模型#方法 3 最经典的 tensorboard 方法
epochs=500
#在计算图中添加模型
tensorboard_callback=tf.keras.callbacks.TensorBoard(log_dir='./logs')
#callbacks需要一个列表
#模型训练
model.fit(x_train,#输入数据y_train,#输入标签数据epochs=epochs,#迭代的次数callbacks=[tensorboard_callback]#图形展示可有可无)
#保存模型
model.save_weights("model.weights.h5")
#预测模型
input_data=np.array([[-0.5]])
pre=model.predict(input_data)
#从数组中提取出结果值
print(f"model result :{pre[0][0]:2.3f}")
总结
本文全面介绍了PyTorch和TensorFlow两大深度学习框架中模型的保存、加载以及网络结构可视化的方法。针对PyTorch,详细讲解了使用torch.save()
保存和torch.load()
加载整个模型以及仅保存模型参数的方法,并探讨了如何使用print(model)
、torchsummary
、Netron
和TensorboardX
等工具查看和验证模型结构。对于TensorFlow,文章阐述了使用tf.keras
定义模型的三种方式,包括tf.keras.Sequential
、通过类继承重写以及函数式API,并介绍了将模型保存为.h5
文件和仅保存模型参数的方法。同时,本文还展示了TensorFlow模型加载以及使用summary()
、Netron
和TensorBoard
等工具进行模型结构可视化的具体步骤。
相关文章:
PyTorch与TensorFlow模型全方位解析:保存、加载与结构可视化
目录 前言一、保存整个模型二、pytorch模型的加载2.1 只保存的模型参数的加载方式:2.2 保存结构和参数的模型加载三、pytorch模型网络结构的查看3.1 print3.2 summary3.3 netron3.3.1 解决方法13.3.2 解决方法23.4 TensorboardX四、tensorflow 框架的线性回归4.1 …...
【图像变换】pytorch-CycleGAN-and-pix2pix的学习笔记
1. 问题记录 (1)在2080Ti上训练时模型“卡在了第63个epoch”没有任何变换 我们观察到模型一直卡在这里,“像静止了一样”没有任何变化; 也查看了一下显卡情况,看到显存占用为0%,如图所示,...
微信小程序 == 倒计时验证码组件 (countdown-verify)
组件介绍 这是一个用于获取验证码的倒计时按钮组件,支持自定义倒计时时间、按钮样式和文字格式。 基本用法 <countdown-verify seconds"60"button-text"获取验证码"bind:send"onSendVerifyCode" />属性说明 属性名类型默认…...
Ldap高效数据同步- Delta-Syncrepl复制模式配置实战手册(上)
#作者:朱雷 文章目录 一、Syncrepl 和Delta-syncrepl 回顾对比1.1. 什么是复制模式1.2. 什么是 syncrepl同步复制1.3. syncrepl同步复制的缺点1.4. 什么是Delta-syncrepl 复制 二、Ldap环境部署三、配置复制类型3.1. 编译安装3.2. 提供者端配置 一、Syncrepl 和Del…...
【Hive入门】Hive概述:大数据时代的数据仓库桥梁
目录 1 Hive概述:连接SQL世界与Hadoop生态 2 从传统数据仓库到Hive的演进之路 2.1 传统数据仓库的局限性 2.2 Hive的革命性突破 3 Hive的核心架构与执行流程 3.1 Hive系统架构 3.2 SQL查询执行全流程 4 Hive与传统方案的对比分析 5 Hive最佳实践 5.1 存储…...
靠华为脱胎换骨,但赛力斯仍需要Plan B
文|刘俊宏 编|王一粟 2024年底,撒贝宁在央视的一场直播中,终于“按捺不住”问了赛力斯董事长张兴海一个好奇已久的问题——“与华为合作之后,晚上是不是乐得睡不着觉?” “睡觉的时候还是该睡觉......不…...
【ESP32】【微信小程序】MQTT物联网智能家居案例
这里写自定义目录标题 案例成果1.Ardino写入部分2.微信小程序JS部分3.微信小程序xml部分4. 微信小程序CSS部分 案例成果 1.Ardino写入部分 #include <WiFi.h> // ESP32 WiFi库 #include <PubSubClient.h> // MQTT客户端库 #include <DHT.h> …...
应用层核心协议详解:HTTP, HTTPS, RPC 与 Nginx
应用层核心协议详解:HTTP, HTTPS, RPC 与 Nginx 前言一、HTTP:Web的基石1.1 HTTP协议的核心特点1.2 HTTP 报文格式1.3 HTTP 方法 (Methods)1.4 HTTP 状态码 (Status Codes)1.5 连接管理:短连接 vs 长连接1.6 HTTP 版本演进1.7 状态管理&#…...
解析三大中间件:Nginx、Apache与Tomcat
目录 一、基础定义与核心功能 二、核心区别与适用场景对比 三、为什么需要组合使用? 四、如何选择?一句话总结 五、技术演进与未来趋势 一、基础定义与核心功能 Nginx 定位:高性能的HTTP服务器与反向代理工具。核心能…...
关于 梯度下降算法、线性回归模型、梯度下降训练线性回归、线性回归的其他训练算法 以及 回归模型分类 的详细说明
以下是关于 梯度下降算法、线性回归模型、梯度下降训练线性回归、线性回归的其他训练算法 以及 回归模型分类 的详细说明: 1. 梯度下降算法详解 核心概念 梯度下降是一种 优化算法,用于寻找函数的最小值。其核心思想是沿着函数梯度的反方向逐步迭代&a…...
【数据结构和算法】4. 链表 LinkedList
本文根据 数据结构和算法入门 视频记录 文章目录 1. 链表的概念1.1 链表的类型1.2 链表的基本操作 2. 单向链表的实现2.1 插入2.2 删除2.3 查找2.4 更新 1. 链表的概念 我们知道数组是很常用的数据储存方式,而链表就是继数组之后,第二种最通用的数据储…...
基于S2B2C模式与定制开发开源AI智能名片的小程序商城系统研究
摘要:在新零售蓬勃发展的大背景下,S2B2C模式凭借其对消费场景的强力支撑以及柔性供应链的显著优势,成为推动零售行业变革的关键力量。本文深入剖析S2B2C模式,着重探讨定制开发开源AI智能名片S2B2C商城小程序源码的实践意义。通过分…...
【Python核心库实战指南】从数据处理到Web开发
目录 前言:技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块对比 二、实战演示环境配置要求核心代码实现(5个案例)案例1:NumPy数组运算案例2:Pandas数据分析…...
【错误记录】Windows 命令行程序循环暂停问题分析 ( 设置 “ 命令记录 “ 选项 | 启用 “ 丢弃旧的副本 “ 选项 | 将日志重定向到文件 )
文章目录 一、报错信息二、问题分析1、Windows 命令行的缓冲区机制2、命令记录设置 三、解决方案1、设置 " 命令记录 " 选项2、将日志重定向到文件 一、报错信息 Java 程序中 , 设置 无限循环 , 每次循环 休眠 10 秒后 , 再执行程序逻辑 , 在命令行中打印日志信息 ; …...
【iOS】Blocks学习
Blocks学习 Blocks概要Blocks模式Blocks语法Blocks类型变量截获自动变量值__block说明符截获的自动变量 Blocks的实现Blocks的实质截获自动变量值__block说明符Block存储域_block变量存储域截获对象__block变量和对象 总结 Blocks概要 Blocks是C语言的扩充功能,简单…...
Spring MVC DispatcherServlet 的作用是什么? 它在整个请求处理流程中扮演了什么角色?为什么它是核心?
DispatcherServlet 是 Spring MVC 框架的绝对核心和灵魂。它扮演着前端控制器(Front Controller)的角色,是所有进入 Spring MVC 应用程序的 HTTP 请求的统一入口点和中央调度枢纽。 一、 DispatcherServlet 的核心作用和职责: 请…...
QT 5.15 程序打包
说明: windeployqt 是 Qt 提供的一个工具,用于自动收集并复制运行 Qt 应用程序所需的动态链接库(.dll 文件)及其他资源(如插件、QML 模块等)到可执行文件所在的目录。这样你就可以将应用程序和这些依赖项一…...
PyCharm 初级教程:从安装到第一个 Python 项目
作为 Python 程序员,无论是刚入门还是工作多年,PyCharm 都是一个绕不开的开发工具。它是 JetBrains 出品的一款强大的 Python IDE,有自动补全、调试、虚拟环境支持、代码检查等等功能,体验比命令行 记事本舒服一百倍。 今天这篇…...
【Linux】进程替换与自定义 Shell:原理与实战
目录 一、进程程序替换 1、替换原理 2、替换函数 (1)函数解释 ① filename / pathname ② 参数表传递 ③ 环境变量表传递 (2)命名理解 二、自定义shell命令行解释器 1、实现原理 2、实现代码 (1)获…...
【AI提示词】数据分析专家
提示说明 数据分析师专家致力于通过深入分析和解读数据,帮助用户发现数据背后的模式和趋势。他们通常在商业智能、市场研究、社会科学等领域发挥重要作用,为决策提供数据支持。 提示词 # 角色 数据分析师专家## 注意 1. 数据分析师专家需要具备高度的…...
Lucky配置反向代理+Https安全访问AxureCloud服务(解决证书续签问题)
前言 之前用AxureCloud配置了SSL证书,发现ssl证书3个月就过期了,还需要手动续证书,更改配置文件,重启服务才能正常使用,太过于麻烦。也暴露了过多不安全的端口在公网,操作过于麻烦。另外暴露了过多不安全的…...
vscode使用remote ssh插件连接服务器的问题
本人今天发现自己的vscode使用remote ssh连接不上服务器了,表现是:始终在初始化 解决方法: 参考链接:vscode remote-ssh 连接失败的基本原理和优雅的解决方案 原因 vscode 的 SSH 之所以能够拥有比传统 SSH 更加强大的功能&a…...
WWW和WWWForm类
WWW类 WWW类是什么 //WWW是Unity提供的简单的访问网页的类 //我们可以通过该类上传和下载一些资源 //在使用http是,默认的请求类型是get,如果想要用post上传需要配合WWWFrom类使用 //它主要支持的协议: //…...
利用课程编辑器创新教学,提升竞争力
(一)快速创建优质教学内容 对于教育机构来说,教学内容的质量是吸引学员的关键因素之一。而课程编辑器就像是一位得力的助手,帮助教师快速创建出优质的教学内容。课程编辑器通常具有简洁易用的界面,教师即使没有专业的…...
spark与hadoop的区别
一.概述 二.处理速度 三.编程模型 四:实时性处理 五.spark内置模块 六.spark的运行模式...
【项目日记(三)】
目录 SERVER服务器模块实现: 1、Buffer模块:缓冲区模块 2、套接字Socket类实现: 3、事件管理Channel类实现: 4、 描述符事件监控Poller类实现: 5、定时任务管理TimerWheel类实现: eventfd 6、Reac…...
【图片转PDF工具】如何批量将文件夹里的图片以文件夹为单位批量合并PDF文档,基于WPF实现步骤及总结
应用场景 在实际工作和生活中,我们可能会遇到需要将一个文件夹内的多张图片合并成一个 PDF 文档的情况。例如,设计师可能会将一个项目的所有设计稿图片整理在一个文件夹中,然后合并成一个 PDF 方便交付给客户;摄影师可能会将一次拍摄的所有照片按拍摄主题存放在不同文件夹…...
深度解析算法之位运算
33.常见位运算 1.基础位运算 << 左移操作符 > >右移操作符号 ~取反 &按位与:有0就是0 |按位或:有1就是1 ^按位异或:相同为0,不用的话就是1 /无进位相加 0 1 0 0 1 1 0 1 0 按位与结果 0 1 1 按位或结果 0 0 1 …...
深入探索Qt异步编程--从信号槽到Future
概述 在现代软件开发中,应用程序的响应速度和用户体验是至关重要的。尤其是在图形用户界面(GUI)应用中,长时间运行的任务如果直接在主线程执行会导致界面冻结,严重影响用户体验。 Qt提供了一系列工具和技术来帮助开发者实现异步编程,从而避免这些问题。本文将深入探讨Qt…...
【KWDB 创作者计划】_本地化部署与使用KWDB 深度实践
引言 KWDB 是一款面向 AIoT 场景的分布式多模数据库,由开放原子开源基金会孵化及运营。它能在同一实例同时建立时序库和关系库,融合处理多模数据,具备强大的数据处理能力,可实现千万级设备接入、百万级数据秒级写入、亿级数据秒级…...
基于XC7V690T的在轨抗单粒子翻转系统设计
本文介绍一种基于XC7V690T 的在轨抗单粒子翻转系统架构;其硬件架构主要由XC7V690TSRAM 型FPGA芯片、AX500反熔丝型FPGA 芯片以及多片FLASH 组成;软件架构主要包括AX500反熔丝型FPGA对XC7V690T进行配置管理及监控管理,对XC7V690T进行在轨重构管理,XC7V690T通过调用内部SEMIP核实…...
机器学习 Day13 Boosting集成学习方法: Adaboosting和GBDT
大多数优化算法可以分解为三个主要部分: 模型函数:如何组合特征进行预测(如线性加法) 损失函数:衡量预测与真实值的差距(如交叉熵、平方损失) 优化方法:如何最小化损失函数&#x…...
Floyd算法求解最短路径问题——从零开始的图论讲解(3)
目录 前言 Djikstra算法的缺陷 为什么无法解决负权图 模拟流程 什么是Floyd算法 Floyd算法的核心思想 状态表示 状态转移方程 边界设置 代码实现 逻辑解释 举例说明 Floyd算法的特点 结尾 前言 这是笔者图论系列的第三篇博客 第一篇: 图的概念,图的存储,图的…...
spark和hadoop的区别与联系
区别 1. 数据处理模型 Hadoop:主要依赖 MapReduce 模型,计算分 Map(映射)和 Reduce(归约)两个阶段,中间结果常需写入磁盘,磁盘 I/O 操作频繁,数据处理速度相对受限&#…...
XMLXXE 安全无回显方案OOB 盲注DTD 外部实体黑白盒挖掘
# 详细点: XML 被设计为传输和存储数据, XML 文档结构包括 XML 声明、 DTD 文档类型定义(可 选)、文档元素,其焦点是数据的内容,其把数据从 HTML 分离,是独立于软件和硬件的 信息传输…...
C# .NET如何自动实现依赖注入(DI)
为解决重复性的工作,自动实现依赖注入(DI) 示例代码如下 namespace DialysisSOPSystem.Infrastructure {public static class ServiceCollectionExtensions{/// <summary>/// 批量注入服务/// </summary>/// <param name&qu…...
FastGPT Docker Compose本地部署与硅基流动免费AI接口集成指南
本文参考:https://doc.tryfastgpt.ai/docs/development/ 一、背景与技术优势 FastGPT是基于LLM的知识库问答系统,支持自定义数据训练与多模型接入。硅基流动(SiliconFlow)作为AI基础设施平台,提供高性能大模型推理引…...
AI对话高效输入指令攻略(三):使用大忌——“AI味”
免责声明: 1.本文所提供的所有 AI 使用示例及提示词,仅用于学术写作技巧交流与 AI 功能探索测试,无任何唆使或鼓励利用 AI 抄袭作业、学术造假的意图。 2.文章中提及的内容旨在帮助读者提升与 AI 交互的能力,合理运用 AI 辅助学…...
算法 | 成长优化算法(Growth Optimizer,GO)原理,公式,应用,算法改进研究综述,matlab代码
===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 成长优化算法 一、算法原理二、核心公式三、应用领域四、算法改进研究五…...
生产环境问题排查:日志分析与性能瓶颈定位(一)
引言 在当今数字化时代,各类应用系统如潮水般涌现,支撑着我们生活和工作的方方面面。从日常使用的电商平台、社交网络,到企业内部复杂的业务系统,它们的稳定运行和高效性能至关重要。而在生产环境中,日志分析与性能瓶…...
go语言的八股文
1.go语言触发异常的场景有哪些 运行时错误 1.空指针解引用:尝试访问一个未初始化的指针指向的内存,会导致程序崩溃并触发异常。 2.数组越界访问:试图访问数组中不存在的索引,比如数组长度为5,却尝试访问索引为10的元素…...
Office文件内容提取 | 获取Word文件内容 |Javascript提取PDF文字内容 |PPT文档文字内容提取
关于Office系列文件文字内容的提取 本文主要通过接口的方式获取Office文件和PDF、OFD文件的文字内容。适用于需要获取Word、OFD、PDF、PPT等文件内容的提取实现。例如在线文字统计以及论文文字内容的提取。 一、提取Word及WPS文档的文字内容。 支持以下文件格式: …...
组态软件工业化自动领域的可视化配置利器
组态软件是工业自动化领域的可视化配置利器,在工业生产中发挥着至关重要的作用,以下从定义、特点、功能、应用场景、市场现状及发展趋势等方面进行详细介绍: 定义 组态软件,又称组态监控系统软件,是用于数据采集和过程…...
Ansys electronics安装多版本simulink打开s-function冲突解决方法
安装了Ansys Electronics 2022 R1和2024 R1,想通过simplorer和simulink中的S-function进行联合仿真,结果注册表一直是2024 R1,修改方法如下: 1. WINR打开cmd,注意要用管理员权限打开 2. 输入 "D:\ANSYS\AnsysE…...
ubuntu--安装双系统
教程 BIOS设置 启动盘生成和ubuntu安装 boot option #1设置USB为第一启动项 rufus下载 官网: 链接 点击“链接”下面的按钮,即可下载。(注意查看自己的电脑是x64还是x84) 网盘下载: 链接...
快速搭建 Cpolar 内网穿透(Mac 系统)
1、Cpolar快速入门教程(官方) 链接地址:Cpolar 快速入门 2、官方教程详解 本地安装homebrew /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"这个是从 git 上拉取的&#x…...
【pytorch】torch.nn.Unfold操作
说明 一个代码里涉及到了unfold的操作,看了半天官网都没整明白维度怎么变化的,参考这个链接搞明白了: https://blog.csdn.net/ViatorSun/article/details/119940759 https://zhuanlan.zhihu.com/p/361140988 维度计算 输入( N,…...
使用PyTorch实现图像增广与模型训练实战
本文通过完整代码示例演示如何利用PyTorch和torchvision实现常用图像增广方法,并在CIFAR-10数据集上训练ResNet-18模型。我们将从基础图像变换到复杂数据增强策略逐步讲解,最终实现一个完整的训练流程。 一、图像增广基础操作 1.1 准备工作 #matplotli…...
PyTorch实现糖尿病预测的CNN模型:从数据加载到模型部署全解析【N折交叉验证、文末免费下载】
本文将详细介绍如何使用PyTorch框架构建一个卷积神经网络(CNN)来预测糖尿病,包含完整的代码实现、技术细节和可视化分析。 1. 项目概述 本项目使用经典的Pima Indians Diabetes数据集,通过5折交叉验证训练一个1D CNN模型,最终实现糖尿病预测…...
红队专题-漏洞挖掘-代码审计-反序列化
漏洞挖掘-代码审计-反序列化 加固/防御命令执行相关日志Tools-JNDIExploitJNDI Java Naming and Directory Interface Java命名目录接口注入原理payload参数渗透测试-php命令执行-RCE+Struts2拿webshell普通权限 命令执行 拿 webshellCMD echo 写入一句话 php文件菜刀连接Strut…...