SofmaxWithLoss.md 3.0 KB
Newer Older
S
sunyanfang01 已提交
1 2 3 4 5 6 7 8
## SofmaxWithLoss


### [SofmaxWithLoss](http://caffe.berkeleyvision.org/tutorial/layers/softmaxwithloss.html)
```
layer {
    name: "loss"
    type: "SoftmaxWithLoss"
S
SunAhong1993 已提交
9
    bottom: "logits"
S
sunyanfang01 已提交
10 11
    bottom: "label"
    top: "loss"
S
SunAhong1993 已提交
12 13 14
    softmax_param {
        axis: 1
    }
S
SunAhong1993 已提交
15
    loss_param {
S
sunyanfang01 已提交
16 17 18 19 20 21 22 23
	ignore_label: -1
	normalize: 0
	normalization: FULL
    }
}
```


S
SunAhong1993 已提交
24
### [paddle.fluid.layers.softmax_with_cross_entropy](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-169-softmax_with_cross_entropy)
S
sunyanfang01 已提交
25 26 27 28
```python
paddle.fluid.layers.softmax_with_cross_entropy(
    logits,
    label,
S
SunAhong1993 已提交
29 30
    soft_label=False,
    ignore_index=-100,
S
SunAhong1993 已提交
31
    numeric_stable_mode=True, 
S
SunAhong1993 已提交
32
    return_softmax=False
S
sunyanfang01 已提交
33 34 35 36
)
```  

### 功能差异
S
SunAhong1993 已提交
37 38 39
#### 输入数据
Caffe:输入数据(`x`)的维度最大是4维(`N*C*H*W`);                 
PaddlePaddle:输入数据(`x``label`)的维度只能是2维(`N*K`)。
J
Jason 已提交
40
#### 输入格式
J
Jason 已提交
41
Caffe: 采用硬标签方式输入,同时进行预处理操作(为了避免上溢出和下溢出,对输入的每个值减去batch中该位置上的最大值);  
J
Jason 已提交
42 43 44 45
PaddlePaddle:通过参数`soft_label`的设定,支持硬标签和软标签两种输入。  
> 计算softmax的loss时,根据每个样本是否被分配至多个类别中可以分为两类——硬标签和软标签  
> **硬标签:** 即one-hot label,每个样本仅分到一个类别中。在硬标签中,根据是否对未初始化的log概率进行预处理,又可以分为两类,预处理主要是完成对每个样本中的每个log概率减去该样本中的最大的log概率  
> **软标签:** 每个样本至少被分配到一个类别中
S
sunyanfang01 已提交
46
 
J
Jason 已提交
47
#### 输出结果
J
Jason 已提交
48 49 50 51 52 53 54 55
Caffe:输出是对所有样本的loss进行归一化后的结果,归一化的方式由`normalization``normalize`参数决定;
```
归一化形式:
1. 当`normalization`是FULL或0时,整个loss取和后除以batch的大小.
2. 当`normalization`是VALID或1时,整个loss取和后除以除`ignore_label`以外的样本数。
3. 当`normalization`是NONE时,则loss取和.
4. 当`normalization`未设置时,采用`normalize`的值进行判断,若`normalize==1`则归一化方式是VALID,若`normalize==0`则归一化方式是FULL。
```
S
sunyanfang01 已提交
56 57 58 59 60
PaddlePaddle:输出是每个样本的loss所组成的一个向量,同时如果将参数`return_softmax`设为True,则输出的是loss向量和softmax值组成的一个元组。

### 代码示例
```  
# Caffe示例:
S
SunAhong1993 已提交
61
# logits输入shape:(100,10)  
S
sunyanfang01 已提交
62 63 64 65 66
# label输入shape:(100,1)  
# 输出shape:()
layer {
    name: "loss"
    type: "SoftmaxWithLoss"
S
SunAhong1993 已提交
67
    bottom: "logits"
S
sunyanfang01 已提交
68 69
    bottom: "label"
    top: "loss"
S
SunAhong1993 已提交
70
    loss_param {
S
sunyanfang01 已提交
71 72 73 74 75 76 77 78 79 80 81
	ignore_label: -1
	normalize: 0
	normalization: FULL

    }
}
```

  
```python  
# PaddlePaddle示例:
S
SunAhong1993 已提交
82
# logits输入shape:(100,10)  
S
sunyanfang01 已提交
83 84
# label输入shape:(100,1)  
# 输出shape:(10,1)
S
SunAhong1993 已提交
85
softmaxwithloss = fluid.layers.softmax_with_cross_entropy(logits=logs, label=labels, 
S
SunAhong1993 已提交
86 87
							soft_label=False, ignore_index=-100, 
							numeric_stable_mode=True, 
J
Jason 已提交
88
							return_softmax=False)
S
sunyanfang01 已提交
89
```