From 5639d36097193879b61029eef539208ef0c36d48 Mon Sep 17 00:00:00 2001
From: dante <45801863+alexander-camuto@users.noreply.github.com>
Date: Mon, 1 Apr 2024 20:54:20 +0100
Subject: [PATCH] chore: verify aggr wasm unit test (#760)
---
.github/workflows/pypi.yml | 14 +-
.github/workflows/rust.yml | 12 +-
.gitignore | 3 +-
Cargo.lock | 4 +-
Cargo.toml | 8 +-
examples/notebooks/keras_simple_demo.ipynb | 1 +
examples/notebooks/mnist_gan.ipynb | 11 +-
.../notebooks/mnist_gan_proof_splitting.ipynb | 725 +++-
examples/notebooks/mnist_vae.ipynb | 2 +
examples/notebooks/random_forest.ipynb | 33 +-
.../notebooks/tictactoe_autoencoder.ipynb | 16 +-
.../tictactoe_binary_classification.ipynb | 7 +-
requirements.txt | 24 +-
src/graph/mod.rs | 8 +-
src/pfsys/evm/aggregation_kzg.rs | 23 +
src/wasm.rs | 10 +-
tests/py_integration_tests.rs | 49 +-
tests/wasm.rs | 21 +-
tests/wasm/kzg1.srs | Bin 0 -> 516 bytes
tests/wasm/proof_aggr.json | 3075 +++++++++++++++++
tests/wasm/vk_aggr.key | Bin 0 -> 1287 bytes
21 files changed, 3929 insertions(+), 117 deletions(-)
create mode 100644 tests/wasm/kzg1.srs
create mode 100644 tests/wasm/proof_aggr.json
create mode 100644 tests/wasm/vk_aggr.key
diff --git a/.github/workflows/pypi.yml b/.github/workflows/pypi.yml
index 737e6e826..a942044b2 100644
--- a/.github/workflows/pypi.yml
+++ b/.github/workflows/pypi.yml
@@ -25,7 +25,7 @@ jobs:
- uses: actions/checkout@v4
- uses: actions/setup-python@v4
with:
- python-version: 3.7
+ python-version: 3.12
architecture: x64
- name: Set Cargo.toml version to match github tag
@@ -70,7 +70,7 @@ jobs:
- uses: actions/checkout@v4
- uses: actions/setup-python@v4
with:
- python-version: 3.7
+ python-version: 3.12
architecture: ${{ matrix.target }}
- name: Set Cargo.toml version to match github tag
@@ -115,7 +115,7 @@ jobs:
- uses: actions/checkout@v4
- uses: actions/setup-python@v4
with:
- python-version: 3.7
+ python-version: 3.12
architecture: x64
- name: Set Cargo.toml version to match github tag
@@ -176,7 +176,7 @@ jobs:
# - uses: actions/checkout@v4
# - uses: actions/setup-python@v4
# with:
- # python-version: 3.7
+ # python-version: 3.12
# - name: Install cross-compilation tools for aarch64
# if: matrix.target == 'aarch64'
@@ -228,7 +228,7 @@ jobs:
- uses: actions/checkout@v4
- uses: actions/setup-python@v4
with:
- python-version: 3.7
+ python-version: 3.12
architecture: x64
- name: Set Cargo.toml version to match github tag
@@ -263,7 +263,7 @@ jobs:
apk add py3-pip
pip3 install -U pip
python3 -m venv .venv
- source .venv/bin/activate
+ source .venv/bin/activate
pip3 install ezkl --no-index --find-links /io/dist/ --force-reinstall
python3 -c "import ezkl"
@@ -287,7 +287,7 @@ jobs:
- uses: actions/checkout@v4
- uses: actions/setup-python@v4
with:
- python-version: 3.7
+ python-version: 3.12
- name: Set Cargo.toml version to match github tag
shell: bash
diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml
index 5d835f368..4024ff884 100644
--- a/.github/workflows/rust.yml
+++ b/.github/workflows/rust.yml
@@ -557,12 +557,14 @@ jobs:
- uses: actions/checkout@v4
- uses: actions/setup-python@v4
with:
- python-version: "3.7"
+ python-version: "3.12"
- uses: actions-rs/toolchain@v1
with:
toolchain: nightly-2024-02-06
override: true
components: rustfmt, clippy
+ - name: Install cmake
+ run: sudo apt-get install -y cmake
- name: Install solc
run: (hash svm 2>/dev/null || cargo install svm-rs) && svm install 0.8.20 && solc --version
- name: Setup Virtual Env and Install python dependencies
@@ -581,7 +583,7 @@ jobs:
- uses: actions/checkout@v4
- uses: actions/setup-python@v4
with:
- python-version: "3.7"
+ python-version: "3.12"
- uses: actions-rs/toolchain@v1
with:
toolchain: nightly-2024-02-06
@@ -612,7 +614,7 @@ jobs:
- uses: actions/checkout@v4
- uses: actions/setup-python@v4
with:
- python-version: "3.10"
+ python-version: "3.11"
- uses: actions-rs/toolchain@v1
with:
toolchain: nightly-2024-02-06
@@ -630,6 +632,8 @@ jobs:
run: python -m venv .env; source .env/bin/activate; pip install -r requirements.txt;
- name: Build python ezkl
run: source .env/bin/activate; unset CONDA_PREFIX; maturin develop --features python-bindings --release
+ - name: Tictactoe tutorials
+ run: source .env/bin/activate; cargo nextest run py_tests::tests::tictactoe_
# - name: authenticate-kaggle-cli
# shell: bash
# env:
@@ -645,7 +649,5 @@ jobs:
run: source .env/bin/activate; cargo nextest run py_tests::tests::voice_
- name: NBEATS tutorial
run: source .env/bin/activate; cargo nextest run py_tests::tests::nbeats_
- - name: Tictactoe tutorials
- run: source .env/bin/activate; cargo nextest run py_tests::tests::tictactoe_
# - name: Postgres tutorials
# run: source .env/bin/activate; cargo nextest run py_tests::tests::postgres_ --test-threads 1
diff --git a/.gitignore b/.gitignore
index 052a7bf5a..9635e363c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -48,4 +48,5 @@ node_modules
/dist
timingData.json
!tests/wasm/pk.key
-!tests/wasm/vk.key
\ No newline at end of file
+!tests/wasm/vk.key
+!tests/wasm/vk_aggr.key
\ No newline at end of file
diff --git a/Cargo.lock b/Cargo.lock
index 9fb9c6136..2c0cbe685 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -4601,9 +4601,9 @@ dependencies = [
[[package]]
name = "serde-wasm-bindgen"
-version = "0.4.5"
+version = "0.6.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3b4c031cd0d9014307d82b8abf653c0290fbdaeb4c02d00c63cf52f728628bf"
+checksum = "8302e169f0eddcc139c70f139d19d6467353af16f9fce27e8c30158036a1e16b"
dependencies = [
"js-sys",
"serde",
diff --git a/Cargo.toml b/Cargo.toml
index ec0738ecb..d4b0cf247 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -95,10 +95,10 @@ getrandom = { version = "0.2.8", features = ["js"] }
instant = { version = "0.1", features = ["wasm-bindgen", "inaccurate"] }
[target.'cfg(all(target_arch = "wasm32", target_os = "unknown"))'.dependencies]
-wasm-bindgen-rayon = { version = "1.0", optional = true }
-wasm-bindgen-test = "0.3.34"
-serde-wasm-bindgen = "0.4"
-wasm-bindgen = { version = "0.2.81", features = ["serde-serialize"] }
+wasm-bindgen-rayon = { version = "1.2.1", optional = true }
+wasm-bindgen-test = "0.3.42"
+serde-wasm-bindgen = "0.6.5"
+wasm-bindgen = { version = "0.2.92", features = ["serde-serialize"] }
console_error_panic_hook = "0.1.7"
wasm-bindgen-console-logger = "0.1.1"
diff --git a/examples/notebooks/keras_simple_demo.ipynb b/examples/notebooks/keras_simple_demo.ipynb
index e302e2626..356a9f4f6 100644
--- a/examples/notebooks/keras_simple_demo.ipynb
+++ b/examples/notebooks/keras_simple_demo.ipynb
@@ -67,6 +67,7 @@
"model.add(Dense(128, activation='relu'))\n",
"model.add(Dropout(0.5))\n",
"model.add(Dense(10, activation='softmax'))\n",
+ "model.output_names=['output']\n",
"\n",
"\n",
"# Train the model as you like here (skipped for brevity)\n",
diff --git a/examples/notebooks/mnist_gan.ipynb b/examples/notebooks/mnist_gan.ipynb
index 13d089b75..69deaa76f 100644
--- a/examples/notebooks/mnist_gan.ipynb
+++ b/examples/notebooks/mnist_gan.ipynb
@@ -38,7 +38,7 @@
"import logging\n",
"\n",
"import tensorflow as tf\n",
- "from tensorflow.keras.optimizers.legacy import Adam\n",
+ "from tensorflow.keras.optimizers import Adam\n",
"from tensorflow.keras.layers import *\n",
"from tensorflow.keras.models import Model\n",
"from tensorflow.keras.datasets import mnist\n",
@@ -71,9 +71,11 @@
},
"outputs": [],
"source": [
- "opt = Adam()\n",
"ZDIM = 100\n",
"\n",
+ "opt = Adam()\n",
+ "\n",
+ "\n",
"# discriminator\n",
"# 0 if it's fake, 1 if it's real\n",
"x = in1 = Input((28,28))\n",
@@ -114,8 +116,11 @@
"\n",
"gm = Model(in1, x)\n",
"gm.compile('adam', 'mse')\n",
+ "gm.output_names=['output']\n",
"gm.summary()\n",
"\n",
+ "opt = Adam()\n",
+ "\n",
"# GAN\n",
"dm.trainable = False\n",
"x = dm(gm.output)\n",
@@ -415,7 +420,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.9.15"
+ "version": "3.12.2"
}
},
"nbformat": 4,
diff --git a/examples/notebooks/mnist_gan_proof_splitting.ipynb b/examples/notebooks/mnist_gan_proof_splitting.ipynb
index 217058673..5f150b45b 100644
--- a/examples/notebooks/mnist_gan_proof_splitting.ipynb
+++ b/examples/notebooks/mnist_gan_proof_splitting.ipynb
@@ -23,7 +23,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
@@ -50,7 +50,7 @@
"import logging\n",
"\n",
"import tensorflow as tf\n",
- "from tensorflow.keras.optimizers.legacy import Adam\n",
+ "from tensorflow.keras.optimizers import Adam\n",
"from tensorflow.keras.layers import *\n",
"from tensorflow.keras.models import Model\n",
"from tensorflow.keras.datasets import mnist\n",
@@ -65,7 +65,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
@@ -77,9 +77,258 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 3,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
Model: \"functional_1\"\n",
+ "
\n"
+ ],
+ "text/plain": [
+ "\u001b[1mModel: \"functional_1\"\u001b[0m\n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
+ "┃ Layer (type) ┃ Output Shape ┃ Param # ┃\n",
+ "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
+ "│ input_layer (InputLayer) │ (None, 28, 28) │ 0 │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ reshape (Reshape) │ (None, 28, 28, 1) │ 0 │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ conv2d (Conv2D) │ (None, 14, 14, 64) │ 1,664 │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ batch_normalization │ (None, 14, 14, 64) │ 256 │\n",
+ "│ (BatchNormalization) │ │ │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ elu (ELU) │ (None, 14, 14, 64) │ 0 │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ conv2d_1 (Conv2D) │ (None, 7, 7, 128) │ 204,928 │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ batch_normalization_1 │ (None, 7, 7, 128) │ 512 │\n",
+ "│ (BatchNormalization) │ │ │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ elu_1 (ELU) │ (None, 7, 7, 128) │ 0 │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ flatten (Flatten) │ (None, 6272) │ 0 │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ dense (Dense) │ (None, 128) │ 802,944 │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ batch_normalization_2 │ (None, 128) │ 512 │\n",
+ "│ (BatchNormalization) │ │ │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ elu_2 (ELU) │ (None, 128) │ 0 │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ dense_1 (Dense) │ (None, 1) │ 129 │\n",
+ "└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
+ "
\n"
+ ],
+ "text/plain": [
+ "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
+ "┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n",
+ "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
+ "│ input_layer (\u001b[38;5;33mInputLayer\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m28\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ reshape (\u001b[38;5;33mReshape\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m1\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ conv2d (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m14\u001b[0m, \u001b[38;5;34m14\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m1,664\u001b[0m │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ batch_normalization │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m14\u001b[0m, \u001b[38;5;34m14\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m256\u001b[0m │\n",
+ "│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ elu (\u001b[38;5;33mELU\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m14\u001b[0m, \u001b[38;5;34m14\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ conv2d_1 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m7\u001b[0m, \u001b[38;5;34m7\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m204,928\u001b[0m │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ batch_normalization_1 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m7\u001b[0m, \u001b[38;5;34m7\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m512\u001b[0m │\n",
+ "│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ elu_1 (\u001b[38;5;33mELU\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m7\u001b[0m, \u001b[38;5;34m7\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ flatten (\u001b[38;5;33mFlatten\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m6272\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ dense (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m802,944\u001b[0m │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ batch_normalization_2 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m512\u001b[0m │\n",
+ "│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ elu_2 (\u001b[38;5;33mELU\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ dense_1 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1\u001b[0m) │ \u001b[38;5;34m129\u001b[0m │\n",
+ "└─────────────────────────────────┴────────────────────────┴───────────────┘\n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ " Total params: 1,010,945 (3.86 MB)\n",
+ "
\n"
+ ],
+ "text/plain": [
+ "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m1,010,945\u001b[0m (3.86 MB)\n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ " Trainable params: 1,010,305 (3.85 MB)\n",
+ "
\n"
+ ],
+ "text/plain": [
+ "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m1,010,305\u001b[0m (3.85 MB)\n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ " Non-trainable params: 640 (2.50 KB)\n",
+ "
\n"
+ ],
+ "text/plain": [
+ "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m640\u001b[0m (2.50 KB)\n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "Model: \"functional_3\"\n",
+ "
\n"
+ ],
+ "text/plain": [
+ "\u001b[1mModel: \"functional_3\"\u001b[0m\n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
+ "┃ Layer (type) ┃ Output Shape ┃ Param # ┃\n",
+ "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
+ "│ input_layer_1 (InputLayer) │ (None, 100) │ 0 │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ dense_2 (Dense) │ (None, 3136) │ 316,736 │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ batch_normalization_3 │ (None, 3136) │ 12,544 │\n",
+ "│ (BatchNormalization) │ │ │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ elu_3 (ELU) │ (None, 3136) │ 0 │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ reshape_1 (Reshape) │ (None, 7, 7, 64) │ 0 │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ conv2d_transpose │ (None, 14, 14, 128) │ 204,928 │\n",
+ "│ (Conv2DTranspose) │ │ │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ batch_normalization_4 │ (None, 14, 14, 128) │ 512 │\n",
+ "│ (BatchNormalization) │ │ │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ elu_4 (ELU) │ (None, 14, 14, 128) │ 0 │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ conv2d_transpose_1 │ (None, 28, 28, 1) │ 3,201 │\n",
+ "│ (Conv2DTranspose) │ │ │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ activation (Activation) │ (None, 28, 28, 1) │ 0 │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ reshape_2 (Reshape) │ (None, 28, 28) │ 0 │\n",
+ "└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
+ "
\n"
+ ],
+ "text/plain": [
+ "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
+ "┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n",
+ "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
+ "│ input_layer_1 (\u001b[38;5;33mInputLayer\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m100\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ dense_2 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m3136\u001b[0m) │ \u001b[38;5;34m316,736\u001b[0m │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ batch_normalization_3 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m3136\u001b[0m) │ \u001b[38;5;34m12,544\u001b[0m │\n",
+ "│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ elu_3 (\u001b[38;5;33mELU\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m3136\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ reshape_1 (\u001b[38;5;33mReshape\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m7\u001b[0m, \u001b[38;5;34m7\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ conv2d_transpose │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m14\u001b[0m, \u001b[38;5;34m14\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m204,928\u001b[0m │\n",
+ "│ (\u001b[38;5;33mConv2DTranspose\u001b[0m) │ │ │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ batch_normalization_4 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m14\u001b[0m, \u001b[38;5;34m14\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m512\u001b[0m │\n",
+ "│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ elu_4 (\u001b[38;5;33mELU\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m14\u001b[0m, \u001b[38;5;34m14\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ conv2d_transpose_1 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m1\u001b[0m) │ \u001b[38;5;34m3,201\u001b[0m │\n",
+ "│ (\u001b[38;5;33mConv2DTranspose\u001b[0m) │ │ │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ activation (\u001b[38;5;33mActivation\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m1\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
+ "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
+ "│ reshape_2 (\u001b[38;5;33mReshape\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m28\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
+ "└─────────────────────────────────┴────────────────────────┴───────────────┘\n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ " Total params: 537,921 (2.05 MB)\n",
+ "
\n"
+ ],
+ "text/plain": [
+ "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m537,921\u001b[0m (2.05 MB)\n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ " Trainable params: 531,393 (2.03 MB)\n",
+ "
\n"
+ ],
+ "text/plain": [
+ "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m531,393\u001b[0m (2.03 MB)\n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ " Non-trainable params: 6,528 (25.50 KB)\n",
+ "
\n"
+ ],
+ "text/plain": [
+ "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m6,528\u001b[0m (25.50 KB)\n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
"source": [
"opt = Adam()\n",
"ZDIM = 100\n",
@@ -126,6 +375,8 @@
"gm.compile('adam', 'mse')\n",
"gm.summary()\n",
"\n",
+ "opt = Adam()\n",
+ "\n",
"# GAN\n",
"dm.trainable = False\n",
"x = dm(gm.output)\n",
@@ -137,9 +388,28 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 4,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " 0: dloss: 0.8063 gloss: 0.6461\n",
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 42ms/step\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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cu+998o999wjDz74oPzGb/zGK9UFQn6qWGnNiYi86U1vUnvf3/7t36rvueYIuXgeeOABufPOO+WRRx6Re++9V2q1mtx6661SKBTO51npTNloNOTnf/7npVqtysMPPyx//dd/LV/4whfkk5/85KXoEiGvei5m3YmIfOADH1D73Wc+85nz33HdkRel9Srk+uuvb915553n041GozU4ONi6++67L2GrCPnZ4FOf+lRr165d7neLi4utSCTS+vKXv3z+s8OHD7dEpLV///5XqIWE/GwhIq2vfOUr59PNZrPV39/f+k//6T+d/2xxcbEVi8Vaf/u3f9tqtVqt5557riUirUcfffR8nm984xutQCDQOnfu3CvWdkJ+GsE112q1WnfccUfrbW9724tewzVHyI/H9PR0S0RaDzzwQKvVurgz5T//8z+3gsFga3Jy8nyev/zLv2xlMplWpVJ5ZTtAyE8huO5arVbr9a9/fes//If/8KLXcN2RF+NV98vBarUqjz/+uOzbt+/8Z8FgUPbt2yf79++/hC0j5GeH48ePy+DgoGzcuFHe8573yMjIiIiIPP7441Kr1dT62759u6xdu5brj5CXidOnT8vk5KRaZ9lsVvbs2XN+ne3fv1/a29vl2muvPZ9n3759EgwG5cCBA694mwn5WeA73/mO9Pb2yrZt2+SDH/ygzM3Nnf+Oa46QH49cLiciIp2dnSJycWfK/fv3yxVXXCF9fX3n89x2222Sz+fl0KFDr2DrCfnpBNfdD/gf/+N/SHd3t+zcuVM+9rGPSbFYPP8d1x15McKXugHI7OysNBoNZawiIn19fXLkyJFL1CpCfnbYs2ePfOELX5Bt27bJxMSEfPrTn5bXve51cvDgQZmcnJRoNCrt7e3qmr6+PpmcnLw0DSbkZ4wfrCVvn/vBd5OTk9Lb26u+D4fD0tnZybVIyI/Am970JnnHO94hGzZskJMnT8rHP/5xefOb3yz79++XUCjENUfIj0Gz2ZQPf/jD8trXvlZ27twpInJRZ8rJyUl3L/zBd4SQF8dbdyIiv/qrvyrr1q2TwcFBeeaZZ+T3fu/35OjRo/IP//APIsJ1R16cV93DQULIT5Y3v/nN5/9/5ZVXyp49e2TdunXy93//95JIJC5hywghhJCfDL/yK79y/v9XXHGFXHnllbJp0yb5zne+I7fccsslbBkhP/3ceeedcvDgQaVhTQj5yfJi6+6FWrlXXHGFDAwMyC233CInT56UTZs2vdLNJD9FvOpeK+7u7pZQKGQiWU1NTUl/f/8lahUhP7u0t7fL1q1b5cSJE9Lf3y/ValUWFxdVHq4/Ql4+frCWLrTP9ff3myBc9Xpd5ufnuRYJeRnYuHGjdHd3y4kTJ0SEa46QH5W77rpL7rnnHvn2t78tQ0ND5z+/mDNlf3+/uxf+4DtCiM+LrTuPPXv2iIio/Y7rjni86h4ORqNR2b17t9x3333nP2s2m3LffffJ3r17L2HLCPnZZHl5WU6ePCkDAwOye/duiUQiav0dPXpURkZGuP4IeZnYsGGD9Pf3q3WWz+flwIED59fZ3r17ZXFxUR5//PHzee6//35pNpvnD3mEkB+dsbExmZubk4GBARHhmiPkpdJqteSuu+6Sr3zlK3L//ffLhg0b1PcXc6bcu3evPPvss+rB/L333iuZTEZ27NjxynSEkJ8iVlp3Hk899ZSIiNrvuO6Ix6vyteKPfvSjcscdd8i1114r119/vXz2s5+VQqEg73vf+y510wj5qee3f/u35a1vfausW7dOxsfH5VOf+pSEQiF597vfLdlsVt7//vfLRz/6Uens7JRMJiMf+tCHZO/evXLDDTdc6qYT8lPD8vLy+b/QijwfhOSpp56Szs5OWbt2rXz4wx+WP/7jP5YtW7bIhg0b5BOf+IQMDg7K7bffLiIil112mbzpTW+SD3zgA/L5z39earWa3HXXXfIrv/IrMjg4eIl6Rcirlwutuc7OTvn0pz8t73znO6W/v19Onjwpv/u7vyubN2+W2267TUS45gh5qdx5553yxS9+Ub72ta9JOp0+r1WWzWYlkUhc1Jny1ltvlR07dsiv/dqvyWc+8xmZnJyUP/zDP5Q777xTYrHYpeweIa9KVlp3J0+elC9+8Yvylre8Rbq6uuSZZ56Rj3zkI3LTTTfJlVdeKSJcd+QCXOpwyS/Gf/7P/7m1du3aVjQabV1//fWtRx555FI3iZCfCd71rne1BgYGWtFotLVmzZrWu971rtaJEyfOf18qlVq/+Zu/2ero6Gglk8nW29/+9tbExMQlbDEhP318+9vfbomI+XfHHXe0Wq1Wq9lstj7xiU+0+vr6WrFYrHXLLbe0jh49qsqYm5trvfvd726lUqlWJpNpve9972stLS1dgt4Q8urnQmuuWCy2br311lZPT08rEom01q1b1/rABz7QmpycVGVwzRFy8XjrTURaf/VXf3U+z8WcKc+cOdN685vf3EokEq3u7u7Wb/3Wb7Vqtdor3BtCfjpYad2NjIy0brrpplZnZ2crFou1Nm/e3Pqd3/mdVi6XU+Vw3RGPQKvVar2SDyMJIYQQQgghhBBCCCGvDl51moOEEEIIIYQQQgghhJBXBj4cJIQQQgghhBBCCCFklcKHg4QQQgghhBBCCCGErFL4cJAQQgghhBBCCCGEkFUKHw4SQgghhBBCCCGEELJK4cNBQgghhBBCCCGEEEJWKXw4SAghhBBCCCGEEELIKoUPBwkhhBBCCCGEEEIIWaXw4SAhhBBCCCGEEEIIIasUPhwkhBBCCCGEEEIIIWSVwoeDhBBCCCGEEEIIIYSsUvhwkBBCCCGEEEIIIYSQVcr/H9NxerZQIBl2AAAAAElFTkSuQmCC",
+ "text/plain": [
+ "