动手实现卷积
主要目的在于熟悉torch中的indexing操作。
首先,要介绍torch中的unfold操作。首先这个函数的输入必须是一个4-dimensional的tensor。还要设置
一些常用的参数,例如kernel_size, stride等等。然后就会被resize成为一个(B, Channel * kernel_size[0] * kernel_size[1], num_of_sifts)的一个tensor。fold操作恰恰相反,有了这些前置知识就可以写出一个卷积操作了。
import torch
import torch.nn.functional as F
input_tensor = torch.randn(2, 3, 4, 4)
conv_kernel = torch.rand(3, 3, 3)
unfold_tensor = F.unfold(input_tensor, (3, 3)) # fold的参数是(input_tensor, (kernel_size[1], kernel_size[2])
conv_kernel_after = conv_kernel.view(conv_kernel.size(0), -1).repeat(1, 3).transpose(0, 1)
multi_tensor = torch.matmul(unfold_tensor.transpose(1, 2), conv_kernel_after).transpose(1, 2)
result = F.fold(multi_tensor, (2, 2), 1) # fold的参数(input, (output_dim[0], output_dim[1]), stride)
conv_kernel_after = conv_kernel.unsqueeze(dim=1).repeat(1,3,1,1)
print((F.conv2d(input_tensor, conv_kernel_after) - result).abs().max())
分类:
pytorch代码实用教程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~