gpuDeltaWeight

ConvolutionalLayer.gpuDeltaWeight()

GPUによるδweightの計算

ソース

gpuDeltaWeight() {
    var prev_layer = this.prevLayer;

    var param_id = "ConvolutionalLayer-dabla-weight:" + this.filterSize + ":" + prev_layer.numChannels + ":" + this.numChannels + ":" + this.numRows + ":" + this.numCols + ":" + miniBatchSize;

    if (this.params[param_id] == undefined) {

        var shader_src = Shaders.ConvolutionalLayer_DeltaWeights
            .replace(/miniBatchSize/g, miniBatchSize.toString() + "u")
            .replace(/numChannels/g, this.numChannels.toString() + "u")
            .replace(/prevNumChannels/g, prev_layer.numChannels.toString() + "u")
            .replace(/numRows/g, this.numRows.toString() + "u")
            .replace(/numCols/g, this.numCols.toString() + "u")
            .replace(/filterSize/g, this.filterSize.toString() + "u");

        this.params[param_id]  = {
            id : param_id,
            vertexShader: shader_src,
            args : {
                "zero": new Float32Array(this.weight.dt.length),
                "prev_y": makeTextureInfo(WebGL2, "float", new ArrayView(miniBatchSize * prev_layer.numChannels, prev_layer.numRows, prev_layer.numCols)),
                "delta_z": makeTextureInfo(WebGL2, "float", new ArrayView(miniBatchSize * this.numChannels, this.numRows, this.numCols)),
                "delta_w": this.deltaWeight.dt
            }
        };
    }

    var param = this.params[param_id];

    param.args["prev_y"].value = prev_layer.y_.dt;
    param.args["delta_z"].value = this.deltaZ.dt;
    WebGL2.compute(param);
}