cpuDeltaX2 ==================== .. js:function:: ConvolutionalLayer.cpuDeltaX2() CPUによるδxの計算 ソース ^^^^^^ .. code-block:: js cpuDeltaX2() { var prev_layer = this.prevLayer; var delta_x = new Float32Array(miniBatchSize * prev_layer.unitSize); var prev_y_dt = prev_layer.y_.dt; var z_dt = this.z_.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++) { // 出力の列に対し for (var c1 = 0; c1 < this.numCols; c1++) { var sum = 0.0; var weight_idx = channel_idx * prev_layer.numChannels * this.filterSize * this.filterSize; var prev_y_base = batch_idx * prev_layer.numChannels * prev_layer.numRows * prev_layer.numCols; // 入力のチャネルに対し for(var prev_channel_idx = 0; prev_channel_idx < prev_layer.numChannels; prev_channel_idx++){ // フィルターの行に対し for (var r2 = 0; r2 < this.filterSize; r2++) { // フィルターの列に対し for (var c2 = 0; c2 < this.filterSize; c2++) { var prev_y_idx = prev_y_base + (r1 + r2) * prev_layer.numCols + (c1 + c2); sum += prev_y_dt[prev_y_idx] * this.weight.dt[weight_idx]; delta_x[prev_y_idx] += this.deltaZ.dt[output_idx] * this.weight.dt[weight_idx] weight_idx++; } } prev_y_base += prev_layer.numRows * prev_layer.numCols; } output_idx++; } } } } return delta_x; }