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 關...