From 6bb4da79cd5e032f34b75cb208a54977b55ef07d Mon Sep 17 00:00:00 2001 From: Cathie So Date: Mon, 12 Dec 2022 02:53:50 +0800 Subject: [PATCH] Global...Pooling2D layers --- circuits/GlobalAveragePooling2D.circom | 24 +++ circuits/GlobalMaxPooling2D.circom | 21 ++ circuits/GlobalSumPooling2D.circom | 22 ++ models/globalAveragePooling2D.ipynb | 197 ++++++++++++++++++ models/globalAveragePooling2D_input.json | 1 + models/globalAveragePooling2D_output.json | 1 + models/globalMaxPooling2D.ipynb | 197 ++++++++++++++++++ models/globalMaxPooling2D_input.json | 1 + models/globalMaxPooling2D_output.json | 1 + test/GlobalAveragePooling2D.js | 44 ++++ test/GlobalMaxPooling2D.js | 35 ++++ .../GlobalAveragePooling2D_test.circom | 5 + test/circuits/GlobalMaxPooling2D_test.circom | 5 + 13 files changed, 554 insertions(+) create mode 100644 circuits/GlobalAveragePooling2D.circom create mode 100644 circuits/GlobalMaxPooling2D.circom create mode 100644 circuits/GlobalSumPooling2D.circom create mode 100644 models/globalAveragePooling2D.ipynb create mode 100644 models/globalAveragePooling2D_input.json create mode 100644 models/globalAveragePooling2D_output.json create mode 100644 models/globalMaxPooling2D.ipynb create mode 100644 models/globalMaxPooling2D_input.json create mode 100644 models/globalMaxPooling2D_output.json create mode 100644 test/GlobalAveragePooling2D.js create mode 100644 test/GlobalMaxPooling2D.js create mode 100644 test/circuits/GlobalAveragePooling2D_test.circom create mode 100644 test/circuits/GlobalMaxPooling2D_test.circom diff --git a/circuits/GlobalAveragePooling2D.circom b/circuits/GlobalAveragePooling2D.circom new file mode 100644 index 0000000..143d9d7 --- /dev/null +++ b/circuits/GlobalAveragePooling2D.circom @@ -0,0 +1,24 @@ +pragma circom 2.0.0; + +include "./GlobalSumPooling2D.circom"; + +// GlobalAveragePooling2D layer, might lose precision compared to GlobalSumPooling2D +// scaledInvPoolSize is required to perform fixed point division, it is calculated as 1/(nRows*nCols) then scaled up by multiples of 10 +template GlobalAveragePooling2D (nRows, nCols, nChannels, scaledInv) { + signal input in[nRows][nCols][nChannels]; + signal output out[nChannels]; + + component globalSumPooling2D = GlobalSumPooling2D (nRows, nCols, nChannels); + + for (var i=0; i (3,)", async () => { + const json = require("../models/globalAveragePooling2D_input.json"); + const OUTPUT = require("../models/globalAveragePooling2D_output.json"); + + const circuit = await wasm_tester(path.join(__dirname, "circuits", "GlobalAveragePooling2D_test.circom")); + + const INPUT = { + "in": json.in + } + + const witness = await circuit.calculateWitness(INPUT, true); + + assert(Fr.eq(Fr.e(witness[0]),Fr.e(1))); + + let ape = 0; + + for (var i=0; i (3,)", async () => { + const json = require("../models/globalMaxPooling2D_input.json"); + const OUTPUT = require("../models/globalMaxPooling2D_output.json"); + + const circuit = await wasm_tester(path.join(__dirname, "circuits", "GlobalMaxPooling2D_test.circom")); + + const INPUT = { + "in": json.in + } + + const witness = await circuit.calculateWitness(INPUT, true); + + assert(Fr.eq(Fr.e(witness[0]),Fr.e(1))); + + for (var i=0; i