{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.10","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-05-16T22:38:19.445438Z","iopub.execute_input":"2023-05-16T22:38:19.445858Z","iopub.status.idle":"2023-05-16T22:38:19.454278Z","shell.execute_reply.started":"2023-05-16T22:38:19.445826Z","shell.execute_reply":"2023-05-16T22:38:19.453071Z"},"trusted":true},"execution_count":75,"outputs":[{"name":"stdout","text":"/kaggle/input/digit-recognizer/sample_submission.csv\n/kaggle/input/digit-recognizer/train.csv\n/kaggle/input/digit-recognizer/test.csv\n","output_type":"stream"}]},{"cell_type":"markdown","source":"# GAN: Generative adversarial network\n\nNetworks:\n* Generator: Tries to generate something like a digit\n* Discriminator: Tries to tell apart real from generated digits\n\nSteps:\n* The generator generates based on a random input, producing an image\n* The discriminator assigns a value from 0 to 1 of how likely it thinks this is a real image\n* The loss is determined by how far off the discriminator is\n","metadata":{}},{"cell_type":"markdown","source":"# Step 1: Data","metadata":{}},{"cell_type":"code","source":"import csv\nimport numpy as np","metadata":{"execution":{"iopub.status.busy":"2023-05-16T21:59:17.042583Z","iopub.execute_input":"2023-05-16T21:59:17.043123Z","iopub.status.idle":"2023-05-16T21:59:17.047282Z","shell.execute_reply.started":"2023-05-16T21:59:17.043091Z","shell.execute_reply":"2023-05-16T21:59:17.046466Z"},"trusted":true},"execution_count":2,"outputs":[]},{"cell_type":"code","source":"\n\ntrain_x = []\ntrain_y = []\n\nwith open('/kaggle/input/digit-recognizer/train.csv', newline='') as csvfile:\n    csvreader = csv.reader(csvfile)\n    firstline = next(csvreader)\n    for line in csvreader:\n        train_y.append(int(line[0]))\n        line = line[1:]\n        line = [int(numeral) for numeral in line]\n        train_x.append(line)\n        \n        \n    \ntrain_x = np.array(train_x)\ntrain_y = np.array(train_y)\n","metadata":{"execution":{"iopub.status.busy":"2023-05-16T22:32:50.383117Z","iopub.execute_input":"2023-05-16T22:32:50.383618Z","iopub.status.idle":"2023-05-16T22:33:00.179097Z","shell.execute_reply.started":"2023-05-16T22:32:50.383581Z","shell.execute_reply":"2023-05-16T22:33:00.177931Z"},"trusted":true},"execution_count":64,"outputs":[]},{"cell_type":"code","source":"train_x = train_x.reshape((-1, 784))\ntrain_x.shape","metadata":{"execution":{"iopub.status.busy":"2023-05-16T21:59:27.043985Z","iopub.execute_input":"2023-05-16T21:59:27.044232Z","iopub.status.idle":"2023-05-16T21:59:27.053289Z","shell.execute_reply.started":"2023-05-16T21:59:27.044211Z","shell.execute_reply":"2023-05-16T21:59:27.051449Z"},"trusted":true},"execution_count":4,"outputs":[{"execution_count":4,"output_type":"execute_result","data":{"text/plain":"(42000, 784)"},"metadata":{}}]},{"cell_type":"code","source":"train_y = train_y.reshape((-1, 1))\ntrain_y.shape","metadata":{"execution":{"iopub.status.busy":"2023-05-16T21:59:27.055007Z","iopub.execute_input":"2023-05-16T21:59:27.055299Z","iopub.status.idle":"2023-05-16T21:59:27.067484Z","shell.execute_reply.started":"2023-05-16T21:59:27.055274Z","shell.execute_reply":"2023-05-16T21:59:27.066092Z"},"trusted":true},"execution_count":5,"outputs":[{"execution_count":5,"output_type":"execute_result","data":{"text/plain":"(42000, 1)"},"metadata":{}}]},{"cell_type":"code","source":"from matplotlib import pyplot as plt\nplt.imshow(train_x[0].reshape(28, 28))\nplt.axis(\"off\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-05-16T22:00:12.240518Z","iopub.execute_input":"2023-05-16T22:00:12.240852Z","iopub.status.idle":"2023-05-16T22:00:12.304618Z","shell.execute_reply.started":"2023-05-16T22:00:12.24083Z","shell.execute_reply":"2023-05-16T22:00:12.303625Z"},"trusted":true},"execution_count":8,"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 640x480 with 1 Axes>","image/png":"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"},"metadata":{}}]},{"cell_type":"code","source":"from tensorflow import keras\nfrom tensorflow.keras import layers\n\nN = 10  # Number of dense layers\n\nmodel = keras.Sequential()\nfor i in range(N):\n    model.add(layers.Dense(100, activation=\"relu\"))\n\nmodel.add(layers.Flatten())\nmodel.add(layers.Dense(10))\nmodel(train_x[:3])\nmodel.summary()\n","metadata":{"execution":{"iopub.status.busy":"2023-05-16T21:59:28.356884Z","iopub.status.idle":"2023-05-16T21:59:28.357249Z","shell.execute_reply.started":"2023-05-16T21:59:28.357078Z","shell.execute_reply":"2023-05-16T21:59:28.357095Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(\n    optimizer=keras.optimizers.RMSprop(),  # Optimizer\n    # Loss function to minimize\n    loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n    # List of metrics to monitor\n    metrics=[keras.metrics.SparseCategoricalAccuracy()],\n)","metadata":{"execution":{"iopub.status.busy":"2023-05-16T21:59:28.361689Z","iopub.status.idle":"2023-05-16T21:59:28.362147Z","shell.execute_reply.started":"2023-05-16T21:59:28.361944Z","shell.execute_reply":"2023-05-16T21:59:28.361962Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.fit(train_x, train_y, epochs=5,batch_size=5)","metadata":{"execution":{"iopub.status.busy":"2023-05-16T21:59:28.363694Z","iopub.status.idle":"2023-05-16T21:59:28.364154Z","shell.execute_reply.started":"2023-05-16T21:59:28.36394Z","shell.execute_reply":"2023-05-16T21:59:28.36396Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Starting GAN\n1. Generator","metadata":{}},{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras import layers","metadata":{"execution":{"iopub.status.busy":"2023-05-16T22:00:36.621639Z","iopub.execute_input":"2023-05-16T22:00:36.622024Z","iopub.status.idle":"2023-05-16T22:00:44.505635Z","shell.execute_reply.started":"2023-05-16T22:00:36.621996Z","shell.execute_reply":"2023-05-16T22:00:44.504704Z"},"trusted":true},"execution_count":10,"outputs":[{"name":"stderr","text":"/opt/conda/lib/python3.10/site-packages/scipy/__init__.py:146: UserWarning: A NumPy version >=1.16.5 and <1.23.0 is required for this version of SciPy (detected version 1.23.5\n  warnings.warn(f\"A NumPy version >={np_minversion} and <{np_maxversion}\"\n","output_type":"stream"}]},{"cell_type":"code","source":"class Generator(tf.keras.Model):\n\n    def __init__(self):\n        super().__init__()\n        self.seq = keras.Sequential([layers.Dense(100, activation=\"relu\"),\n                               layers.Dense(200, activation=\"relu\"),\n                               layers.Dense(400, activation=\"relu\"),\n                               layers.Dense(784)])\n\n        \n    def call(self, x):\n  \n\n        # upsample\n        return self.seq(x)\n    \n    \n    ","metadata":{"execution":{"iopub.status.busy":"2023-05-16T22:00:51.06543Z","iopub.execute_input":"2023-05-16T22:00:51.066147Z","iopub.status.idle":"2023-05-16T22:00:51.073702Z","shell.execute_reply.started":"2023-05-16T22:00:51.066115Z","shell.execute_reply":"2023-05-16T22:00:51.071919Z"},"trusted":true},"execution_count":11,"outputs":[]},{"cell_type":"code","source":"gen_model = Generator()","metadata":{"execution":{"iopub.status.busy":"2023-05-16T22:00:54.325782Z","iopub.execute_input":"2023-05-16T22:00:54.326145Z","iopub.status.idle":"2023-05-16T22:00:54.430864Z","shell.execute_reply.started":"2023-05-16T22:00:54.326119Z","shell.execute_reply":"2023-05-16T22:00:54.42985Z"},"trusted":true},"execution_count":12,"outputs":[]},{"cell_type":"code","source":"x =  np.random.random_sample((3, 10)) - 0.5\ngen_model(x)\ngen_model.summary()","metadata":{"execution":{"iopub.status.busy":"2023-05-16T22:00:55.602516Z","iopub.execute_input":"2023-05-16T22:00:55.602879Z","iopub.status.idle":"2023-05-16T22:00:55.817565Z","shell.execute_reply.started":"2023-05-16T22:00:55.602848Z","shell.execute_reply":"2023-05-16T22:00:55.816232Z"},"trusted":true},"execution_count":13,"outputs":[{"name":"stdout","text":"Model: \"generator\"\n_________________________________________________________________\n Layer (type)                Output Shape              Param #   \n=================================================================\n sequential (Sequential)     (3, 784)                  416084    \n                                                                 \n=================================================================\nTotal params: 416,084\nTrainable params: 416,084\nNon-trainable params: 0\n_________________________________________________________________\n","output_type":"stream"}]},{"cell_type":"code","source":"x.shape","metadata":{"execution":{"iopub.status.busy":"2023-05-16T22:00:58.088414Z","iopub.execute_input":"2023-05-16T22:00:58.088761Z","iopub.status.idle":"2023-05-16T22:00:58.096064Z","shell.execute_reply.started":"2023-05-16T22:00:58.088737Z","shell.execute_reply":"2023-05-16T22:00:58.094428Z"},"trusted":true},"execution_count":14,"outputs":[{"execution_count":14,"output_type":"execute_result","data":{"text/plain":"(3, 10)"},"metadata":{}}]},{"cell_type":"code","source":"output = gen_model(x)","metadata":{"execution":{"iopub.status.busy":"2023-05-16T22:01:02.198453Z","iopub.execute_input":"2023-05-16T22:01:02.198818Z","iopub.status.idle":"2023-05-16T22:01:02.208645Z","shell.execute_reply.started":"2023-05-16T22:01:02.198792Z","shell.execute_reply":"2023-05-16T22:01:02.207446Z"},"trusted":true},"execution_count":16,"outputs":[]},{"cell_type":"code","source":"output.shape","metadata":{"execution":{"iopub.status.busy":"2023-05-16T21:59:28.373735Z","iopub.status.idle":"2023-05-16T21:59:28.374201Z","shell.execute_reply.started":"2023-05-16T21:59:28.373996Z","shell.execute_reply":"2023-05-16T21:59:28.374014Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from matplotlib import pyplot as plt\nplt.imshow(output[0].numpy().reshape(28, 28))\nplt.axis(\"off\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-05-16T22:01:03.918252Z","iopub.execute_input":"2023-05-16T22:01:03.919706Z","iopub.status.idle":"2023-05-16T22:01:03.986387Z","shell.execute_reply.started":"2023-05-16T22:01:03.919648Z","shell.execute_reply":"2023-05-16T22:01:03.985353Z"},"trusted":true},"execution_count":17,"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 640x480 with 1 Axes>","image/png":"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"},"metadata":{}}]},{"cell_type":"markdown","source":"## Discriminator Classifier","metadata":{}},{"cell_type":"code","source":"from tensorflow import keras\nfrom tensorflow.keras import layers\n\nN = 10  # Number of dense layers\n\nmodel = keras.Sequential()\nfor i in range(N):\n    model.add(layers.Dense(100, activation=\"relu\"))\n\nmodel.add(layers.Flatten())\nmodel.add(layers.Dense(2, activation=\"softmax\"))\nprint(train_x.shape)\nprint(train_x[:3].shape)\nmodel(train_x[:3])\nmodel.summary()\n","metadata":{"execution":{"iopub.status.busy":"2023-05-16T22:41:07.768429Z","iopub.execute_input":"2023-05-16T22:41:07.769145Z","iopub.status.idle":"2023-05-16T22:41:07.966863Z","shell.execute_reply.started":"2023-05-16T22:41:07.769074Z","shell.execute_reply":"2023-05-16T22:41:07.964682Z"},"trusted":true},"execution_count":86,"outputs":[{"name":"stdout","text":"(42000, 784)\n(3, 784)\nModel: \"sequential_8\"\n_________________________________________________________________\n Layer (type)                Output Shape              Param #   \n=================================================================\n dense_81 (Dense)            (3, 100)                  78500     \n                                                                 \n dense_82 (Dense)            (3, 100)                  10100     \n                                                                 \n dense_83 (Dense)            (3, 100)                  10100     \n                                                                 \n dense_84 (Dense)            (3, 100)                  10100     \n                                                                 \n dense_85 (Dense)            (3, 100)                  10100     \n                                                                 \n dense_86 (Dense)            (3, 100)                  10100     \n                                                                 \n dense_87 (Dense)            (3, 100)                  10100     \n                                                                 \n dense_88 (Dense)            (3, 100)                  10100     \n                                                                 \n dense_89 (Dense)            (3, 100)                  10100     \n                                                                 \n dense_90 (Dense)            (3, 100)                  10100     \n                                                                 \n flatten_7 (Flatten)         (3, 100)                  0         \n                                                                 \n dense_91 (Dense)            (3, 2)                    202       \n                                                                 \n=================================================================\nTotal params: 169,602\nTrainable params: 169,602\nNon-trainable params: 0\n_________________________________________________________________\n","output_type":"stream"}]},{"cell_type":"markdown","source":"# 0 is fake\n# 1 is real","metadata":{}},{"cell_type":"code","source":"FAKE_DATA_SIZE = 42000\nREAL_DATA_SIZE = 42000\nIMAGE_LENGTH = 784\ntrain_y_disc_real = np.ones((1, FAKE_DATA_SIZE))\ntrain_y_disc_fake = np.zeros((1, REAL_DATA_SIZE))\n        ","metadata":{"execution":{"iopub.status.busy":"2023-05-16T22:27:11.137196Z","iopub.execute_input":"2023-05-16T22:27:11.137602Z","iopub.status.idle":"2023-05-16T22:27:11.144889Z","shell.execute_reply.started":"2023-05-16T22:27:11.137572Z","shell.execute_reply":"2023-05-16T22:27:11.143213Z"},"trusted":true},"execution_count":58,"outputs":[]},{"cell_type":"code","source":"print(FAKE_DATA_SIZE)\nx =  np.random.random_sample((FAKE_DATA_SIZE, 10)) - 0.5\ntrain_x_disc_fake = gen_model(x)\ngen_model.summary()\n\nprint(train_y_disc_real.shape)\nprint(train_y_disc_fake.shape)\ntrain_y_disc = np.concatenate((train_y_disc_real, train_y_disc_fake), axis=1).flatten()\nprint(train_y_disc)","metadata":{"execution":{"iopub.status.busy":"2023-05-16T22:38:06.015991Z","iopub.execute_input":"2023-05-16T22:38:06.016537Z","iopub.status.idle":"2023-05-16T22:38:06.34658Z","shell.execute_reply.started":"2023-05-16T22:38:06.016492Z","shell.execute_reply":"2023-05-16T22:38:06.345461Z"},"trusted":true},"execution_count":73,"outputs":[{"name":"stdout","text":"42000\nModel: \"generator\"\n_________________________________________________________________\n Layer (type)                Output Shape              Param #   \n=================================================================\n sequential (Sequential)     (None, 784)               416084    \n                                                                 \n=================================================================\nTotal params: 416,084\nTrainable params: 416,084\nNon-trainable params: 0\n_________________________________________________________________\n(1, 42000)\n(1, 42000)\n[1. 1. 1. ... 0. 0. 0.]\n","output_type":"stream"}]},{"cell_type":"code","source":"# (REAL_SIZE + FAKE_SIZE, IMAGE_LENGTH)\ntrain_x_disc_real = train_x\ntrain_x_disc = np.concatenate((train_x_disc_real, train_x_disc_fake))\n\ndef unison_shuffled_copies(a, b):\n    print(len(a))\n    print(len(b))\n    assert len(a) == len(b)\n    p = np.random.permutation(len(a))\n    return a[p], b[p]\n\ntrain_x_disc_shuffled, train_y_disc_shuffled = unison_shuffled_copies(train_x_disc, train_y_disc)\nprint(train_x_disc_shuffled.shape)\nprint(train_y_disc_shuffled.shape)","metadata":{"execution":{"iopub.status.busy":"2023-05-16T22:39:29.998825Z","iopub.execute_input":"2023-05-16T22:39:29.999279Z","iopub.status.idle":"2023-05-16T22:39:30.243021Z","shell.execute_reply.started":"2023-05-16T22:39:29.999243Z","shell.execute_reply":"2023-05-16T22:39:30.242089Z"},"trusted":true},"execution_count":83,"outputs":[{"name":"stdout","text":"84000\n84000\n(84000, 784)\n(84000,)\n","output_type":"stream"}]},{"cell_type":"code","source":"model.compile(\n    optimizer=keras.optimizers.RMSprop(),  # Optimizer\n    # Loss function to minimize\n    loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n    # List of metrics to monitor\n    metrics=[keras.metrics.SparseCategoricalAccuracy()],\n)","metadata":{"execution":{"iopub.status.busy":"2023-05-16T22:41:20.10216Z","iopub.execute_input":"2023-05-16T22:41:20.103706Z","iopub.status.idle":"2023-05-16T22:41:20.124382Z","shell.execute_reply.started":"2023-05-16T22:41:20.103646Z","shell.execute_reply":"2023-05-16T22:41:20.12323Z"},"trusted":true},"execution_count":88,"outputs":[]},{"cell_type":"code","source":"model.fit(train_x_disc_shuffled, train_y_disc_shuffled, epochs=5,batch_size=5)","metadata":{"execution":{"iopub.status.busy":"2023-05-16T22:41:23.064775Z","iopub.execute_input":"2023-05-16T22:41:23.065181Z"},"trusted":true},"execution_count":null,"outputs":[{"name":"stdout","text":"Epoch 1/5\n  955/16800 [>.............................] - ETA: 1:03 - loss: 0.0177 - sparse_categorical_accuracy: 0.9992","output_type":"stream"}]}]}