@@ -95,7 +95,8 @@ class LeakyReLUOp : public Operator {
95
95
}
96
96
switch (param_.act_type ) {
97
97
case leakyrelu::kLeakyReLU : {
98
- Assign (out, req[leakyrelu::kOut ], F<mshadow_op::xelu>(data, param_.slope ));
98
+ ScalarExp<DType> slope = ScalarExp<DType>(param_.slope );
99
+ Assign (out, req[leakyrelu::kOut ], F<mshadow_op::xelu>(data, slope));
99
100
break ;
100
101
}
101
102
case leakyrelu::kPReLU : {
@@ -106,18 +107,23 @@ class LeakyReLUOp : public Operator {
106
107
}
107
108
case leakyrelu::kRReLU : {
108
109
if (ctx.is_train ) {
109
- Random<xpu, DType>* prnd = ctx.requested [leakyrelu::kRandom ].get_random <xpu, DType>(s);
110
- mask = prnd->uniform (mask.shape_ );
111
- mask = mask * (param_.upper_bound - param_.lower_bound ) + param_.lower_bound ;
110
+ // TODO: Random doesn't work with Float16, this will lead to a reduced
111
+ // entropy for Float64.
112
+ Random<xpu>* prnd = ctx.requested [leakyrelu::kRandom ].get_random <xpu, real_t >(s);
113
+ mask = tcast<DType>(prnd->uniform (mask.shape_ ));
114
+ mask = mask * ScalarExp<DType>(param_.upper_bound - param_.lower_bound )
115
+ + ScalarExp<DType>(param_.lower_bound );
112
116
Assign (out, req[leakyrelu::kOut ], F<mshadow_op::xelu>(data, mask));
113
117
} else {
114
- const float slope = (param_.lower_bound + param_.upper_bound ) / 2 .0f ;
118
+ ScalarExp<DType> slope =
119
+ ScalarExp<DType>((param_.lower_bound + param_.upper_bound ) / 2 .0f );
115
120
Assign (out, req[leakyrelu::kOut ], F<mshadow_op::xelu>(data, slope));
116
121
}
117
122
break ;
118
123
}
119
124
case leakyrelu::kELU : {
120
- Assign (out, req[leakyrelu::kOut ], F<mshadow_op::elu>(data, param_.slope ));
125
+ ScalarExp<DType> slope = ScalarExp<DType>(param_.slope );
126
+ Assign (out, req[leakyrelu::kOut ], F<mshadow_op::elu>(data, slope));
121
127
break ;
122
128
}
123
129
default :
@@ -171,7 +177,8 @@ class LeakyReLUOp : public Operator {
171
177
}
172
178
switch (param_.act_type ) {
173
179
case leakyrelu::kLeakyReLU : {
174
- Assign (gdata, req[leakyrelu::kData ], F<mshadow_op::xelu_grad>(output, param_.slope ) * grad);
180
+ ScalarExp<DType> slope = ScalarExp<DType>(param_.slope );
181
+ Assign (gdata, req[leakyrelu::kData ], F<mshadow_op::xelu_grad>(output, slope) * grad);
175
182
break ;
176
183
}
177
184
case leakyrelu::kPReLU : {
@@ -186,7 +193,8 @@ class LeakyReLUOp : public Operator {
186
193
break ;
187
194
}
188
195
case leakyrelu::kELU : {
189
- Assign (gdata, req[leakyrelu::kData ], F<mshadow_op::elu_grad>(output, param_.slope ) * grad);
196
+ ScalarExp<DType> slope = ScalarExp<DType>(param_.slope );
197
+ Assign (gdata, req[leakyrelu::kData ], F<mshadow_op::elu_grad>(output, slope) * grad);
190
198
break ;
191
199
}
192
200
default :
0 commit comments