当前位置: 首页 > news >正文

PyTorch 与 TensorFlow 中基于自定义层的 DNN 实现对比

深度学习双雄对决:PyTorch vs TensorFlow 自定义层大比拼



一、TensorFlow 实现 DNN

1. 核心逻辑

  • 直接继承 tf.keras.layers.Layer:无需中间类,直接在 build 中定义多层结构。
  • 动态参数管理:通过 add_weight 注册每一层的权重和偏置。
import tensorflow as tfclass CustomDNNLayer(tf.keras.layers.Layer):def __init__(self, hidden_units, output_dim, **kwargs):super(CustomDNNLayer, self).__init__(**kwargs)self.hidden_units = hidden_unitsself.output_dim = output_dimdef build(self, input_shape):# 输入层到第一个隐藏层self.w1 = self.add_weight(name='w1', shape=(input_shape[-1], self.hidden_units[0]),initializer='random_normal',trainable=True)self.b1 = self.add_weight(name='b1',shape=(self.hidden_units[0],),initializer='zeros',trainable=True)# 隐藏层之间self.ws = []self.bs = []for i in range(len(self.hidden_units) - 1):self.ws.append(self.add_weight(name=f'w{i+2}', shape=(self.hidden_units[i], self.hidden_units[i+1]),initializer='random_normal',trainable=True))self.bs.append(self.add_weight(name=f'b{i+2}',shape=(self.hidden_units[i+1],),initializer='zeros',trainable=True))# 输出层self.wo = self.add_weight(name='wo',shape=(self.hidden_units[-1], self.output_dim),initializer='random_normal',trainable=True)self.bo = self.add_weight(name='bo',shape=(self.output_dim,),initializer='zeros',trainable=True)def call(self, inputs):x = tf.matmul(inputs, self.w1) + self.b1x = tf.nn.relu(x)for i in range(len(self.hidden_units) - 1):x = tf.matmul(x, self.ws[i]) + self.bs[i]x = tf.nn.relu(x)x = tf.matmul(x, self.wo) + self.boreturn x

二、PyTorch 实现自定义层

1. 核心逻辑

  • 继承 nn.Module:自定义层本质是模块的组合。
  • 使用 nn.ModuleList:动态管理多个 nn.Linear 层。
import torch
import torch.nn as nnclass CustomPyTorchDNN(nn.Module):def __init__(self, input_size, hidden_sizes, output_size):super(CustomPyTorchDNN, self).__init__()self.hidden_layers = nn.ModuleList()prev_size = input_size# 动态添加隐藏层for hidden_size in hidden_sizes:self.hidden_layers.append(nn.Linear(prev_size, hidden_size))prev_size = hidden_size# 输出层self.output_layer = nn.Linear(prev_size, output_size)def forward(self, x):for layer in self.hidden_layers:x = torch.relu(layer(x))x = self.output_layer(x)return x

三、关键差异对比

维度TensorFlow 实现PyTorch 实现
类继承方式直接继承 tf.keras.layers.Layer,无中间类。继承 nn.Module,通过 nn.ModuleList 管理子模块。
参数管理build 中显式注册每层权重(add_weight)。自动注册所有 nn.Linear 参数(无需手动操作)。
前向传播定义通过 call 方法逐层计算,需手动处理每层的权重和激活函数。通过 forward 方法逐层调用 nn.Linear,激活函数手动插入。
灵活性更底层,适合完全自定义逻辑(如非线性变换、特殊参数初始化)。更简洁,适合快速构建标准网络结构。
训练流程需手动实现训练循环(反向传播 + 优化器)。需手动实现训练循环(与 TensorFlow 类似)。

四、总结

  • TensorFlow:通过直接继承 tf.keras.layers.Layer,可实现完全自定义的 DNN,但需手动管理多层权重和激活逻辑,适合对模型细节有严格控制需求的场景。
  • PyTorch:通过直接继承 nn.Module,可实现完全自定义的 DNN;利用 nn.ModuleListnn.Linear 的组合,能高效构建标准 DNN 结构,代码简洁且易于扩展,适合快速原型开发和研究场景。

两种实现均满足用户对“直接继承核心类 + 使用基础组件”的要求,可根据具体任务选择框架。

相关文章:

  • 基于Piecewise Jerk Speed Optimizer的速度规划算法(附ROS C++/Python仿真)
  • 免费视频压缩软件
  • 应用服务器Tomcat
  • 【优选算法 | 模拟】探索模拟算法: 编程与问题分析的双重 考验
  • SVG数据可视化设计(AI)完全工作流解读|计育韬
  • 如何使用 QuickAPI 推动汽车行业数据分享:数据仓库场景下的实践
  • 【开源深度解析】从零打造AI暗棋对战系统:Python实现中国象棋暗棋全攻略
  • 算法思想之深度优先搜索(DFS)、递归以及案例(最多能得到多少克黄金、精准核酸检测、最富裕的小家庭)
  • Nginx 安全防护与 HTTPS 安全部署
  • 自主智能体(Agentic AI)与传统人工智能:从数字化转型到未来变革
  • LeetCode 3423. 循环数组中相邻元素的最大差值 题解
  • 【Elastsearch】如何获取已创建的api keys
  • 如何从服务器日志中分析是否被黑客攻击?
  • 使用代理IP获取公开数据指南
  • UE5 Audio2Face导出USD表情与ARKIT表情重定向
  • Leetcode Hot 100最长连续序列
  • 将真实世界带入Unreal Engine:Cesium for Unreal深度解析与实战指南
  • 【bug】fused_bias_act_kernel.cu卡住没反应
  • 【JVM】从零开始深度解析JVM
  • 论微服务架构设计及应用
  • 世界哮喘日丨张旻:哮喘的整体诊断率不足三成,吸入治疗是重要治疗手段
  • 新华社:赵心童世锦赛夺冠,中国书写斯诺克运动新历史
  • 广东省联社:积极推动改制组建农商联合银行工作
  • 五一档7.47亿收官:《水饺皇后》领跑;男观众占比增多
  • 新闻1+1丨多地政府食堂开放 “舌尖上的服务”,反映出怎样的理念转变?
  • 美权威人士批“特朗普对进口电影征关税”:将杀死美电影产业