backpropagation

MaxPoolingLayer.backpropagation()

誤差逆伝播

ソース

backpropagation() {
    var lap = new Lap(this.backwardTime);

    var prev_layer = this.prevLayer;

    Assert(this.y_.dt.length == this.nextLayer.deltaX.dt.length);

    for(var i = 0; i < this.deltaX.dt.length; i++){
        this.deltaX.dt[i] = 0;
    }
    lap.Time();

    // 出力先
    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++) {
            var offset = batch_idx * prev_layer.unitSize + channel_idx * prev_layer.numRows * prev_layer.numCols;

            // 出力の行に対し
            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;

                    var delta = this.nextLayer.deltaX.dt[output_idx];
                    if(delta != 0){

                        var r2 = this.maxRow[output_idx] | 0;
                        var c2 = this.maxCol[output_idx] | 0;
                        var prev_y_idx = offset + (r0 + r2) * prev_layer.numCols + (c0 + c2);
                        this.deltaX.dt[prev_y_idx] += delta;
                    }

                    output_idx++;
                }
            }
        }
    }

    Assert(output_idx == this.nextLayer.deltaX.dt.length);
    lap.Time();
}