IT评测·应用市场-qidao123.com技术社区

标题: PyTorch与TensorFlow模子全方位解析:保存、加载与结构可视化 [打印本页]

作者: 王柳    时间: 5 天前
标题: PyTorch与TensorFlow模子全方位解析:保存、加载与结构可视化
目次



前言

书接上文
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"的文件中。但是要注意,保存整个模子大概会占用更多的磁盘空间,并且不如保存状态字典机动,由于状态字典可以与不同的模子结构兼容。
  1. import torch
  2. import numpy as np
  3. # 1. 数据准备
  4. # 定义原始数据,包含x和y值
  5. data = [[-0.5, 7.7], [1.8, 98.5], [0.9, 57.8],
  6.         [0.4, 39.2], [-1.4, -15.7],
  7.         [-1.4, -37.3], [-1.8, -49.1],
  8.         [1.5, 75.6], [0.4, 34.0],
  9.         [0.8, 62.3]]
  10. # 将数据转换为NumPy数组,方便后续处理
  11. data = np.array(data)
  12. # 从NumPy数组中提取x和y数据
  13. x_data = data[:, 0]  # 所有行的第0列,即x值
  14. y_data = data[:, 1]  # 所有行的第1列,即y值
  15. # 2. 数据转换为Tensor
  16. # 将NumPy数组转换为PyTorch张量,这是使用PyTorch进行计算的基础
  17. x_train = torch.tensor(x_data, dtype=torch.float32)  # 将x数据转换为float32类型的张量
  18. y_train = torch.tensor(y_data, dtype=torch.float32)  # 将y数据转换为float32类型的张量
  19. # 3. 使用DataLoader加载数据
  20. # 导入DataLoader和TensorDataset
  21. from torch.utils.data import DataLoader, TensorDataset
  22. # 将x_train和y_train组合成一个数据集
  23. dataset = TensorDataset(x_train, y_train)  # 创建一个TensorDataset,将x和y数据配对
  24. # 使用DataLoader创建数据加载器,用于批量处理数据
  25. dataloader = DataLoader(dataset, batch_size=2, shuffle=False)  # batch_size=2表示每次加载2个样本,shuffle=False表示不打乱数据顺序
  26. # 4. 定义模型
  27. import torch.nn as nn  # 导入torch.nn模块,通常简写为nn,包含神经网络相关的类和函数
  28. # 定义线性回归模型
  29. class LinearModel(nn.Module):  # 继承nn.Module,这是所有神经网络模块的基类
  30.     # 构造函数,用于初始化模型
  31.     def __init__(self):
  32.         super(LinearModel, self).__init__()  # 调用父类的构造函数
  33.         # 定义一个线性层,输入维度为1,输出维度为1
  34.         self.layers = nn.Linear(1, 1)  # 创建一个线性层,用于学习线性关系
  35.     # 前向传播函数,定义模型的计算过程
  36.     def forward(self, x):
  37.         # 将输入x通过线性层
  38.         x = self.layers(x)  # 将输入数据通过线性层进行计算
  39.         return x  # 返回计算结果
  40. # 5. 初始化模型
  41. # 创建模型实例
  42. model = LinearModel()  # 实例化线性回归模型
  43. # 6. 定义损失函数
  44. # 使用均方误差作为损失函数
  45. criterion = nn.MSELoss()  # 创建MSELoss实例,用于计算损失
  46. # 7. 定义优化器
  47. # 使用随机梯度下降算法作为优化器
  48. optimizer = torch.optim.SGD(model.parameters(), lr=0.01)  # 创建SGD优化器,用于更新模型参数, lr是学习率
  49. # 8. 训练模型
  50. # 设置迭代次数
  51. epoches = 500  # 设置迭代次数
  52. # 循环迭代训练模型
  53. for n in range(1, epoches + 1):  # 迭代epoches次
  54.     epoch_loss = 0  # 初始化epoch损失
  55.     # 遍历dataloader,获取每个batch的数据
  56.     for batch_x, batch_y in dataloader:  # 遍历dataloader,每次返回一个batch的x和y数据
  57.         # 增加x_batch的维度,以匹配线性层的输入维度
  58.         x_batch_add_dim = batch_x.unsqueeze(1)  # 在第1维增加一个维度,将x_batch从[batch_size]变为[batch_size, 1]
  59.         # 使用模型进行预测
  60.         y_pre = model(x_batch_add_dim)  # 将x_batch输入模型,得到预测值
  61.         # 计算损失
  62.         batch_loss = criterion(y_pre.squeeze(1), batch_y)  # 计算预测值和真实值之间的均方误差, squeeze(1) 移除维度为1的维度
  63.         # 梯度更新
  64.         optimizer.zero_grad()  # 清空优化器中的梯度,避免累积
  65.         # 计算损失函数对模型参数的梯度
  66.         batch_loss.backward()  # 反向传播,计算梯度
  67.         # 根据优化算法更新参数
  68.         optimizer.step()  # 使用优化器更新模型参数
  69.         epoch_loss = epoch_loss + batch_loss  # 累加每个batch的损失
  70.     avg_loss = epoch_loss / (len(dataloader))  # 计算平均损失
  71.     # 打印训练信息
  72.     if n % 100 == 0 or n == 1:  # 每100次迭代打印一次信息
  73.         print(model)  # 打印模型结构
  74.         torch.save(model, f'model_{n}.pth')  #保存模型
  75.         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和参数结合起来
  1. import torch.nn as nn
  2. import torch
  3. import numpy as np
  4. # 示例数据
  5. 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],
  6.         [0.4, 34.0], [0.8, 62.3]]
  7. data = np.array(data)
  8. x_data = data[:, 0]  # 获取 x 数据
  9. y_data = data[:, 1]  # 获取 y 数据
  10. x_train = torch.tensor(x_data, dtype=torch.float32)  # 将 x 数据转换为 PyTorch 张量
  11. y_train = torch.tensor(y_data, dtype=torch.float32)  # 将 y 数据转换为 PyTorch 张量
  12. from torch.utils.data import DataLoader, TensorDataset
  13. dataset = TensorDataset(x_train, y_train)  # 创建 TensorDataset
  14. dataloader = DataLoader(dataset, batch_size=2, shuffle=False)  # 创建 DataLoader
  15. import torch.nn as nn
  16. class LinearModel(nn.Module):
  17.     """
  18.     线性模型类
  19.     """
  20.     def __init__(self):
  21.         """
  22.         初始化线性模型
  23.         """
  24.         super(
  25.                 LinearModel,
  26.                 self,
  27.                 ).__init__()
  28.         # 定义一个线性层
  29.         self.layers = nn.Linear(1, 1)
  30.     def forward(
  31.             self,
  32.             x
  33.             ):
  34.         """
  35.         前向传播函数
  36.         :param x: 输入张量
  37.         :return: 输出张量
  38.         """
  39.         x = self.layers(x)  # 通过线性层
  40.         return x
  41. model = LinearModel()  # 实例化线性模型
  42. model.load_state_dict(torch.load("model_1.pth"))  # 加载模型参数
  43. model.eval()  # 设置为评估模式
  44. x_test = torch.tensor([[-0.5]], dtype=torch.float32)  # 创建测试数据
  45. with torch.no_grad():  # 禁用梯度计算
  46.     y_pre = model(x_test)  # 进行预测
  47. print(y_pre)  # 打印预测结果
复制代码

2.2 保存结构和参数的模子加载

加载模子必要2步骤:
步骤1:必要模子结构
步骤2:使用torch.load("entire_model.pth")加载模子
  1. import torch
  2. import numpy as np
  3. # 准备数据:输入特征和对应的目标值
  4. 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],
  5.         [0.4, 34.0], [0.8, 62.3]]
  6. data = np.array(data)
  7. # 提取输入特征 (x) 和目标值 (y)
  8. x_data = data[:, 0]
  9. y_data = data[:, 1]
  10. # 将数据转换为 PyTorch 张量,并指定数据类型为 float32
  11. x_train = torch.tensor(x_data, dtype=torch.float32)
  12. y_train = torch.tensor(y_data, dtype=torch.float32)
  13. # 导入 DataLoader 和 TensorDataset
  14. from torch.utils.data import DataLoader, TensorDataset
  15. # 创建 TensorDataset,将 x_train 和 y_train 组合成数据集
  16. dataset = TensorDataset(x_train, y_train)
  17. # 创建 DataLoader,用于批量加载数据
  18. dataloader = DataLoader(dataset, batch_size=2, shuffle=False)
  19. import torch.nn as nn
  20. # 定义线性模型类
  21. class LinearModel(nn.Module):
  22.     def __init__(self):
  23.         super(
  24.                 LinearModel,
  25.                 self,
  26.                 ).__init__()
  27.         # 定义一个线性层,输入维度为 1,输出维度为 1
  28.         self.layers = nn.Linear(1, 1)
  29.     def forward(
  30.             self,
  31.             x
  32.             ):
  33.         # 定义前向传播过程
  34.         x = self.layers(x)
  35.         return x
  36. # 加载预训练的模型
  37. model = torch.load("model_1.pth")
  38. # 将模型设置为评估模式,禁用 dropout 等
  39. model.eval()
  40. # 创建一个测试数据
  41. x_test = torch.tensor([[-0.5]], dtype=torch.float32)
  42. # 在无梯度计算的环境下进行预测
  43. with torch.no_grad():
  44.     # 使用加载的模型进行预测
  45.     y_pre = model(x_test)
  46. # 打印预测结果
  47. print(y_pre)
复制代码

三、pytorch模子网络结构的查看

3.1 print

print(model) 能打印出网络结构,不能检测模子搭建是否精确
print(model) 仅打印模子结构。
  1. import torch.nn as nn  # 导入神经网络模块
  2. import torch  # 导入 torch
  3. import numpy as np  # 导入 numpy
  4. # 定义数据集,包含输入和输出
  5. 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],
  6.         [0.4, 34.0], [0.8, 62.3]]
  7. data = np.array(data)  # 将数据转换为 numpy 数组
  8. x_data = data[:, 0]  # 获取输入数据
  9. y_data = data[:, 1]  # 获取输出数据
  10. x_train = torch.tensor(x_data, dtype=torch.float32)  # 将输入数据转换为 tensor
  11. y_train = torch.tensor(y_data, dtype=torch.float32)  # 将输出数据转换为 tensor
  12. from torch.utils.data import DataLoader, TensorDataset  # 导入 DataLoader 和 TensorDataset
  13. dataset = TensorDataset(x_train, y_train)  # 将输入和输出数据组合成 dataset
  14. dataloader = DataLoader(dataset, batch_size=2, shuffle=False)  # 创建 dataloader,用于批量加载数据
  15. import torch.nn as nn  # 导入神经网络模块
  16. # 定义线性模型
  17. class LinearModel(nn.Module):
  18.     def __init__(self):
  19.         super(
  20.                 LinearModel,
  21.                 self,
  22.                 ).__init__()  # 调用父类构造函数
  23.         self.layers = nn.Linear(1, 1)  # 定义一个线性层,输入维度为 1,输出维度为 1
  24.         self.layers1 = nn.Linear(2, 2)  # 定义一个线性层,输入维度为 2,输出维度为 2
  25.     def forward(
  26.             self,
  27.             x
  28.             ):  # 定义前向传播函数
  29.         x = self.layers(x)  # 通过第一个线性层
  30.         x = self.layers1(x)  # 通过第二个线性层
  31.         return x  # 返回输出
  32. model = LinearModel()  # 实例化模型
  33. print(model)  # 打印模型结构
复制代码

3.2 summary

先安装 pip install torchsummary
torchsummary 主要用于查看模子结构 并且检测网络是否搭建精确,不精确就报错
  1. import torch.nn as nn  # 导入神经网络模块
  2. import torch  # 导入torch
  3. import numpy as np  # 导入numpy
  4. # 准备数据
  5. 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],
  6.         [0.4, 34.0], [0.8, 62.3]]
  7. data = np.array(data)  # 转换为numpy数组
  8. x_data = data[:, 0]  # 获取x数据
  9. y_data = data[:, 1]  # 获取y数据
  10. x_train = torch.tensor(x_data, dtype=torch.float32)  # 转换为torch张量
  11. y_train = torch.tensor(y_data, dtype=torch.float32)  # 转换为torch张量
  12. from torch.utils.data import DataLoader, TensorDataset  # 导入DataLoader和TensorDataset
  13. dataset = TensorDataset(x_train, y_train)  # 创建数据集
  14. dataloader = DataLoader(dataset, batch_size=2, shuffle=False)  # 创建数据加载器
  15. import torch.nn as nn  # 导入神经网络模块
  16. # 定义线性模型
  17. class LinearModel(nn.Module):
  18.     def __init__(self):
  19.         super(
  20.                 LinearModel,
  21.                 self,
  22.                 ).__init__()  # 调用父类初始化方法
  23.         self.layers = nn.Linear(1, 2)  # 定义线性层1,输入维度1,输出维度2
  24.         self.layers1 = nn.Linear(2, 5)  # 定义线性层2,输入维度2,输出维度5
  25.     def forward(
  26.             self,
  27.             x
  28.             ):  # 定义前向传播函数
  29.         x = self.layers(x)  # 通过线性层1
  30.         x = self.layers1(x)  # 通过线性层2
  31.         return x  # 返回输出
  32. model = LinearModel()  # 实例化模型
  33. from torchsummary import summary  # 导入summary
  34. summary(
  35.         model,
  36.         input_size=(1,),  # 输入尺寸
  37.         device="cpu"  # 设备
  38.         )
复制代码

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打开有连线了
  1. import torch.nn as nn  # 导入神经网络模块
  2. import torch  # 导入torch
  3. import numpy as np  # 导入numpy
  4. # 准备数据
  5. 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],
  6.         [0.4, 34.0], [0.8, 62.3]]
  7. data = np.array(data)  # 转换为numpy数组
  8. x_data = data[:, 0]  # 获取x数据
  9. y_data = data[:, 1]  # 获取y数据
  10. x_train = torch.tensor(x_data, dtype=torch.float32)  # 转换为torch张量
  11. y_train = torch.tensor(y_data, dtype=torch.float32)  # 转换为torch张量
  12. print(x_train)  # 打印x_train
  13. import torch.nn as nn  # 再次导入神经网络模块
  14. criterion = nn.MSELoss()  # 定义均方误差损失函数
  15. # 定义线性模型
  16. class LinearModel(nn.Module):
  17.     def __init__(self):
  18.         super(
  19.                 LinearModel,
  20.                 self,
  21.                 ).__init__()  # 调用父类初始化方法
  22.         self.layers = nn.Linear(1, 1)  # 定义线性层1,输入维度1,输出维度1
  23.         self.layers1 = nn.Linear(1, 2)  # 定义线性层2,输入维度1,输出维度2
  24.     def forward(
  25.             self,
  26.             x
  27.             ):  # 定义前向传播函数
  28.         x = self.layers(x)  # 通过线性层1
  29.         x = self.layers1(x)  # 通过线性层2
  30.         return x  # 返回输出
  31. model = LinearModel()  # 实例化模型
  32. script_model = torch.jit.script(model)  # 将模型转换为 TorchScript
  33. 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
  1. import torch.nn as nn  # 导入神经网络模块
  2. import torch  # 导入torch
  3. import numpy as np  # 导入numpy
  4. # 准备数据,这里是一些二维数据点
  5. 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],
  6.         [0.4, 34.0], [0.8, 62.3]]
  7. data = np.array(data)  # 将数据转换为numpy数组,方便后续处理
  8. x_data = data[:, 0]  # 从数据中提取x坐标
  9. y_data = data[:, 1]  # 从数据中提取y坐标
  10. x_train = torch.tensor(x_data, dtype=torch.float32)  # 将x坐标转换为torch张量,并指定数据类型为float32
  11. y_train = torch.tensor(y_data, dtype=torch.float32)  # 将y坐标转换为torch张量,并指定数据类型为float32
  12. print(x_train)  # 打印x_train,用于调试
  13. import torch.nn as nn  # 再次导入神经网络模块,虽然已经导入过,但为了代码完整性保留
  14. criterion = nn.MSELoss()  # 定义均方误差损失函数,用于衡量模型预测值和真实值之间的差距
  15. # 定义一个线性模型类,继承自nn.Module
  16. class LinearModel(nn.Module):
  17.     def __init__(self):
  18.         # 调用父类的初始化方法
  19.         super(
  20.                 LinearModel,
  21.                 self,
  22.                 ).__init__()
  23.         # 定义一个线性层,输入维度为1,输出维度为1
  24.         self.layers = nn.Linear(1, 1)
  25.         # 定义一个线性层,输入维度为1,输出维度为2
  26.         self.layers1 = nn.Linear(1, 2)
  27.         # 定义一个线性层,输入维度为2,输出维度为2
  28.         self.layers2 = nn.Linear(2, 2)
  29.     def forward(
  30.             self,
  31.             x
  32.             ):
  33.         # 定义模型的前向传播过程
  34.         x = self.layers(x)  # 将输入x通过第一个线性层
  35.         x = self.layers1(x)  # 将第一个线性层的输出通过第二个线性层
  36.         x = self.layers2(x)  # 将第二个线性层的输出通过第三个线性层
  37.         return x  # 返回模型的输出
  38. model = LinearModel()  # 实例化线性模型
  39. torch.onnx.export(
  40.         model,  # 要导出的模型
  41.         torch.rand(1, 1),  # 模型的输入,这里使用一个随机张量
  42.         "model1.onnx"  # 导出的onnx模型的文件名
  43.         )
复制代码

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/ 查看了
  1. import torch  # 导入torch
  2. import numpy as np  # 导入numpy
  3. 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],
  4.         [0.4, 34.0], [0.8, 62.3]]  # 定义数据集
  5. data = np.array(data)  # 将数据转换为numpy数组
  6. x_data = data[:, 0]  # 获取x坐标数据
  7. y_data = data[:, 1]  # 获取y坐标数据
  8. x_train = torch.tensor(x_data, dtype=torch.float32)  # 将x数据转换为torch张量,指定数据类型
  9. y_train = torch.tensor(y_data, dtype=torch.float32)  # 将y数据转换为torch张量,指定数据类型
  10. print(x_train)  # 打印x_train,用于调试
  11. import torch.nn as nn  # 再次导入神经网络模块,避免潜在的未定义错误
  12. criterion = nn.MSELoss()  # 定义均方误差损失函数
  13. class LinearModel(nn.Module):  # 定义线性模型
  14.     def __init__(self):  # 定义初始化方法
  15.         super(
  16.                 LinearModel,
  17.                 self,
  18.                 ).__init__()  # 调用父类初始化方法
  19.         self.layers = nn.Linear(1, 1)  # 定义线性层,输入维度为1,输出维度为1
  20.     def forward(
  21.             self,
  22.             x
  23.             ):  # 定义前向传播函数
  24.         x = self.layers(x)  # 将输入x通过线性层
  25.         return x  # 返回输出
  26. model = LinearModel()  # 实例化线性模型
  27. from tensorboardX import SummaryWriter  # 导入SummaryWriter,用于TensorBoard可视化
  28. writer = SummaryWriter(logdir="logs")  # 创建SummaryWriter实例,指定日志存储路径
  29. optimizer = torch.optim.SGD(model.parameters(), lr=0.01)  # 定义优化器,使用随机梯度下降算法
  30. epoches = 500  # 定义训练轮数
  31. for n in range(1, epoches + 1):  # 循环训练
  32.     y_prd = model(x_train.unsqueeze(1))  # 模型预测,unsqueeze(1)将x_train的维度从(N,)变为(N,1)
  33.     loss = criterion(y_prd.squeeze(1), y_train)  # 计算损失,squeeze(1)将y_prd的维度从(N,1)变为(N,)
  34.     optimizer.zero_grad()  # 梯度清零
  35.     loss.backward()  # 反向传播,计算梯度
  36.     optimizer.step()  # 更新模型参数
  37.     writer.add_scalar("loss", loss, n)  # 将损失值写入TensorBoard
  38.     writer.add_scalar("learing_rate", optimizer.param_groups[0]["lr"], n)  # 将学习率写入TensorBoard
  39.     if n % 10 == 0 or n == 1:  # 每10轮打印一次损失值
  40.         print(f"epoches:{n},loss:{loss}")  # 打印轮数和损失值
  41. writer.add_graph(model, torch.rand(1, 1))  # 将模型结构写入TensorBoard
  42. 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_model
https://www.tensorflow.org/guide/keras/sequential_model
下面这个网址也可以使用
Module: tf  |  TensorFlow v2.16.1## TensorFlow
https://tensorflow.google.cn/api_docs/python/tf

4.1 tensorflow模子的定义

什么是tf.keras?
tf.keras的功能是实现tensorflow模子搭建、模子训练和模子预测

4.1.1 tf.keras.Sequential

  1. import tensorflow as tf
  2. model=tf.keras.Sequential([tf.keras.layers.Dense(1,#输出特征的维度
  3. input_shape=(1,)#输入的特征维度
  4. )] #使用序列层需要在列表中添加线性层
  5. )
复制代码

4.1.2 tf.keras.Sequential()另一种方式 

  1. import tensorflow as tf
  2. #方案2的第1种方法
  3. model=tf.keras.Sequential() #申请一个序列的对象
  4. model.add(tf.keras.Input(shape=(1,)))
  5. model.add(tf.keras.layers.Dense(1))
  6. #方案2的第2种方法
  7. model=tf.keras.Sequential()
  8. model.add(tf.keras.layers.Dense(1,input_shape=(1,)))
复制代码

4.1.3 就是写一个类重写实现网络的搭建

  1. import tensorflow as tf
  2. from tensorflow.keras import Model
  3. class Linear(Model):
  4.     #初始化
  5.     def __init__(self):
  6.         super(Linear,self).__init__()
  7.         #定义网络层
  8.         self.linear=tf.keras.layers.Dense(1)
  9.     #和pytroch有点不同,pytorch使用forward 这里使用call函数调用
  10.     def call(self,x,**kwargs):
  11.         x=self.linear(x)
  12.         return x
  13. model=Linear()
复制代码

4.1.4 tensorflow中最常用的

  1. import tensorflow as tf
  2. #直接写个函数
  3. def linear():
  4.     #input 表示输入的特征维度信息,且要指定数据类型
  5.     input=tf.keras.layers.Input(shape=(1,),dtype=tf.float32)
  6.     #下面层数搭建必须要把上一次的输入使用圆括号括起来
  7.     y=tf.keras.layers.Dense(1)(input)
  8.     #最后网络网络搭建以后必须使用tf.keras.models.Model进行封装,且输入参数(inputs)为输入的维度信息,输出参数(outputs)为最后一层网络输出
  9.     model=tf.keras.models.Model(inputs=input,outputs=y)
  10.     #返回模型
  11.     return model
  12. 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')
  1. import tensorflow as tf
  2. from  tensorflow.keras import Model
  3. #tensorflow最常用的搭建方式
  4. #直接写个函数
  5. def linear():
  6.     #input 表示输入的特征维度信息,且要指定数据类型
  7.     input=tf.keras.layers.Input(shape=(1,),dtype=tf.float32)
  8.     #下面层数搭建必须要把上一次的输入使用圆括号括起来
  9.     y=tf.keras.layers.Dense(1)(input)
  10.     #最后网络网络搭建以后必须使用tf.keras.models.Model进行封装,且输入参数(inputs)为输入的维度信息,输出参数(outputs)为最后一层网络输出
  11.     model=tf.keras.models.Model(inputs=input,outputs=y)
  12.     #返回模型
  13.     return model
  14. model=linear()
  15. model.save('./my_model.h5')
  16. #保存为参数方式
  17. model.save_weights('./model.weights.h5')
复制代码

4.3 tensorflow模子的加载

4.3.1 模子加载 针对方式1

  1. import tensorflow as tf
  2. from  tensorflow.keras import Model
  3. #针对第一个方案 所有的参数都保存了
  4. # 模型的加载方式 # 方式1: HDF5文件 后缀名 .h5
  5. #加载参数、模型结构、训练的配置等等
  6. #方式1:与pytorch区别,pytorch需要原来的模型结构,
  7. # 在tensorflow里面可以不给原来的模型结构
  8. load_model=tf.keras.models.load_model('my_model.h5')
  9. print(load_model)
复制代码

4.3.2 加载只保存参数,包括权重w及偏置b

  1. import tensorflow as tf
  2. def linear():
  3.     #input 表示输入的特征维度信息,且要指定数据类型
  4.     input=tf.keras.layers.Input(shape=(1,),dtype=tf.float32)
  5.     #下面层数搭建必须要把上一次的输入使用圆括号括起来
  6.     y=tf.keras.layers.Dense(1)(input)
  7.     #最后网络网络搭建以后必须使用tf.keras.models.Model进行封装,且输入参数(inputs)为输入的维度信息,输出参数(outputs)为最后一层网络输出
  8.     model=tf.keras.models.Model(inputs=input,outputs=y)
  9.     #返回模型
  10.     return model
  11. model=linear()
  12. model.load_weights('model.weights.h5')
  13. 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
结果图


模子训练好网络查看代码 
  1. #导入库
  2. import tensorflow as tf
  3. import numpy as np
  4. from tensorflow.keras import Model
  5. #设置随机化种子
  6. seed=1
  7. #设置随机数种子 确保每次的运行结果一致
  8. tf.random.set_seed(seed)
  9. # 1.散点输入 定义输入数据
  10. 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]]
  11. #转化为数组
  12. data=np.array(data)
  13. # 提取x 和y
  14. x_data=data[:,0]
  15. y_data=data[:,1]
  16. #转化为tensorflow用的张量 创建张量
  17. x_train=tf.constant(x_data,dtype=tf.float32)
  18. y_train=tf.constant(y_data,dtype=tf.float32)
  19. #可以将numpy数组或者tensorflow张量 把数据切成(x_train_i,y_train_i)
  20. dataset=tf.data.Dataset.from_tensor_slices((x_train,y_train))
  21. #shuffle是打乱,但是这个buffer_size是啥?
  22. # buffer_size规定了乱序缓冲区的大小,且要求缓冲区大小小于或等于数据集的完整大小;
  23. # 假设数据集的大小为10000,buffer_size为1000,最开始算法会把前1000个数据放入缓冲区;
  24. #当从缓冲区内的这1000个数据中随机选出一个元素后,这个元素的位置会被数据集的第1001个数据替换;然后再从
  25. #这1000个元素中随机选择第2个元素,第2个会被数据集中第1002个数据替换,以此类推,此外buffer_size不宜过大
  26. # ,过大会导致内存爆炸
  27. dataset=dataset.shuffle(buffer_size=10)
  28. #数据集的batch是2
  29. dataset=dataset.batch(2)
  30. #预取训练的方式,CPU取数据,GPU tpu会取出来一批数据,在cpu上没效果 效果会改善延迟和吞吐量
  31. dataset=dataset.prefetch(buffer_size=tf.data.experimental.AUTOTUNE)
  32. # 方案4
  33. def linear():
  34.     input=tf.keras.layers.Input(shape=(1,),dtype=tf.float32)
  35.     y=tf.keras.layers.Dense(1)(input)
  36.     model=tf.keras.models.Model(inputs=input,outputs=y)
  37.     return model
  38. model=linear()
  39. # #3.定义损失函数和优化器
  40. optimizer=tf.keras.optimizers.SGD(learning_rate=0.01)
  41. #模型配置
  42. model.compile(optimizer=optimizer,#配置优化器
  43.               loss="mean_squared_error"#配置使用什么损失函数
  44.               )
  45. #查看网络结构
  46. #方法1:summary()
  47. #结构中None是batch
  48. print(model.summary())
  49. #方法2 使用netron
  50. # netron pycharm 终端下输入  pip install netron
  51. # 下载好后,在终端下输入 netron,
  52. # 在浏览器上输入 http://localhost:8080 即可
  53. # 打开一个模型后刷新就可以打开另一个模型
  54. #方法 3 最经典的 tensorboard 方法
  55. epochs=500
  56. #在计算图中添加模型
  57. tensorboard_callback=tf.keras.callbacks.TensorBoard(log_dir='./logs')
  58. #callbacks需要一个列表
  59. #模型训练
  60. model.fit(x_train,#输入数据
  61.           y_train,#输入标签数据
  62.           epochs=epochs,#迭代的次数
  63.           callbacks=[tensorboard_callback]#图形展示可有可无
  64.           )
  65. #保存模型
  66. model.save_weights("model.weights.h5")
  67. #预测模型
  68. input_data=np.array([[-0.5]])
  69. pre=model.predict(input_data)
  70. #从数组中提取出结果值
  71. 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等工具进行模子结构可视化的具体步骤。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4