tiny_cnn源码阅读(3)-layer_base和layer

原创 2016年05月30日 22:24:30

概述

神经网络有各个层组成,层是神经网络的基本组件。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_;
};
版权声明:本文为博主原创文章,未经博主允许不得转载。

tiny_cnn源码阅读(4)-convolutional_layer

convolutional_layer是用来计算卷积的。 connection_table connecction_table是一个二维数组,(x,y)的值(true/false)表示x和y是否关...

C++卷积神经网络实例:tiny_cnn代码详解(10)——layer_base和layer类结构分析

在之前的博文中,我们已经队大部分层结构类都进行了分析,在这篇博文中我们准备针对最后两个,也是处于层结构类继承体系中最底层的两个基类layer_base和layer做一下简要分析。由于layer类只是对...

Caffe源码(四):base_conv_layer 分析

目录目录 简单介绍 主要函数 LayerSetUp 函数 Reshape 函数 forward_cpu_gemm 函数 forward_cpu_bias 函数 backward_cpu_gemm函数 ...

Caffe源码(四):base_conv_layer 分析

简单介绍 base_conv_layer.cpp 中定义了 BaseConvolutionLayer 类的一些成员函数,而BaseConvolutionLayer 是 ConvolutionLayer...

C++卷积神经网络实例:tiny_cnn代码详解(7)——fully_connected_layer层结构类分析

之前的博文中已经将卷积层、下采样层进行了分析,在这篇博文中我们对最后一个顶层层结构fully_connected_layer类(全连接层)进行分析:  一、卷积神经网路中的全连接层  在卷积神经网络中...

C++卷积神经网络实例:tiny_cnn代码详解(6)——average_pooling_layer层结构类分析

在之前的博文中我们着重分析了convolutional_layer类的代码结构,在这篇博文中分析对应的下采样层average_pooling_layer类:  一、下采样层的作用  下采样层的作用理论...

C++卷积神经网络实例:tiny_cnn代码详解(9)——partial_connected_layer层结构类分析(下)

在上一篇博文中我们着重分析了partial_connected_layer类的成员变量的结构,在这篇博文中我们将继续对partial_connected_layer类中的其他成员函数做一下简要介绍。 ...

C++卷积神经网络实例:tiny_cnn代码详解(5)——convolutional_layer类结构信息之其他成员函数

在上一篇博客中我们介绍了convolutional_layer类的基本结构及其成员变量、构造函数的相关信息,在这篇博文中我们对其中剩余的其他成员函数进行分析。首先把convolutional_laye...

C++卷积神经网络实例:tiny_cnn代码详解(8)——partial_connected_layer层结构类分析(上)

在之前的博文中我们已经将顶层的网络结构都介绍完毕,包括卷积层、下采样层、全连接层,在这篇博文中主要有两个任务,一是整体贯通一下卷积神经网络在对图像进行卷积处理的整个流程,二是继续我们的类分析,这次需要...

C++卷积神经网络实例:tiny_cnn代码详解(8)——partial_connected_layer层结构类分析(上)

在之前的博文中我们已经将顶层的网络结构都介绍完毕,包括卷积层、下采样层、全连接层,在这篇博文中主要有两个任务,一是整体贯通一下卷积神经网络在对图像进行卷积处理的整个流程,二是继续我们的类分析,这次需要...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:tiny_cnn源码阅读(3)-layer_base和layer
举报原因:
原因补充:

(最多只允许输入30个字)