从零开始编写深度学习库(二)FullyconnecteLayer CPU编写
来源:互联网 发布:网络直销公司排名 编辑:程序博客网 时间:2024/05/16 18:42
从零开始编写深度学习库(二)FullyconnecteLayer CPU编写
博客:http://blog.csdn.net/hjimce
微博:黄锦池-hjimce qq:1393852684
一、C++实现
//y=x*w+bstatic void CFullyconnecteLayer::forward(const Eigen::MatrixXf &inputs, const Eigen::MatrixXf &weights, const Eigen::VectorXf &bais, Eigen::MatrixXf &outputs) {outputs = inputs*weights;outputs.rowwise() += bais.transpose();//每一行加上b}//y=x*w+b,反向求导后dw=x.T*dy,dx=dy*w.T,db=dystatic void CFullyconnecteLayer::backward(const Eigen::MatrixXf &inputs, const Eigen::MatrixXf &weights, const Eigen::VectorXf &bais,const Eigen::MatrixXf &d_outputs,Eigen::MatrixXf &d_inputs, Eigen::MatrixXf &d_weights, Eigen::VectorXf &d_bais) {d_weights = inputs.transpose()*d_outputs;d_inputs = d_outputs*weights.transpose();d_bais = d_outputs.colwise().sum();}static void CFullyconnecteLayer::test() {int batch_size = 4;int input_size = 3;int output_size = 2;Eigen::MatrixXf inputs(batch_size, input_size);inputs <<1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12;Eigen::MatrixXf weights(input_size, output_size);weights << 0.55, 0.88, 0.75, 1.1, 0.11, 0.002;Eigen::VectorXf bais(output_size);bais << 3, 2;Eigen::VectorXf label(batch_size);label << 1, 0, 1, 1;Eigen::MatrixXf outputs;//全连接层forward(inputs, weights, bais, outputs);Eigen::MatrixXf d_input, d_weights,d_output;float loss;CSoftmaxLayer::softmax_loss_forward_backward(outputs, label, d_output, loss);std::cout << loss << std::endl;Eigen::VectorXf d_bais;backward(inputs, weights, bais, d_output, d_input, d_weights, d_bais);std::cout << "outputs" << outputs << std::endl;std::cout << "d_output" << d_output << std::endl;std::cout << "d_input" << d_input << std::endl;std::cout << "d_weights" << d_weights << std::endl;std::cout << "d_bais"<<d_bais << std::endl;}二、tensorflow验证:
import tensorflow as tfinputs=tf.constant([[1,2,3],[4,5,6],[7,8,9],[10,11,12]],shape=(4,3),dtype=tf.float32)weights=tf.constant([0.55, 0.88, 0.75, 1.1, 0.11, 0.002],shape=(3,2),dtype=tf.float32)bais=tf.constant([3, 2],dtype=tf.float32)label=tf.constant([1,0,1,1])output=tf.matmul(inputs,weights)+baisone_hot=tf.one_hot(label,2)predicts=tf.nn.softmax(output)loss =-tf.reduce_mean(one_hot * tf.log(predicts))d_output,d_inputs,d_weights,d_bais=tf.gradients(loss,[output,inputs,weights,bais])with tf.Session() as sess:sess.run(tf.global_variables_initializer())loss_np,output_np,d_output_np, d_inputs_np, d_weights_np, d_bais_np=sess.run([loss,output,d_output, d_inputs,d_weights,d_bais])print (loss_np)print ('output',output_np)print('d_output', d_output_np)print ("d_inputs",d_inputs_np)print("d_weights", d_weights_np)print("d_bais", d_bais_np)
0 0
- 从零开始编写深度学习库(二)FullyconnecteLayer CPU编写
- 从零开始编写深度学习库(一)SoftmaxWithLoss CPU编写
- 从零开始编写深度学习库(五)ConvolutionLayer CPU编写
- 从零开始编写深度学习库(五)PoolingLayer 网络层CPU编写
- 从零开始编写深度学习库(三)ActivationLayer网络层CPU实现
- 从零开始编写深度学习库(四)Eigen::Tensor学习使用及代码重构
- 从零开始编写深度学习库(五)Eigen Tensor学习笔记2.0
- 从零开始编写图片加载库(二)之AsyncTask图片下载
- 从零开始深度学习搭建神经网络(二)
- 从零开始编写自己的JavaScript框架(二)
- 从零开始编写自己的JavaScript框架(二)
- 从零开始编写自己的JavaScript框架(二)
- 深度学习(七十)darknet 实现编写mobilenet源码
- 从零开始编写网络游戏--基础篇(1)
- 从零开始编写网络游戏--基础篇(1)
- 从零开始编写网络游戏--基础篇(1)
- PHPUnit从零开始(2):编写 PHPUnit 测试
- 从零开始 一步一步 编写 Bootloader
- gdb调试复习整理及coredump的设置与解析
- LINUX常用命令
- 项目启动时 org.drools.task报错
- 关于风动草的shader
- iTunesConnect-提交应用屏幕快照图片尺寸
- 从零开始编写深度学习库(二)FullyconnecteLayer CPU编写
- 初次使用ubuntu出现的部分问题与解决方案记录
- iterm设置直接登陆虚拟机(免登陆)
- angular学习心得
- sql必知必会学习笔记-二,检索,过滤数据
- 杂花生树(四十)
- JS之JQuery
- LINUX常用命令
- Unreal Engine 4 中的 UI 优化技巧