caffe反向傳播計算 softmax

2021-08-14 09:00:22 字數 4283 閱讀 7974

loss_layers.hpp

#ifndef caffe_loss_layer_hpp_

#define caffe_loss_layer_hpp_

#include

#include "caffe/blob.hpp"

#include "caffe/layer.hpp"

#include "caffe/proto/caffe.pb.h"

namespace caffe

//層配置函式

virtual

void layersetup(

const

vector

*>& bottom, const

vector

*>& top);

//變形函式

virtual

void reshape(

const

vector

*>& bottom, const

vector

*>& top);

//接受兩個blob作為輸入

virtual

inline

int exactnumbottomblobs() const

//指導net為損失層自動非配單個輸出blob, 損失層會將計算結果儲存在這裡

virtual

inline

bool autotopblobs() const

//只有乙個輸出blob

virtual

inline

int exactnumtopblobs() const

//通常不能對標籤做反向傳播,所以忽略force_backward

virtual

inline

bool allowforcebackward(const

int bottom_index) const

};} // namespace caffe

#endif // caffe_loss_layer_hpp_

softmax_layer.hpp

#ifndef caffe_softmax_layer_hpp_

#define caffe_softmax_layer_hpp_

#include

#include "caffe/blob.hpp"

#include "caffe/layer.hpp"

#include "caffe/proto/caffe.pb.h"

namespace caffe

virtual

void reshape(const

vector

*>& bottom,

const

vector

*>& top);

virtual

inline

const

char* type() const //返回 類名 字串

virtual

inline

int exactnumbottomblobs() const //輸入輸出分別1個

virtual

inline

int exactnumtopblobs() const

protected:

virtual

void forward_cpu(const

vector

*>& bottom,

const

vector

*>& top);

virtual

void forward_gpu(const

vector

*>& bottom,

const

vector

*>& top);

virtual

void backward_cpu(const

vector

*>& top,

const

vector

& propagate_down, const

vector

*>& bottom);

virtual

void backward_gpu(const

vector

*>& top,

const

vector

& propagate_down, const

vector

*>& bottom);

int outer_num_;

int inner_num_;

int softmax_axis_;

blobsum_multiplier_; //利用blas計算求和

blobscale_;//臨時存放中間結果

};} // namespace caffe

#endif // caffe_softmax_layer_hpp_

softmax_layer.cpp

#include 

#include

#include "caffe/layers/softmax_layer.hpp"

#include "caffe/util/math_functions.hpp"

namespace caffe

//**********forward*************//

template

void softmaxlayer::forward_cpu(const

vector

*>& bottom,

const

vector

*>& top)

}// subtraction輸出緩衝區減去最大值

//求矩陣的差放入top_data中,公式:top_data = -1*sum_multiplier_*scale_data + top_data

//sum_multiplier_是channels*1的矩陣,每個元素值為1

//scale_data是1*(n*w)的矩陣

//top_data是channels*(n*w)的矩陣

//cblasnotrans:指不做轉置

caffe_cpu_gemm(cblasnotrans, cblasnotrans, channels, inner_num_,

1, -1., sum_multiplier_.cpu_data(), scale_data, 1., top_data);

// exponentiation

caffe_exp(dim, top_data, top_data);//對top_data的每個畫素點做冪運算c

// sum after exp

//對top_data轉置,每一列都加到一起,也就是對應畫素點的channels個值相加,放到scale_data中

caffe_cpu_gemv(cblastrans, channels, inner_num_, 1.,

top_data, sum_multiplier_.cpu_data(), 0., scale_data);

// division

//求在每乙個分類裡面的概率值

for (int j = 0; j < channels; j++)

}}template

void softmaxlayer::backward_cpu(const

vector

*>& top,

const

vector

& propagate_down,

const

vector

*>& bottom)

// subtraction減值

caffe_cpu_gemm(cblasnotrans, cblasnotrans, channels, inner_num_, 1,

-1., sum_multiplier_.cpu_data(), scale_data, 1., bottom_diff + i * dim);

} // elementwise multiplication 逐點相乘

caffe_mul(top[0]->count(), bottom_diff, top_data, bottom_diff);

}#ifdef cpu_only

stub_gpu(softmaxlayer);

#endif

instantiate_class(softmaxlayer);

} // namespace caffe

caffe 前向傳播和反向傳播

caffe學習筆記3從3.1開始主要翻譯一下caffe的官方文件,寫的非常好,忍不住要作一下。本篇翻譯來自caffe官網的 前向傳播和反向傳播是計算神經網路非常重要的部分。考慮乙個簡單的邏輯回歸分類問題 前向傳播 通過網路的輸入計算輸出結果的過程,在前向傳播中,caffe整合每一層的計算得到整個模型...

caffe 如何讓反向傳播不更新某些層

caffe程式中,有時候我們不需要更新某些層,那麼我們該怎麼做呢?假設共有5個卷積層,conv1,conv2,conv3,conv4,conv5 為了方便,假設只有這5個卷積層,沒有pool層與relu層 卷積層的定義為 layer bias filler 1.如果希望conv1,conv2,con...

反向傳播演算法

首先我們對數學符號做一些約定。我們首先考慮簡單的情況 前饋神經網路,如圖 所示。我們先假設任意兩層之間沒有權值共享。方向傳播演算法本質上就是梯度下降演算法,所以我們要對損失函式關於每個引數求導。設單個輸入例項 x 損失函式為 j x 那麼我們要求解 j wi 和 j bi i 1,2,n 對 j 關...