tiny_cnn源码阅读(3)-layer_base和layer
2016-05-30 22:24
555 查看
概述
layer_base分析
layer分析
CNN_TASK_SIZE是个宏定义的常数,用来并行计算的;
第一个为前向传播函数,第二个为反向传播函数(一阶导数),第三个为反向传播(二阶导数)。
前向传播和方向传播可以并行计算,即不同数据由不同线程来计算,最终把数据合并;合并数据的函数是private函数,在调用
layer_base分析
layer分析
概述
神经网络有各个层组成,层是神经网络的基本组件。tiny_cnn中,实现功能的层有input_layer, convolutional_layer, average_pooling_layer, max_pooling_layer, dropout_layer, linear_layer, lrn_layer, fully_connected_layer, partial_connected_layer。这些layer都是从layer_base和layer中派生出来的。layer_base分析
layer_base是最底层的基类,它包含了层中需要的数据,先看一下数据类型protected: cnn_size_t in_size_;//输入大小 cnn_size_t out_size_;//输出大小 bool parallelize_;//是否并行 layer_base* next_;//layer的前后关系由next和prev标明,都是裸指针 layer_base* prev_; vec_t a_[CNN_TASK_SIZE]; // w * x,a_用来存放中间计算结果(w * x),最终结果f(w * x)存放在output_ vec_t output_[CNN_TASK_SIZE]; // last output of current layer, set by fprop vec_t prev_delta_[CNN_TASK_SIZE]; // last delta of previous layer, set by bprop vec_t W_; // weight vector,存储weight权重系数 vec_t b_; // bias vector,存储bias /** contribution to derivative of loss function with respect to weights of this layer, indexed by worker / thread */ vec_t dW_[CNN_TASK_SIZE];//存储weight的导数 /** contribution to derivative of loss function with respect to bias terms of this layer, indexed by worker / thread */ vec_t db_[CNN_TASK_SIZE];//存储bias的导数 vec_t Whessian_; // diagonal terms of hessian matrix,weight对应的hessian矩阵 vec_t bhessian_;//bias对应的hessian矩阵 vec_t prev_delta2_; // d^2E/da^2, std::shared_ptr<weight_init::function> weight_init_;//weight初始化类,weight_init::function是个类 std::shared_ptr<weight_init::function> bias_init_;//bias初始化
CNN_TASK_SIZE是个宏定义的常数,用来并行计算的;
vec_t是容器
typedef std::vector<float_t, aligned_allocator<float_t, 64>> vec_t;//以64bit对齐的,存放float_t类型的容器
weight_init_和
bias_init_是函数指针,用来初始化权重和偏置的。layer_base中很多纯虚函数,都是留给派生类实现,不同的派生类有不同实现。比较典型的有
virtual const vec_t& forward_propagation(const vec_t& in, size_t worker_index) = 0; virtual const vec_t& back_propagation(const vec_t& current_delta, size_t worker_index) = 0; virtual const vec_t& back_propagation_2nd(const vec_t& current_delta2) = 0;
第一个为前向传播函数,第二个为反向传播函数(一阶导数),第三个为反向传播(二阶导数)。
前向传播和方向传播可以并行计算,即不同数据由不同线程来计算,最终把数据合并;合并数据的函数是private函数,在调用
update_weight()函数时会调用此函数。
void merge(cnn_size_t worker_size, cnn_size_t batch_size) {//不同线程计算的梯度进行合并 for (cnn_size_t i = 1; i < worker_size; i++)//注意这里是从1开始计算,结果保存到0 vectorize::reduce<float_t>(&dW_[i][0], static_cast<cnn_size_t>(dW_[i].size()), &dW_[0][0]); for (cnn_size_t i = 1; i < worker_size; i++) vectorize::reduce<float_t>(&db_[i][0], static_cast<cnn_size_t>(db_[i].size()), &db_[0][0]); //合并后的梯度,除以batch_size进行归一化 std::transform(dW_[0].begin(), dW_[0].end(), dW_[0].begin(), [&](float_t x) { return x / batch_size; }); std::transform(db_[0].begin(), db_[0].end(), db_[0].begin(), [&](float_t x) { return x / batch_size; }); CNN_LOG_VECTOR(dW_[0], "[dW-merged]"); CNN_LOG_VECTOR(db_[0], "[db-merged]"); }
layer分析
layer派生子layer_base,这个派生只是添加了激活函数。template<typename Activation> class layer : public layer_base {//layer_base变为layer,多了激活函数Activation public: layer(cnn_size_t in_dim, cnn_size_t out_dim, size_t weight_dim, size_t bias_dim) : layer_base(in_dim, out_dim, weight_dim, bias_dim) {} activation::function& activation_function() override { return h_; } protected: Activation h_; };
相关文章推荐
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 用Python从零实现贝叶斯分类器的机器学习的教程
- My Machine Learning
- 机器学习---学习首页 3ff0
- Spark机器学习(一) -- Machine Learning Library (MLlib)
- bp神经网络及matlab实现
- CUDA搭建
- 反向传播(Backpropagation)算法的数学原理
- 深入理解CNN的细节
- 关于SVM的那点破事
- 也谈 机器学习到底有没有用 ?
- TensorFlow人工智能引擎入门教程之九 RNN/LSTM循环神经网络长短期记忆网络使用
- TensorFlow人工智能引擎入门教程之十 最强网络 RSNN深度残差网络 平均准确率96-99%
- TensorFlow人工智能引擎入门教程所有目录
- 在 Qt4 中使用 C++11
- 如何用70行代码实现深度神经网络算法
- 量子计算机编程原理简介 和 机器学习
- 近200篇机器学习&深度学习资料分享(含各种文档,视频,源码等)