PyTorch & TensorFlow速成复习:从基础语法到模型部署实战(附FPGA移植衔接)

PyTorch & TensorFlow速成复习:从基础语法到模型部署实战(附FPGA移植衔接)

引言:为什么算法移植工程师必须掌握框架基础?

针对光学类产品算法FPGA移植岗位需求(如可见光/红外图像处理),深度学习框架是算法落地的"桥梁"——既要用PyTorch/TensorFlow验证算法可行性,又要将训练好的模型(如CNN、目标检测)转换为FPGA可部署的格式(ONNX、TFLite)。本文采用"问题导向+场景驱动"模式,帮你7天内唤醒框架基础,并聚焦与FPGA移植强相关的核心技能。

第一部分:框架基础速通(3天唤醒记忆)

Day1:张量操作与计算图(共通核心)

1. 张量创建与属性(必会)
操作 PyTorch TensorFlow 光学场景举例
创建全零张量 torch.zeros((3,4)) tf.zeros((3,4)) 初始化图像卷积核权重
随机正态分布 torch.randn(1,3,224,224) tf.random.normal([1,3,224,224]) 生成模拟可见光图像数据(1批3通道224x224)
查看张量形状 x.shape / x.size() x.shape / tf.shape(x) 检查红外图像输入维度
数据类型转换 x.to(torch.float32) tf.cast(x, tf.float32) FPGA定点化前统一数据类型

实战代码(以PyTorch为例,TensorFlow类比):

import torch

# 模拟16位光谱图像数据(1批,16通道,512x512)
spectral_image = torch.randint(0, 65535, (1, 16, 512, 512), dtype=torch.int16)
# 转为浮点型并归一化到[0,1](FPGA移植前预处理标准操作)
spectral_image = spectral_image.to(torch.float32) / 65535.0
# 查看形状:torch.Size([1, 16, 512, 512])
print("光谱图像形状:", spectral_image.shape)
2. 计算图与自动求导(核心差异)
  • PyTorch:动态图(即时执行)
x = torch.tensor([2.0], requires_grad=True)
y = x**2 + 3*x# 动态计算图:y = x²+3x
y.backward()# 反向传播
print(x.grad)# 输出导数 dy/dx=2x+3 → 7.0
  • TensorFlow1.x:静态图(需定义后执行)
  • TensorFlow2.x:默认动态图(Eager Execution),与PyTorch语法接近

FPGA移植关联:训练时用动态图调试更灵活,部署前需用torch.jit.tracetf.function固化计算图,消除控制流分支(FPGA不擅长处理复杂条件判断)。

Day2:神经网络构建与层操作(重点掌握CNN)

1. 核心网络层(光学图像处理必备)
层类型 PyTorch实现 TensorFlow实现 光学场景作用
卷积层 nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1) tf.keras.layers.Conv2D(16, 3, padding='same', input_shape=(224,224,3)) 提取图像边缘/纹理特征(可见光/红外通用)
池化层 nn.MaxPool2d(2, 2) tf.keras.layers.MaxPooling2D(2, 2) 降维减少计算量
批归一化 nn.BatchNorm2d(16) tf.keras.layers.BatchNormalization() 加速收敛,抗光照变化干扰
激活函数 nn.ReLU() / nn.LeakyReLU() tf.keras.layers.ReLU() / tf.keras.layers.LeakyReLU() 引入非线性变换
2. 自定义网络(以红外目标检测骨干网络为例)

PyTorch版

import torch.nn as nn

class InfraredBackbone(nn.Module):
def __init__(self):
super().__init__()
# 输入:1通道红外图像(1, 256, 256)
self.conv1 = nn.Sequential(
nn.Conv2d(1, 32, kernel_size=3, padding=1),# 32个3x3卷积核
nn.BatchNorm2d(32),
nn.ReLU(),
nn.MaxPool2d(2)# 输出(32, 128, 128)
)
self.conv2 = nn.Sequential(
nn.Conv2d(32, 64, kernel_size=3, padding=1),
nn.BatchNorm2d(64),
nn.ReLU(),
nn.MaxPool2d

你可能感兴趣的:(算法移植部署,pytorch,tensorflow,fpga开发)