卷积的计算 - im2col 2

卷积的计算 - im2col 2

flyfish

import numpy as np
np.set_printoptions(linewidth=200)

# F  = filter = kernel

def im2col(images, kernel_size, stride=1, padding=0):
    #process images
    if images.ndim == 2:
        images = images.reshape(1, 1, *images.shape)
    elif images.ndim == 3:
        N, I_h, I_w = images.shape
        images = images.reshape(N, 1, I_h, I_w)
    N, C, I_h, I_w = images.shape

    #process kernel
    if isinstance(kernel_size, tuple):
        if len(kernel_size) == 2:
            kernel_size = (1, 1, *kernel_size)
        elif len(kernel_size) == 3:
            M, k_h, k_w = kernel_size
            kernel_size = (M, 1, k_h, k_w)
        _, _, k_h, k_w = kernel_size
    else:
        if kernel_size.ndim == 2:
            kernel_size = kernel_size.reshape(1, 1, *kernel_size.shape)
        elif kernel_size.ndim == 3:
            M, k_h, k_w = kernel_size.shape
            kernel_size = kernel_size.reshape(M, 1, k_h, k_w)
        _, _, k_h, k_w = kernel_size.shape
    
    #process stride
    if isinstance(stride, tuple):
        stride_ud, stride_lr = stride
    else:
        stride_ud = stride
        stride_lr = stride


    #process padding     
    if isinstance(padding, tuple):
        pad_ud, pad_lr = padding
    elif isinstance(padding, int):
        pad_ud = padding
        pad_lr = padding
    elif padding == "same":
        pad_ud = 0.5*((I_h - 1)*stride_ud - I_h + k_h)
        pad_lr = 0.5*((I_w - 1)*stride_lr - I_w + k_w)
    pad_zero = (0, 0)
    
    O_h = int((I_h - k_h + 2*pad_ud)//stride_ud + 1)
    O_w = int((I_w - k_w + 2*pad_lr)//stride_lr + 1)
    
    result_pad = (pad_ud, pad_lr)
    pad_ud = int(np.ceil(pad_ud))
    pad_lr = int(np.ceil(pad_lr))
    pad_ud = (pad_ud, pad_ud)
    pad_lr = (pad_lr, pad_lr)
    images = np.pad(images, [pad_zero, pad_zero, pad_ud, pad_lr], "constant")
    
    cols = np.empty((N, C, k_h, k_w, O_h, O_w))
    for h in range(k_h):
        h_lim = h + stride_ud*O_h
        for w in range(k_w):
            w_lim = w + stride_lr*O_w
            cols[:, :, h, w, :, :] \
                = images[:, :, h:h_lim:stride_ud, w:w_lim:stride_lr]
    

    cols = cols.transpose(1, 2, 3, 0, 4, 5).reshape(C*k_h*k_w, N*O_h*O_w)
    print("H:",O_h)
    print("W:",O_w)
 
  
    return cols



image = np.arange(1, 109).reshape(1, 3, 6, 6) #NCHW
print("input:",image)

r=im2col(image,(3,3,3),1,0)
print(r)
print(r.shape)

运行结果
在这里插入图片描述
图中 Input的值是

input: [[[[  1   2   3   4   5   6]
   [  7   8   9  10  11  12]
   [ 13  14  15  16  17  18]
   [ 19  20  21  22  23  24]
   [ 25  26  27  28  29  30]
   [ 31  32  33  34  35  36]]

  [[ 37  38  39  40  41  42]
   [ 43  44  45  46  47  48]
   [ 49  50  51  52  53  54]
   [ 55  56  57  58  59  60]
   [ 61  62  63  64  65  66]
   [ 67  68  69  70  71  72]]

  [[ 73  74  75  76  77  78]
   [ 79  80  81  82  83  84]
   [ 85  86  87  88  89  90]
   [ 91  92  93  94  95  96]
   [ 97  98  99 100 101 102]
   [103 104 105 106 107 108]]]]

在这里插入图片描述

输出的形状
H: 4
W: 4
卷积核是3*3 ,K =3
通道是3 ,C=3

(K*K*C,H*W,)=(3*3*3,4*4)=(27, 16)

经过im2col结果是

[[  1.   2.   3.   4.   7.   8.   9.  10.  13.  14.  15.  16.  19.  20.  21.  22.]
 [  2.   3.   4.   5.   8.   9.  10.  11.  14.  15.  16.  17.  20.  21.  22.  23.]
 [  3.   4.   5.   6.   9.  10.  11.  12.  15.  16.  17.  18.  21.  22.  23.  24.]
 [  7.   8.   9.  10.  13.  14.  15.  16.  19.  20.  21.  22.  25.  26.  27.  28.]
 [  8.   9.  10.  11.  14.  15.  16.  17.  20.  21.  22.  23.  26.  27.  28.  29.]
 [  9.  10.  11.  12.  15.  16.  17.  18.  21.  22.  23.  24.  27.  28.  29.  30.]
 [ 13.  14.  15.  16.  19.  20.  21.  22.  25.  26.  27.  28.  31.  32.  33.  34.]
 [ 14.  15.  16.  17.  20.  21.  22.  23.  26.  27.  28.  29.  32.  33.  34.  35.]
 [ 15.  16.  17.  18.  21.  22.  23.  24.  27.  28.  29.  30.  33.  34.  35.  36.]
 [ 37.  38.  39.  40.  43.  44.  45.  46.  49.  50.  51.  52.  55.  56.  57.  58.]
 [ 38.  39.  40.  41.  44.  45.  46.  47.  50.  51.  52.  53.  56.  57.  58.  59.]
 [ 39.  40.  41.  42.  45.  46.  47.  48.  51.  52.  53.  54.  57.  58.  59.  60.]
 [ 43.  44.  45.  46.  49.  50.  51.  52.  55.  56.  57.  58.  61.  62.  63.  64.]
 [ 44.  45.  46.  47.  50.  51.  52.  53.  56.  57.  58.  59.  62.  63.  64.  65.]
 [ 45.  46.  47.  48.  51.  52.  53.  54.  57.  58.  59.  60.  63.  64.  65.  66.]
 [ 49.  50.  51.  52.  55.  56.  57.  58.  61.  62.  63.  64.  67.  68.  69.  70.]
 [ 50.  51.  52.  53.  56.  57.  58.  59.  62.  63.  64.  65.  68.  69.  70.  71.]
 [ 51.  52.  53.  54.  57.  58.  59.  60.  63.  64.  65.  66.  69.  70.  71.  72.]
 [ 73.  74.  75.  76.  79.  80.  81.  82.  85.  86.  87.  88.  91.  92.  93.  94.]
 [ 74.  75.  76.  77.  80.  81.  82.  83.  86.  87.  88.  89.  92.  93.  94.  95.]
 [ 75.  76.  77.  78.  81.  82.  83.  84.  87.  88.  89.  90.  93.  94.  95.  96.]
 [ 79.  80.  81.  82.  85.  86.  87.  88.  91.  92.  93.  94.  97.  98.  99. 100.]
 [ 80.  81.  82.  83.  86.  87.  88.  89.  92.  93.  94.  95.  98.  99. 100. 101.]
 [ 81.  82.  83.  84.  87.  88.  89.  90.  93.  94.  95.  96.  99. 100. 101. 102.]
 [ 85.  86.  87.  88.  91.  92.  93.  94.  97.  98.  99. 100. 103. 104. 105. 106.]
 [ 86.  87.  88.  89.  92.  93.  94.  95.  98.  99. 100. 101. 104. 105. 106. 107.]
 [ 87.  88.  89.  90.  93.  94.  95.  96.  99. 100. 101. 102. 105. 106. 107. 108.]]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/251460.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RK3568平台开发系列讲解(Linux系统篇)如何优化Linux驱动的稳定性和效率

🚀返回专栏总目录 文章目录 一、检测 ioctl 命令二、检测传递地址是否合理三、分支预测优化沉淀、分享、成长,让自己和他人都能有所收获!😄 📢在 Linux 中应用程序运行在用户空间,应用程序错误之后,并不会影响其他程序的运行,而驱动工作在内核层,是内核代码的一部分…

响应者链概述

响应者链 iOS事件的3大类型 Touch Events(触摸事件)Motion Events(运动事件,比如重力感应和摇一摇等)Remote Events(远程事件,比如用耳机上得按键来控制手机) 触摸事件 处理触摸事件的两个步骤 寻找事件的最佳响应者事件的响应在响应链中的传递 寻…

记录 | gpu docker启动报错libnvidia-ml.so.1: file exists: unknown

困扰了两天的问题,记录一下 问题出在启动一个本身已经安装 cuda 的镜像上,具体来说,我是启动地平线天工开物工具链镜像的时候出现的问题,具体报错如下: docker: Error response from daemon: failed to create task …

System作为系统进程陔如何关闭?

一、简介 system进程是不可以关闭的,它是用来运行一些系统命令的,比如reboot、shutdown等,以及用来运行一些后台程序,比如ntfs-3g、v4l2loopback等。system进程也被用于运行一些内核模块,比如nvidia、atd等。system进程…

结构体基础全家桶(1)创建与初始化

目录 结构体概念: 结构体类型: 结构体变量的创建: 定义结构体变量的三种方式: 结构体变量的引用: 结构体变量的初始化: 结构体数组: 结构体数组定义: 结构体数组初始化: 结…

AlexNet(pytorch)

AlexNet是2012年ISLVRC 2012(ImageNet Large Scale Visual Recognition Challenge)竞赛的冠军网络,分类准确率由传统的 70%提升到 80% 该网络的亮点在于: (1)首次利用 GPU 进行网络加速训练。 &#xff…

介绍strncpy函数

strncpy函数需要引用#include <string.h>头文件 函数原型&#xff1a; char *_Dest 是字符串的去向 char *_Source是字符串的来源 size_t_Count是复制字符串的大小 #include <stdio.h> #include <string.h> int main() { char arr[128] { \0 }; …

数据结构之排序

目录 ​ 1.常见的排序算法 2.插入排序 直接插入排序 希尔排序 3.交换排序 冒泡排序 快速排序 hoare版本 挖坑法 前后指针法 非递归实现 4.选择排序 直接选择排序 堆排序 5.归并排序 6.排序总结 一起去&#xff0c;更远的远方 1.常见的排序算法 排序&#xff1a;所…

积分球均匀光源遥感器如何保持稳定

积分球的亮度均匀性取决于其内部涂层的反射率和分布情况。当光源通过积分球时&#xff0c;光会被内部的涂层多次反射&#xff0c;最终从出光口均匀地散射出去。为了提高亮度均匀性&#xff0c;可以采用具有高反射率和均匀分布的光源&#xff0c;同时选择合适的涂层材料和涂层厚…

NXP应用随记(五):eMios功能点阅读随记

目录 1、概念点 2、eMios功能点 2.1、eMIOS - Single Action Input Capture (SAIC) 2.2、eMIOS - Single Action Output Compare (SAOC) 2.3、eMIOS - Double Action Output Compare (DAOC) 2.4、eMIOS - Pulse/Edge Counting (PEC) – Single Shot 2.5、eMIOS - Pulse/E…

算法:程序员的数学读书笔记

目录 ​0的故事 ​一、按位计数法 二、不使用按位计数法的罗马数字 三、十进制转二进制​​​​​​​ ​四、0所起到的作用​​​​​​​ 逻辑 一、为何逻辑如此重要 二、兼顾完整性和排他性 三、逻辑 四、德摩根定律 五、真值表 六、文氏图 七、卡诺图 八、逻…

【算法Hot100系列】最长回文子串

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

向华为学习:基于BLM模型的战略规划研讨会实操的详细说明,含研讨表单(二)

上一篇文章&#xff0c;华研荟结合自己的经验和实践&#xff0c;详细介绍了基于BLM模型的战略规划研讨会的设计和组织流程&#xff0c;提高效率的做法。有朋友和我私信沟通说&#xff0c;其实这个流程不单单适合于BLM模型的战略规划研讨会&#xff0c;实际上&#xff0c;使用其…

Linux centos7安装redis 6.2.14 gz并且使用systemctl为开机自启动 / 彻底删除 redis

1.下载 && 减压 wget http://download.redis.io/releases/redis-6.2.14.tar.gz tar -zvxf redis-6.2.14.tar.gz 2.编译&#xff08;分开运行&#xff09; cd redis-6.2.14 make cd src make install 安装目录展示 3.redis.conf 配置更改 daemonize yes supervised s…

【STM32入门】4.1中断基本知识

1.中断概览 在开展红外传感器遮挡计次的实验之前&#xff0c;有必要系统性的了解“中断”的基本知识. 中断是指&#xff1a;在主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转…

交友网站的设计与实现(源码+数据库+论文+开题报告+说明文档)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

听力健康“吃”出来

大多数的研究报告都指出&#xff0c;听力下降的最常见原因是年龄和噪音暴露。然而&#xff0c;近年来越来越多的文章开始探讨其他因素对听力的影响。食物不仅是维持人类基本生存的必需品&#xff0c;随着营养学的进步&#xff0c;人们也逐渐认识到食物中的营养与保持健康之间存…

Unity中Shader URP 简介

文章目录 前言一、URP&#xff08;Universal Render Pipeline&#xff09;由名字可知&#xff0c;这是一个 通用的 渲染管线1、Universal&#xff08;通用性&#xff09;2、URP的由来 二、Build-in Render Pipeline&#xff08;内置渲染管线&#xff09;1、LWRP&#xff08;Lig…

产品经理在项目周期中扮演的角色Axure的安装与基本使用

目录 一.项目周期流程 二.Axure是什么 三.Axure安装 3.1 一键式安装 3.2 汉化 3.3 授权登录 四.Axure的界面介绍及基本使用 4.1 菜单栏的使用 4.2 工具栏的使用 4.3 页面概要的使用及组件的使用 4.4 组件的样式设计 一.项目周期流程 在一般的项目周期中包含的工作内容有&…

Tektronix泰克TCP303示波器电流探头

主要特点和优点&#xff1a; ● 交流/直流测量功能 ● DC~100MHz电流探头放大器&#xff08;TCPA300&#xff09;&#xff0c;当使用&#xff1a; - DC~100MHz, 30A DC&#xff08;TCP312&#xff09; - DC~50MHz, 50A DC&#xff08;TCP305&#xff09; - DC~5MHz, 150A DC&a…