caffe中各种cblas的函数使用总结
Y=alpha * X +beta*Y
template <> void caffe_cpu_axpby<float>(const int N, const float alpha, const float* X,const float beta, float* Y) {cblas_saxpby(N, alpha, X, 1, beta, Y, 1); }template <> void caffe_cpu_axpby<double>(const int N, const double alpha, const double* X,const double beta, double* Y) {cblas_daxpby(N, alpha, X, 1, beta, Y, 1); }
cblas_dscal(N, beta, Y, incY); Y=Y*beta cblas_daxpy(N, alpha, X, incX, Y, incY); Y= (alpha * X) + Y)
Y=alpha * X + Y
template <> void caffe_axpy<float>(const int N, const float alpha, const float* X,float* Y) { cblas_saxpy(N, alpha, X, 1, Y, 1); }template <> void caffe_axpy<double>(const int N, const double alpha, const double* X,double* Y) { cblas_daxpy(N, alpha, X, 1, Y, 1); }
DEFINE_VSL_BINARY_FUNC(Add, y[i] = a[i] + b[i]); DEFINE_VSL_BINARY_FUNC(Sub, y[i] = a[i] - b[i]); DEFINE_VSL_BINARY_FUNC(Mul, y[i] = a[i] * b[i]); DEFINE_VSL_BINARY_FUNC(Div, y[i] = a[i] / b[i]);template <> void caffe_add<float>(const int n, const float* a, const float* b, float* y) { vsAdd(n, a, b, y); }template <> void caffe_add<double>(const int n, const double* a, const double* b, double* y) { vdAdd(n, a, b, y); }
y=x;
template <> void caffe_copy<float>(const int N, const float* X, float* Y) {cblas_scopy(N, X, 1, Y, 1); }template <> void caffe_copy<double>(const int N, const double* X, double* Y) {cblas_dcopy(N, X, 1, Y, 1); }template <> void caffe_gpu_copy<float>(const int N, const float* X, float* Y) {CUBLAS_CHECK(cublasScopy(Caffe::cublas_handle(), N, X, 1, Y, 1)); }template <> void caffe_gpu_copy<double>(const int N, const double* X, double* Y) {CUBLAS_CHECK(cublasDcopy(Caffe::cublas_handle(), N, X, 1, Y, 1)); }
Computes alpha*x*y' + A.
cblas_sger Multiplies vector X by the transform of vector Y, then adds matrix A (single precison).
Multiplies vector X by the transform of vector Y, then adds matrix A (single precison).void cblas_sger (const enum CBLAS_ORDER Order,const int M,const int N,const float alpha,const float *X,const int incX,const float *Y,const int incY,float *A,const int lda);Y(vetor)←αAX + βY
This function multiplies A * X (after transposing A, if needed) and multiplies the resulting matrix by alpha. It then multiplies vector Y by beta. It stores the sum of these two products in vector Y.
template <> void caffe_cpu_gemv<float>(const CBLAS_TRANSPOSE TransA, const int M,const int N, const float alpha, const float* A, const float* x,const float beta, float* y) {cblas_sgemv(CblasRowMajor, TransA, M, N, alpha, A, N, x, 1, beta, y, 1); }
C(matrix)←αAB + βC
template<typename T> void gpu_multmat(T* A, T* B, T* C, int M,int K,int N){const T alpha = 1,beta=0;caffe_gpu_gemm(CblasNoTrans,CblasNoTrans,M,N,K,alpha,A,B,beta,C); }
template<> void caffe_cpu_gemm<float>(const CBLAS_TRANSPOSE TransA,const CBLAS_TRANSPOSE TransB, const int M, const int N, const int K,const float alpha, const float* A, const float* B, const float beta,float* C) {int lda = (TransA == CblasNoTrans) ? K : M;int ldb = (TransB == CblasNoTrans) ? N : K;cblas_sgemm(CblasRowMajor, TransA, TransB, M, N, K, alpha, A, lda, B,ldb, beta, C, N); }
A=M*N B=M*K C=A'*B N M K
template<typename T> void cpu_multTmat(T* A, T* B, T* C, int M,int K,int N){const T alpha = 1,beta=0;caffe_cpu_gemm(CblasTrans,CblasNoTrans,M,N,K,alpha,A,B,beta,C);// cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, M, N, K, alpha, A, M, B, K, beta, C, M); }
A=M*N B=N*K
C=A*B M N K
template<typename T> void cpu_multmat(T* A, T* B, T* C, int M,int K,int N){const T alpha = 1,beta=0;caffe_cpu_gemm(CblasNoTrans,CblasNoTrans,M,N,K,alpha,A,B,beta,C);// cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, M, N, K, alpha, A, M, B, K, beta, C, M); }
计算矩阵乘法的函数之一是 cblas_sgemm,使用单精度实数,另外还有对应双精度实数,单精度复数和双精度复数的函数。在此以 cblas_sgemm为例。函数定义为:void cblas_sgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA,const enum CBLAS_TRANSPOSE TransB, const int M, const int N,const int K, const float alpha, const float *A,const int lda, const float *B, const int ldb,const float beta, float *C, const int ldc)得到的结果是: C = alpha*op( A )*op( B ) + beta*Cconst enum CBLAS_ORDER Order,这是指的数据的存储形式,在CBLAS的函数中无论一维还是二维数据都是用一维数组存储,这就要涉及是行主序还是列主序,在C语言中数组是用 行主序,fortran中是列主序。我还是习惯于是用行主序,所以这个参数是用CblasRowMajor,如果是列主序的话就是 CblasColMajor。const int M,矩阵A的行,矩阵C的行const int N,矩阵B的列,矩阵C的列const int K,矩阵A的列,矩阵B的行const float alpha, const float beta,计算公式中的两个参数值,如果只是计算C=A*B,则alpha=1,beta=0const float *A, const float *B, const float *C,矩阵ABC的数据const int lda, const int ldb, const int ldc,在BLAS的文档里,这三个参数分别为ABC的行数,但是实际使用发现,在CBLAS里应该是列数。
caffe中各种cblas的函数使用总结相关推荐
- caffe中的各种loss函数
转自:https://blog.csdn.net/u012177034/article/details/52144325 机器学习的目的就是通过对训练样本输出与真实值不一致的进行惩罚,得到损失Loss ...
- caffe中的多种loss函数
https://blog.csdn.net/u012177034/article/details/52144325 机器学习的目的就是通过对训练样本输出与真实值不一致的进行惩罚,得到损失Loss,然后 ...
- caffe中各种loss函数
转自: http://www.mamicode.com/info-detail-594961.html Caffe中的损失函数解析 导言 在有监督的机器学习中,需要有标签数据,与此同时,也需要有对应的 ...
- caffe中loss函数代码分析--caffe学习(16)
接上篇:caffe中样本的label一定要从序号0开始标注吗?–caffe学习(15) A: 1:数学上来说,损失函数loss值和label从0开始还是从1或者100开始是没有直接联系的,以欧式距离损 ...
- caffe中的loss函数简单介绍
本文转载自:http://www.cnblogs.com/jianyingzhou/p/4094095.html,感谢作者的热心分享! 进一步了解可以看这篇博文:http://www.cnblogs. ...
- Caffe中对MNIST执行train操作执行流程解析
之前在 http://blog.csdn.net/fengbingchun/article/details/49849225 中简单介绍过使用Caffe train MNIST的文章,当时只是仿照ca ...
- caffe中各层的作用
caffe中各层的作用: 关于caffe中的solver: cafffe中的sover的方法都有: Stochastic Gradient Descent (type: "SGD" ...
- caffe中权值初始化方法
参考:https://www.cnblogs.com/tianshifu/p/6165809.html 首先说明:在caffe/include/caffe中的 filer.hpp文件中有它的源文件,如 ...
- Caffe中的损失函数解析
Caffe中的损失函数解析 导言 在有监督的机器学习中,需要有标签数据,与此同时,也需要有对应的损失函数(Loss Function). 在Caffe中,目前已经实现了一些损失函数,包括最常见的L2损 ...
最新文章
- 手机app 有没有window.location.href_热议小程序使用场景越来越多,未来有没有可能替代手机APP?...
- 表示层 业务逻辑层 数据层(UI BLL DAL)
- 【数学与算法】奇异矩阵、奇异值、奇异值分解、奇异性
- Struts2做下载
- 《Unix环境高级编程》学习笔记
- 【kmp专题】牛客网子串(进制转化+kmp/string.find())
- 字体arial不支持样式regular的解决方法
- MATLAB画图函数plot简单用法
- python不知道吃什么_一个人不知道吃什么?找出我做的一个人的食物
- Pillow的下载与安装
- UnityShader源码2017---学习笔记与自我拓展001
- 快速入门SSMS的使用
- 保证只要看一遍,新手也能写出来的超简单五子棋代码
- 怎么用计算机求数值等于log,怎么用计算器上的log?
- 腾讯云从良心云转变成“凉心云”,乱封禁服务器与域名怎么办?
- ruoyi cloud配置启动
- Gradle 1.12用户指南翻译——第五十章. 依赖管理
- babel es6转es5
- Android KK(4.4) 以太网和DHCP启动过程介绍
- CQUPT WEEKLY TRAINING (7)DIV2 解题报告
热门文章
- 简单测试服务器磁盘读写速度
- 计蒜客-蒜头君回家(bfs)
- linux无法识别m2固态,主板识别不出m.2固态硬盘怎么办|笔记本电脑无法识别m.2固态硬盘解决方法-系统城...
- 《时间的秩序》-- 卡洛.罗韦利
- java uuid去掉横线_UUID去横杠-的正确方式
- PCA主成分分析(原理+例子)
- Android 系统自带图片裁剪功能(适配7.0、8.0、对了还有小米手机)
- 保护你的眼睛——设置电脑屏幕颜色和ClearType字体
- 嵌入式面试(笔试)笔记1
- Jacobi(雅可比)迭代原理与matlab代码