IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> [pytorch学习]利用torch实现CPU版的2D卷积 -> 正文阅读

[人工智能][pytorch学习]利用torch实现CPU版的2D卷积

为了熟悉torch的tensor操作和基本函数,我实现了一个卷积的流程。有兴趣的同学可以看看,熟悉下流程和接口。代码如下:

import torch
from torch import nn 
import numbers

def cpu_correlation(X, K, s=(1, 1), p=(1, 1)):
    """基于cpu的相关操作"""
    kch, kh, kw = K.shape       # 卷积核尺寸
    ich, ih, iw = X.shape       # 输入的通道数,行,列
    assert ich == kch

    oh = (ih - kh + 2 * p[0]) // s[0] + 1
    ow = (iw - kw + 2 * p[1]) // s[1] + 1
    Y = torch.zeros((1, oh, ow), dtype=torch.float32)

    # pad输入
    padded_X = torch.zeros((ich, ih+2*p[0], iw+2*p[1]), dtype=torch.float32)
    padded_X[:, p[0]:ih+p[0], p[1]:iw+p[1]] = X[:, :, :]

    for i in range(0, oh):
        for j in range(0, ow):
            Y[0, i, j] = (padded_X[:, i*s[0]:i*s[0]+kh, j*s[1]:j*s[1]+kw] * K).sum()
    return Y


class CPUConv2D(nn.Module):
    """
    CPU_2D_CONV
    """
    def __init__(self, i_ch, o_ch, k, s, p, bias=False):
        super(CPUConv2D, self).__init__()
        self.k = (k, k) if isinstance(k, numbers.Number) else k
        self.s = (s, s) if isinstance(s, numbers.Number) else s
        self.p = (p, p) if isinstance(p, numbers.Number) else p
        self.o_ch = o_ch
        self.weight = nn.ParameterList(
            [nn.Parameter(torch.randn(i_ch, self.k[0], self.k[1])) for _ in range(o_ch)]
        ) 
        self.bias = bias
        if self.bias:
            self.bias = nn.Parameter(torch.randn(1))
        
    def test_init(self):
        """ 初始化权重,用于测试"""
        for i in range(self.o_ch):
            nn.init.constant_(conv1.weight[i], 1)
        if self.bias:
            nn.init.constant_(conv1.bias, 0)

    def forward(self, X):
        for i in range(self.o_ch):
            Y = cpu_correlation(X, self.weight[i], self.s, self.p)
            Y = Y + self.bias if self.bias else Y
            out = Y if i == 0 else torch.cat((out, Y), 0)
        return out

来测试一下流程,看能不能跑通 ;}

"""测试"""
X = torch.ones((1, 5, 5), dtype=torch.float32)
conv1 = CPUConv2D(i_ch=1, o_ch=3, k=3, s=1, p=1)
conv1.test_init()   # 将权重都置为1
Y = conv1(X)
print(Y)

这里,输入特征大小是(1, 5, 5),输出要求3通道,核尺寸为(3, 3), strides两个方向都为1,做same padding,卷积核权重元素都为1。我们可以看到,输出的shape和值是没问题的。
在这里插入图片描述
然后,我们测试一下尺寸比较大的输入和输出:

"""测试"""
X = torch.ones((3, 227, 227), dtype=torch.float32)
conv1 = CPUConv2D(i_ch=3, o_ch=16, k=3, s=(1, 2), p=1)
conv1.test_init()   # 将权重都置为1
Y = conv1(X)
print(Y.shape)

这次,我们输入是(3, 227, 227), 要求得到16通道的输出; 核尺寸还是(3, 3),这次strides在宽度方向变成了2,依然还是做same padding。 查看输出,结果是没问题的。但是,在我CPU上用了26.9s,很慢哈。
在这里插入图片描述
同样的操作,官方实现的cpu版本,只要2.1s:
在这里插入图片描述

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-08-21 15:22:26  更:2021-08-21 15:30:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 18:27:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码