日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

smooth_L1_loss_layer.cu解读 caffe源码初认识

發布時間:2025/4/16 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 smooth_L1_loss_layer.cu解读 caffe源码初认识 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

.cpp是cpu上運行的代碼,.cu是gpu上運行的代碼。

這是smooth_L1_loss_layer.cu的前向傳播部分

#include "caffe/fast_rcnn_layers.hpp"namespace caffe {template <typename Dtype> __global__ void SmoothL1Forward(const int n, const Dtype* in, Dtype* out) {// f(x) = 0.5 * x^2 if |x| < 1// |x| - 0.5 otherwise CUDA_KERNEL_LOOP(index, n) {Dtype val = in[index];Dtype abs_val = abs(val);if (abs_val < 1) {out[index] = 0.5 * val * val;} else {out[index] = abs_val - 0.5;}} }template <typename Dtype> void SmoothL1LossLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom,const vector<Blob<Dtype>*>& top) {int count = bottom[0]->count();caffe_gpu_sub(count,bottom[0]->gpu_data(),bottom[1]->gpu_data(),diff_.mutable_gpu_data()); // d := b0 - b1if (has_weights_) {caffe_gpu_mul(count,bottom[2]->gpu_data(),diff_.gpu_data(),diff_.mutable_gpu_data()); // d := w * (b0 - b1) }SmoothL1Forward<Dtype><<<CAFFE_GET_BLOCKS(count), CAFFE_CUDA_NUM_THREADS>>>(count, diff_.gpu_data(), errors_.mutable_gpu_data());CUDA_POST_KERNEL_CHECK;Dtype loss;caffe_gpu_asum(count, errors_.gpu_data(), &loss);top[0]->mutable_cpu_data()[0] = loss / bottom[0]->num();              注意:這里是bottom[0]->num(),不是bottom[0]->count() }

blob的主要變量:

shared_ptr<SyncedMemory> data_; shared_ptr<SyncedMemory> diff_; vector<int> shape_; int count_; int capacity_;

?

blob只是一個基本的數據結構,因此內部的變量相對較少,首先是data_指針,指針類型是shared_ptr,屬于boost庫的一個智能指針,這一部分主要用來申請內存存儲data,data主要是正向傳播的時候用的。同理,diff_主要用來存儲偏差,shape_都是存儲Blob的形狀,count表示Blob中的元素個數,也就是個數*通道數*高度*寬度,capacity表示當前的元素個數,因為Blob可能會reshape。count是一個迭代期參與的圖片個數。帶data的里面存儲的是激活值和W、b,diff中存儲的是殘差和dW、db。

?

blob中除了數據成員之外,也有很多用于操作數據的函數成員,下面就說幾個比較重要的:

??? void Blob<Dtype>::Reshape():這個函數是在原來分配的內存不夠的情況下重新分配內存。

??? const Dtype* Blob<Dtype>::cpu_data():這個是獲取Blob結構體中的data_數據的指針,同時限制不能對返回的指針指向的內容進行更改。

??? const Dtype* Blob<Dtype>::cpu_diff():這個是獲取Blob結構體中的diff_數據的指針,同時限制不能對返回的指針指向的內容進行更改。

??? Dtype* Blob<Dtype>::mutable_cpu_data():獲取Blob結構體中的data_數據的指針,同時可以對指針指向的內容更改。

??? Dtype* Blob<Dtype>::mutable_cpu_diff():獲取Blob結構體中的diff_數據的指針,同時可以對指針指向的內容更改。

??? void Blob<Dtype>::ShareData(const Blob& other):讓其他Blob的data_數據和當前Blob共享。

? ??void Blob<Dtype>::ShareDiff(const Blob& other):讓其他Blob的diff_和當前的Blob共享。 ??

?

blob類里面有重載很多個count()函數,主要還是為了統計blob的容量(volume),或者是某一片(slice),從某個axis到具體某個axis的shape乘積。

inline int count(int start_axis, int end_axis)

int count = bottom[0]->count();????? count()沒帶參數,計算的是bottom[0]這個輸入blob所有的元素個數。這里就是計算一個迭代期的所有圖片的所有通道的所有坐標點形成的blob數據結構元素的個數。

top[0]->mutable_cpu_data()[0] = loss / bottom[0]->num();  num()是計算一個迭代期參與的所有圖片的個數。這里就是求一個迭代期所有幾張圖片的平均loss。 ???????????

?

caffe_gpu_asum(count, errors_.gpu_data(), &loss);  caffe_gpu_asum是對向量進行L1范數計算,實際上就是對向量求其每個元素絕對值的和。第一個參數是要計算的元素的個數。

?

caffe_gpu_sub(count,bottom[0]->gpu_data(),bottom[1]->gpu_data(),diff_.mutable_gpu_data()); // d := b0 - b1if (has_weights_) {caffe_gpu_mul(count,bottom[2]->gpu_data(),diff_.gpu_data(),diff_.mutable_gpu_data()); // d := w * (b0 - b1) }

caffe_gpu_sub,caffe_gpu_mul:這兩個函數分別實現element-wise(即點乘,每個矩陣對應元素相乘)的乘減(y[i] = a[i] *?- b[i])。第一個參數是要計算的元素個數。

?

總結; ??smooth_L1_loss_layer的loss計算是將所有對應元素(某張圖片,某個通道的對應坐標)相減,判斷絕對值是否小于1然后各個元素分別進行smooth_L1(x)這個函數的處理,各個元素都有一個loss,然后把所有的loss相加除以圖片數,就得到每張圖片box_loss的值。 ?????

?

loss的兩個輸入是1x84維的向量(fast中是這樣,faster中的rpn是36*w*h),這個向量表示21類的dx,dy,dh,dw。count數出所有的個數,然后兩個輸入相對應的每一個進行這個計算,計算出84個loss,再對84個loss求和。當然這是單個圖片,如果batch有多個圖片,對多個圖片loss求平均。

fast中使用的smoothL1和faster中使用的smoothL1有一點差別,但不大。faster中除了在rpn使用smoothl1,還要在fast那部分使用,所以faster中的smoothl1應該是兼容的。

?

轉載于:https://www.cnblogs.com/ymjyqsx/p/7086698.html

總結

以上是生活随笔為你收集整理的smooth_L1_loss_layer.cu解读 caffe源码初认识的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲涩情 | 亚洲男人天堂 | 亚色一区 | 亚洲成人麻豆 | 操丰满女人 | 男女做爰猛烈吃奶啪啪喷水网站 | 久久久久一| 亚洲高清在线观看视频 | 超碰视屏 | 久久久久久综合网 | 久久yy | 免费a在线 | 99久久99 | 成人午夜激情网 | 99热只有这里有精品 | 熟女高潮一区二区三区视频 | 欧美视频你懂的 | 国产又爽又黄视频 | 国产三级福利 | 色九月婷婷 | 一本色道久久综合亚洲精品图片 | av青青 | 久久只有精品 | 噜噜色图 | 久久久久久久久久久影院 | 天天干天天操天天插 | 香蕉久久夜色精品升级完成 | 有码视频在线观看 | 国产视频久久久久久久 | www.插插插 | 91久久超碰| 婷婷六月色 | 一级黄色片网站 | 扒开女人屁股进去 | 久久亚洲AV无码 | 一本久道久久综合无码中文 | 国产毛片一区二区 | 久久综合九色综合欧美狠狠 | 疯狂做受xxxx国产 | 日本偷拍一区 | 激情综合亚洲 | 免费毛片网 | 美女免费av | 同心兄弟| 能看的毛片 | 成人区精品一区二区婷婷 | 国产一区在线观看视频 | 91欧美日韩麻豆精品 | 人成免费在线视频 | h文在线观看 | 不卡视频在线 | 欧美精品成人在线 | 色偷偷免费视频 | 国产精品日韩电影 | 天堂av观看| 特黄视频在线观看 | 欧美日韩免费一区二区三区 | 久草最新网址 | 无码视频在线观看 | 免费三级大片 | 久久精品国产99国产精品 | 丰满人妻熟女aⅴ一区 | 日韩伦理视频 | 国产真实的和子乱拍在线观看 | 久久久久久久久久久久久久久久久久 | 亚洲高清欧美 | 国产日韩欧美 | 国产精品久久色 | 撸撸在线视频 | 在线观看日韩一区二区 | 免费黄色一区二区 | 林雅儿欧洲留学恋爱日记在线 | 欧美性生活一区二区 | 国产激情久久久久 | 91美女精品 | 免费av日韩 | 尤物精品视频在线观看 | 欧美日韩在线视频一区 | 国产视频精品视频 | 国产网站在线免费观看 | 阿拉伯性视频xxxx | 亚洲另类图区 | 国产无套精品一区二区 | av每日更新 | 成年人看的黄色 | 国产在线视频福利 | 欧美三p| 91在线视频播放 | 最近中文字幕免费mv视频7 | av调教| 国产色99 | 久久av综合 | 欧洲精品视频在线观看 | 在线播放毛片 | 久久白虎| 日韩一区二区三区在线观看视频 | 亚洲欧美999 | 超碰www | 欧美性猛交99久久久久99按摩 |