dropoutMatrixMath function

Tensor<Matrix> dropoutMatrixMath(
  1. Tensor<Matrix> input,
  2. double rate,
  3. bool isTraining
)

Implementation

Tensor<Matrix> dropoutMatrixMath(Tensor<Matrix> input, double rate, bool isTraining) {
  if (isTraining == false || rate == 0.0) {
    return input;
  }

  double scale = 1.0 / (1.0 - rate);
  Random random = Random();
  int rows = input.shape[0];
  int cols = input.shape[1];

  Matrix outputValue = [];
  List<bool> flatMask = [];

  for (int r = 0; r < rows; r = r + 1) {
    Vector row = [];
    for (int c = 0; c < cols; c = c + 1) {
      if (random.nextDouble() < rate) {
        row.add(0.0);
        flatMask.add(false);
      } else {
        row.add(input.data[r * cols + c] * scale);
        flatMask.add(true);
      }
    }
    outputValue.add(row);
  }

  Tensor<Matrix> out = Tensor<Matrix>(outputValue);

  out.creator = Node(
    [input],
        () {
      int length = rows * cols;
      for (int i = 0; i < length; i = i + 1) {
        if (flatMask[i]) {
          input.grad[i] = input.grad[i] + out.grad[i] * scale;
        }
      }
    },
    opName: 'dropout_matrix',
    cost: rows * cols,
  );

  return out;
}