forward ============== .. js:function:: MaxPoolingLayer.forward() 順伝播 ソース ^^^^^^ .. code-block:: js forward() { var lap = new Lap(this.forwardTime); var prev_layer = this.prevLayer; var prev_y_dt = prev_layer.y_.dt; // 出力先 var output_idx = 0; // バッチ内のデータに対し for (var batch_idx = 0; batch_idx < miniBatchSize; batch_idx++) { // すべての特徴マップに対し for (var channel_idx = 0; channel_idx < this.numChannels; channel_idx++) { // 出力の行に対し for (var r1 = 0; r1 < this.numRows; r1++) { var r0 = r1 * this.filterSize; // 出力の列に対し for (var c1 = 0; c1 < this.numCols; c1++) { var c0 = c1 * this.filterSize; if(inGradientCheck){ var r2 = this.maxRow[output_idx]; var c2 = this.maxCol[output_idx]; var prev_y_idx = batch_idx * prev_layer.unitSize + (channel_idx * prev_layer.numRows + (r0 + r2)) * prev_layer.numCols + (c0 + c2); this.y_.dt[output_idx] = prev_y_dt[prev_y_idx]; } else{ var max_val = -10000; var max_row, max_col; // フィルターの行に対し for (var r2 = 0; r2 < this.filterSize; r2++) { // フィルターの列に対し for (var c2 = 0; c2 < this.filterSize; c2++) { var prev_y_idx = batch_idx * prev_layer.unitSize + (channel_idx * prev_layer.numRows + (r0 + r2)) * prev_layer.numCols + (c0 + c2); var val = prev_y_dt[prev_y_idx]; if (max_val < val) { max_val = val; max_row = r2; max_col = c2; } } } this.y_.dt[output_idx] = max_val; this.maxRow[output_idx] = max_row; this.maxCol[output_idx] = max_col; } output_idx++; } } } } Assert(output_idx == this.y_.dt.length); lap.Time(); }