23 template<
typename AFloat>
24 void TCpu<AFloat>::DropoutForward(TCpuTensor<AFloat> & A,
27 AFloat dropoutProbability)
29 AFloat *data = A.GetData();
31 TRandom & dlRand = TCpu<AFloat>::GetRandomGenerator();
32 size_t seed = dlRand.Integer(4294967295);
34 size_t nElements = A.GetSize();
35 const size_t nSteps = TCpuMatrix<AFloat>::GetNWorkItems(nElements);
39 auto f = [&data, dropoutProbability, &nSteps, &nElements, &seed](UInt_t workerID)
41 TRandom rand(seed+workerID);
42 size_t iMax = std::min(workerID+nSteps,nElements);
43 for (
size_t i = workerID; i < iMax; ++i) {
44 AFloat r = rand.Uniform();
45 data[i] = (r > dropoutProbability) ? 0.0 : data[i] / dropoutProbability;
51 TCpuMatrix<AFloat>::GetThreadExecutor().Foreach(f, ROOT::TSeqI(0,nElements,nSteps));
53 for (
size_t i = 0; i < nElements; i+=nSteps)
60 template<
typename AFloat>
61 void TCpu<AFloat>::Dropout(TCpuMatrix<AFloat> &A,
62 AFloat dropoutProbability)
64 AFloat *data = A.GetRawDataPointer();
66 auto f = [&data, dropoutProbability](UInt_t workerID)
68 TRandom rand(time(
nullptr) + workerID);
69 AFloat r = rand.Uniform();
70 data[workerID] = (r > dropoutProbability) ? 0.0 : data[workerID] / dropoutProbability;
74 A.GetThreadExecutor().Map(f, ROOT::TSeqI(A.GetNoElements()));