{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":3004,"databundleVersionId":861823,"sourceType":"competition"},{"sourceId":9243,"sourceType":"datasetVersion","datasetId":2243}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport matplotlib.pyplot as plt\nimport tensorflow as tf\nfrom IPython import display\nfrom tensorflow.keras.datasets.fashion_mnist import load_data","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-06-06T15:08:02.124754Z","iopub.execute_input":"2024-06-06T15:08:02.125935Z","iopub.status.idle":"2024-06-06T15:08:02.130558Z","shell.execute_reply.started":"2024-06-06T15:08:02.125902Z","shell.execute_reply":"2024-06-06T15:08:02.129418Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Preprocssing and Loading Data\n","metadata":{}},{"cell_type":"code","source":"def plot_images(images , n_cols = None):\n    display.clear_output(wait = False)\n    n_cols = n_cols or len(images)\n    n_rows = (len(images)-1)//n_cols+1\n    \n    if images.shape[-1] == 1:\n        images =np.squeeze(images , axis = -1)\n    plt.figure(figsize = (n_cols , n_rows))\n    \n    for index , image in enumerate(images):\n        plt.subplot(n_rows  ,n_cols , index+1)\n        plt.imshow(image )\n        plt.axis(\"off\")\n        ","metadata":{"execution":{"iopub.status.busy":"2024-06-06T15:08:03.405368Z","iopub.execute_input":"2024-06-06T15:08:03.406002Z","iopub.status.idle":"2024-06-06T15:08:03.412902Z","shell.execute_reply.started":"2024-06-06T15:08:03.405963Z","shell.execute_reply":"2024-06-06T15:08:03.411711Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"(train_images , train_labels) , (test_images , test_labels) = load_data()\n\nX_train = train_images.astype(np.float32)/255.0\n\ndataset = tf.data.Dataset.from_tensor_slices(X_train).shuffle(1000)\ndataset = dataset.batch(128 , drop_remainder= True).prefetch(1)","metadata":{"execution":{"iopub.status.busy":"2024-06-06T15:08:04.224252Z","iopub.execute_input":"2024-06-06T15:08:04.224856Z","iopub.status.idle":"2024-06-06T15:08:05.739845Z","shell.execute_reply.started":"2024-06-06T15:08:04.224825Z","shell.execute_reply":"2024-06-06T15:08:05.738796Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Build the Model","metadata":{}},{"cell_type":"code","source":"random_normal_dimensions = 32\n\ngenerator = tf.keras.Sequential([\n    tf.keras.layers.Input(shape = [random_normal_dimensions]) , \n    tf.keras.layers.Dense(64 , activation =\"selu\")  , \n    tf.keras.layers.Dense(128 , activation = \"selu\" ) , \n    tf.keras.layers.Dense(28 * 28 ,activation =\"sigmoid\") ,\n    tf.keras.layers.Reshape([28 ,28])\n])","metadata":{"execution":{"iopub.status.busy":"2024-06-06T15:08:05.939769Z","iopub.execute_input":"2024-06-06T15:08:05.940419Z","iopub.status.idle":"2024-06-06T15:08:06.012243Z","shell.execute_reply.started":"2024-06-06T15:08:05.940381Z","shell.execute_reply":"2024-06-06T15:08:06.011224Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"discriminator = tf.keras.Sequential([\n    tf.keras.layers.Input(shape = [28,28]) , \n    tf.keras.layers.Flatten() , \n    tf.keras.layers.Dense(128 , activation = \"selu\") , \n    tf.keras.layers.Dense(64 , activation = \"selu\") , \n    tf.keras.layers.Dense(1 , activation = \"sigmoid\")\n])\n","metadata":{"execution":{"iopub.status.busy":"2024-06-06T15:08:06.162725Z","iopub.execute_input":"2024-06-06T15:08:06.16356Z","iopub.status.idle":"2024-06-06T15:08:06.19861Z","shell.execute_reply.started":"2024-06-06T15:08:06.163525Z","shell.execute_reply":"2024-06-06T15:08:06.197634Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = tf.keras.Sequential([generator , discriminator])\n","metadata":{"execution":{"iopub.status.busy":"2024-06-06T15:08:06.50294Z","iopub.execute_input":"2024-06-06T15:08:06.503683Z","iopub.status.idle":"2024-06-06T15:08:06.508996Z","shell.execute_reply.started":"2024-06-06T15:08:06.503624Z","shell.execute_reply":"2024-06-06T15:08:06.507916Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Train the generator ","metadata":{}},{"cell_type":"markdown","source":"- **trains the discrimintor to distinguish between fake or real data**\n- **trains the generator to generate images that will trick the discriminator**","metadata":{}},{"cell_type":"code","source":"discriminator.compile(loss = \"binary_crossentropy\" , \n                    optimizer = \"rmsprop\")\nmodel.compile(loss = \"binary_crossentropy\" , optimizer = \"rmsprop\")\ndiscriminator.trainable = False \n","metadata":{"execution":{"iopub.status.busy":"2024-06-06T15:08:07.874805Z","iopub.execute_input":"2024-06-06T15:08:07.875795Z","iopub.status.idle":"2024-06-06T15:08:07.893916Z","shell.execute_reply.started":"2024-06-06T15:08:07.875753Z","shell.execute_reply":"2024-06-06T15:08:07.892912Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def train_generator(model , dataset , random_normal_dimensions , epochs = 50):\n    generator , discriminator = model.layers\n    \n    \n    for epoch in range(epochs):\n        print(f\"Epoch {epoch +1} : {epochs}\")\n        for real_images in dataset:\n            \n            batch_size = real_images.shape[0]\n            \n            noise = tf.random.normal(shape = [batch_size , random_normal_dimensions])\n            \n            fake_images = generator(noise)\n            \n            mixed_images = tf.concat([fake_images , real_images ] , axis = 0)\n            \n            discrimintor_labels = tf.constant([[0.]] * batch_size + [[1.]]* batch_size)\n            \n            discriminator.trainable = True\n            \n            \n            discriminator.train_on_batch(mixed_images , discrimintor_labels)\n            \n            noise = tf.random.normal(shape = [batch_size , random_normal_dimensions])\n            \n            generator_labels = tf.constant([[1.]] * batch_size)\n            discriminator.trainable = False\n            model.train_on_batch(noise , generator_labels )\n        plot_images(fake_images , 8)\n        plt.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-06-06T15:08:39.2516Z","iopub.execute_input":"2024-06-06T15:08:39.252248Z","iopub.status.idle":"2024-06-06T15:08:39.260421Z","shell.execute_reply.started":"2024-06-06T15:08:39.252208Z","shell.execute_reply":"2024-06-06T15:08:39.259419Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_generator(model , dataset , random_normal_dimensions , epochs = 20)","metadata":{"execution":{"iopub.status.busy":"2024-06-06T15:08:40.203058Z","iopub.execute_input":"2024-06-06T15:08:40.203436Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}