MCPcopy Create free account
hub / github.com/MegEngine/MegEngine / run_dropout

Function run_dropout

dnn/test/cuda/rng.cpp:352–413  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

350
351template <typename T>
352void run_dropout(Handle* handle) {
353 using ctype = typename DTypeTrait<T>::ctype;
354 auto run = [&](TensorShape shape, float drop_prob) {
355 auto fwd = handle->create_operator<DropoutForward>();
356 auto bwd = handle->create_operator<DropoutBackward>();
357 fwd->param().drop_prob = drop_prob;
358 bwd->param().drop_prob = drop_prob;
359 double scale = 1.0 / (1.0 - drop_prob);
360
361 TensorLayout inp_lay{shape, T()};
362 TensorLayout oup_lay{shape, T()};
363 TensorLayout mask_lay{{fwd->get_mask_size_in_bytes(inp_lay)}, dtype::Byte()};
364 TensorLayout doup_lay{shape, T()};
365 TensorLayout dinp_lay{shape, T()};
366 TensorLayout fwd_ws_lay{
367 {fwd->get_workspace_in_bytes(inp_lay, oup_lay, mask_lay)},
368 dtype::Byte()};
369 TensorLayout bwd_ws_lay{
370 {bwd->get_workspace_in_bytes(doup_lay, mask_lay, dinp_lay)},
371 dtype::Byte()};
372
373 SyncedTensor<ctype> inp(handle, inp_lay);
374 SyncedTensor<ctype> oup(handle, oup_lay);
375 SyncedTensor<DTypeTrait<dt_byte>::ctype> mask(handle, mask_lay);
376 SyncedTensor<ctype> doup(handle, doup_lay);
377 SyncedTensor<ctype> dinp(handle, dinp_lay);
378 SyncedTensor<DTypeTrait<dt_byte>::ctype> fwd_ws(handle, fwd_ws_lay);
379 SyncedTensor<DTypeTrait<dt_byte>::ctype> bwd_ws(handle, bwd_ws_lay);
380
381 for (size_t i = 0; i < inp.layout().total_nr_elems(); ++i) {
382 inp.ptr_mutable_host()[i] = 1;
383 doup.ptr_mutable_host()[i] = 1;
384 }
385
386 fwd->exec(
387 inp.tensornd_dev(), oup.tensornd_dev(), mask.tensornd_dev(),
388 {fwd_ws.ptr_mutable_dev(), fwd_ws.layout().total_nr_elems()});
389 size_t droped_cnt = 0;
390 for (size_t i = 0; i < inp.layout().total_nr_elems(); ++i) {
391 ASSERT_TRUE(
392 oup.ptr_host()[i] == 0 ||
393 oup.ptr_host()[i] == static_cast<ctype>(scale));
394 if (oup.ptr_host()[i] == 0) {
395 droped_cnt++;
396 }
397 }
398 float real_drop = droped_cnt * 1.0 / inp.layout().total_nr_elems();
399 ASSERT_LT(abs(drop_prob - real_drop), 1e-2);
400
401#if CUDNN_VERSION >= 7000
402 bwd->exec(
403 doup.tensornd_dev(), mask.tensornd_dev(), dinp.tensornd_dev(),
404 {bwd_ws.ptr_mutable_dev(), bwd_ws.layout().total_nr_elems()});
405 for (size_t i = 0; i < inp.layout().total_nr_elems(); ++i) {
406 ASSERT_TRUE(oup.ptr_host()[i] == dinp.ptr_host()[i]);
407 }
408#endif
409 };

Callers

nothing calls this directly

Calls 9

TClass · 0.85
absFunction · 0.50
runFunction · 0.50
paramMethod · 0.45
total_nr_elemsMethod · 0.45
layoutMethod · 0.45
execMethod · 0.45

Tested by

no test coverage detected