從零構建深度學習推理框架-8 卷積算子實現

其實這一次課還蠻好理解的:

?首先將kernel展平:

for (uint32_t g = 0; g < groups; ++g) {std::vector<arma::fmat> kernel_matrix_arr(kernel_count_group);arma::fmat kernel_matrix_c(1, row_len * input_c_group);for (uint32_t k = 0; k < kernel_count_group; ++k) {const std::shared_ptr<Tensor<float>> &kernel =weights.at(k + g * kernel_count_group);for (uint32_t ic = 0; ic < input_c_group; ++ic) {memcpy(kernel_matrix_c.memptr() + row_len * ic,kernel->at(ic).memptr(), row_len * sizeof(float));}LOG(INFO) << "kernel展開后: " << "\n" << kernel_matrix_c;kernel_matrix_arr.at(k) = kernel_matrix_c;}

將原來的kernel放到kernel_matrix_c里面,之后如果是多個channel,也就是input_c有多個,那就按照rowlen*ic依次存放到里面。

將輸入input展平:

//按照上面的圖就是input = 3*9 ,4的這樣一個空間arma::fmat input_matrix(input_c_group * row_len, col_len);for (uint32_t ic = 0; ic < input_c_group; ++ic) {const arma::fmat &input_channel = input_->at(ic + g * input_c_group);int current_col = 0;
//下面是以窗口滑動的順序選取for (uint32_t w = 0; w < input_w - kernel_w + 1; w += stride_w) {for (uint32_t r = 0; r < input_h - kernel_h + 1; r += stride_h) {float *input_matrix_c_ptr =input_matrix.colptr(current_col) + ic * row_len;//對準窗口位置,比如對第一個就是對準紅色, 黃色, 綠色current_col += 1;for (uint32_t kw = 0; kw < kernel_w; ++kw) {const float *region_ptr = input_channel.colptr(w + kw) + r;memcpy(input_matrix_c_ptr, region_ptr, kernel_h * sizeof(float));input_matrix_c_ptr += kernel_h;}}}}LOG(INFO)  << "input展開后: " << "\n"  << input_matrix;

對于:

 for (uint32_t kw = 0; kw < kernel_w; ++kw) {const float *region_ptr = input_channel.colptr(w + kw) + r;memcpy(input_matrix_c_ptr, region_ptr, kernel_h * sizeof(float));input_matrix_c_ptr += kernel_h;}

w+kw指向的是窗口的列,r指向的是窗口的行

然后對于每個窗口的以kernel的列為標準復制過去。

最后兩個矩陣相乘就可以得到結果

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/38174.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/38174.shtml
英文地址,請注明出處:http://en.pswp.cn/news/38174.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

macOS(m芯片)連接服務器及其進行文件傳輸的各種方式的詳解

說明&#xff1a;使用了macOS后發現&#xff0c;win系統能使用的xshell、xftp等連接服務器及其文件傳輸等軟件均不能使用了&#xff0c;沒有兼容的版本。所以我們剛切換到mac系統該如何去適應呢。 一、連接遠程服務器 macOS中前文也說道我們使用的是iterm2進行終端控制的&…

基于深度信念神經網絡的礦石產量預測,基于DBN的礦石產量預測,DBN的詳細原理

目錄 背影 DBN神經網絡的原理 DBN神經網絡的定義 受限玻爾茲曼機(RBM) DBN的礦石產量預測 基本結構 主要參數 數據 MATALB代碼 結果圖 展望 背影 DBN是一種深度學習神經網絡,擁有提取特征,非監督學習的能力,是一種非常好的分類算法,本文將DBN算法進行礦石產量預測 DB…

Spring Boot Maven package時顯式的跳過test內容

在pom.xml的編譯插件部分顯式的增加一段內容&#xff1a; <plugin> <!-- maven打包時&#xff0c;顯式的跳過test部分 --><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>3.…

流量日志分析--實操

[鶴城杯 2021]流量分析 <--第一道流量分析不難,主要就是布爾盲注的流量包分析,直接查看http請求包即可我們可以通過觀察看到注入成功的響應長度不同,這里成功的為978字節,失敗的994字節.不要問為什么.其實也可以直接判斷.978的流量比994的少了非常多 顯然就是成功的(因為這里…

Docker中部署redis

1.部署redis要求 2.部署教程 連接容器中的redis redis部署完畢

大模型基礎:GPT家族與提示學習

大模型基礎:GPT 家族與提示學習 從 GPT-1 到 GPT-3.5 GPT(Generative Pre-trained Transformer)是 Google 于2018年提出的一種基于 Transformer 的預訓練語言模型。它標志著自然語言處理領域從 RNN 時代進入 Transformer 時代。GPT 的發展歷史和技術特點如下: GPT-12018年6月…

QQ附近人引流的幾個詳細方法,qq附近人引流腳本實操演示教程

大家好我是你們的小編一辭腳本&#xff0c;今天給大家分享新的知識&#xff0c;很開心可以在CSDN平臺分享知識給大家,很多伙伴看不到代碼我先錄制一下視頻 在給大家做代碼&#xff0c;給大家分享一下qq引流腳本的知識和視頻演示 不懂的小伙伴可以認真看一下&#xff0c;我們一…

【CSS】CSS 布局——常規流布局

<h1>基礎文檔流</h1><p>我是一個基本的塊級元素。我的相鄰塊級元素在我的下方另起一行。</p><p>默認情況下&#xff0c;我們會占據父元素 100%的寬度&#xff0c;并且我們的高度與我們的子元素內容一樣高。我們的總寬度和高度是我們的內容 內邊距…

Flink筆記

下面是你提供的文字整理后的結果&#xff1a; 1. Flink是一個針對流數據和批數據的分布式處理引擎&#xff0c;同時支持原生流處理的開源框架。 - 延遲低(毫秒級)&#xff0c;且能夠保證消息傳輸不丟失不重復。 - 具有非常高的吞吐(每秒千萬級)。 - 支持原生流處理。…

echarts-convert.js使用

echarts-convert.js demo 點擊下載 1、本地安裝phantom.js插件 點擊下載 2、更改文件路徑 &#xff08;D:\phantomjs-2.1.1-windows\bin&#xff09;改為本地項目文件路徑 3、打開cmd命令行&#xff0c;并格式化語言 運行以下命令 將命令行語言改為中文簡體 chcp 65001…

(二分查找) 11. 旋轉數組的最小數字 ——【Leetcode每日一題】

?劍指 Offer 11. 旋轉數組的最小數字 難度&#xff1a;簡單 把一個數組最開始的若干個元素搬到數組的末尾&#xff0c;我們稱之為數組的旋轉。 給你一個可能存在 重復 元素值的數組 numbers &#xff0c;它原來是一個升序排列的數組&#xff0c;并按上述情形進行了一次旋轉…

springboot整合kafka多數據源

整合kafka多數據源 項目背景依賴配置生產者消費者消息體 項目背景 在很多與第三方公司對接的時候&#xff0c;或者處在不同的網絡環境下&#xff0c;比如在互聯網和政務外網的分布部署服務的時候&#xff0c;我們需要對接多臺kafka來達到我們的業務需求&#xff0c;那么當kafk…

【Vue-Router】路由過渡動效

在 Vue Router 中&#xff0c;你可以通過過渡動效&#xff08;Transition Effects&#xff09;為路由切換添加平滑的過渡效果&#xff0c;從而提升用戶體驗。過渡動效可以使用 Vue 的 <transition> 組件和 CSS 過渡來實現。 基本使用&#xff1a; 對導航使用動畫&#…

HTML-文本標簽

歷史上&#xff0c;網頁的主要功能是文本展示。所以&#xff0c;HTML 提供了大量的文本處理標簽。 <div> <div>是一個通用標簽&#xff0c;表示一個區塊&#xff08;division&#xff09;。它沒有語義&#xff0c;如果網頁需要一個塊級元素容器&#xff0c;又沒有…

leetcode 494. 目標和

2023.8.14 一杯茶&#xff0c;一包煙&#xff0c;一道dp做一天... ps&#xff1a;nums[i]均大于等于0。本題先轉化為0-1背包問題&#xff1a;將數組元素分成兩堆&#xff1a;一堆為正號&#xff0c;另一堆為負號。設正號堆的和為x&#xff0c;則負號堆的和為sum-x。&#xff08…

CentOS系統環境搭建(十)——CentOS7定時任務

centos系統環境搭建專欄&#x1f517;點擊跳轉 使用CentOS系統環境搭建&#xff08;九&#xff09;——centos系統下使用docker部署項目的項目做定時任務。 CentOS7定時任務 查看現有的定時任務 crontab -l編輯定時任務 crontab -e示例 每天凌晨兩點運行腳本 清理內存 0 2 *…

【Linux的開胃小菜】常用的RPM軟件包與YUM倉庫包管理器使用

一、系統初始化進程 systemd與System V init的區別以及作用&#xff1a; System V init運行級別systemd目標名稱systemd目標作用0poweroff.target關機1rescue.target單用戶模式2multi-user.target多用戶的文本界面3multi-user.target多用戶的文本界面4multi-user.target多用戶…

【SpringBoot】88、SpringBoot中使用Undertow替代Tomcat容器

SpringBoot 中我們既可以使用 Tomcat 作為 Http 服務,也可以用 Undertow 來代替。Undertow 在高并發業務場景中,性能優于 Tomcat。所以,如果我們的系統是高并發請求,不妨使用一下 Undertow,你會發現你的系統性能會得到很大的提升。 1、Tomcat 介紹 Tomcat是一個開源的Ja…

【數據結構】“單鏈表”的練習題(二)

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;個人主頁 &#xff1a;阿然成長日記 …

Django框架 靚號管理(增刪改查)

Django框架 靚號管理&#xff08;增刪改查&#xff09; 新建一個項目 backend 使用pycharm創建app startapp app項目目錄 C:\code\backend ├── app | ├── admin.py | ├── apps.py | ├── migrations | ├── models.py | ├── tests.py | ├── views.…