{"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":"nvidiaTeslaT4","dataSources":[{"sourceId":3004,"databundleVersionId":861823,"sourceType":"competition"}],"dockerImageVersionId":30699,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# Import necessary libraries\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport tensorflow as tf\nfrom tensorflow.keras.datasets import mnist, fashion_mnist\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.layers import Input, Dense, Flatten, Reshape, Conv2D, Conv2DTranspose\nimport warnings\nwarnings.filterwarnings('ignore')  \n\n\nimport os\n#for dirname, _, filenames in os.walk('/kaggle/input'):\n#    for filename in filenames:\n#        print(os.path.join(dirname, filename))","metadata":{"_kg_hide-input":true,"_kg_hide-output":true,"execution":{"iopub.status.busy":"2025-01-23T08:34:00.864046Z","iopub.execute_input":"2025-01-23T08:34:00.864355Z","iopub.status.idle":"2025-01-23T08:34:13.840224Z","shell.execute_reply.started":"2025-01-23T08:34:00.864318Z","shell.execute_reply":"2025-01-23T08:34:13.839232Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# AUTOENCODER USING ~\"UNET\"","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport tensorflow as tf\nfrom tensorflow.keras.datasets import mnist\n\n(train_images, train_labels), (test_images, test_labels) = mnist.load_data()\n\n# Normalize the image data to [0, 1] range\ntrain_images = train_images.astype('float32') / 255.0\ntest_images = test_images.astype('float32') / 255.0\n\n# Checking the shape of the dataset\nprint(\"Training data shape:\", train_images.shape)\nprint(\"Number of training samples:\", len(train_labels))\nprint(\"Test data shape:\", test_images.shape)\nprint(\"Number of test samples:\", len(test_labels))\n\n# Reshape training and test data to fit model input\ntrain_images = train_images.reshape(-1, 28, 28, 1)\ntest_images = test_images.reshape(-1, 28, 28, 1)","metadata":{"execution":{"iopub.status.busy":"2025-01-23T08:34:13.841460Z","iopub.execute_input":"2025-01-23T08:34:13.842131Z","iopub.status.idle":"2025-01-23T08:34:14.343729Z","shell.execute_reply.started":"2025-01-23T08:34:13.842106Z","shell.execute_reply":"2025-01-23T08:34:14.342756Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from tensorflow.keras.layers import Conv2D, MaxPooling2D, Conv2DTranspose, Input, concatenate\nfrom tensorflow.keras.models import Model\n\ndef encoder_block(filters, inputs):\n    print(f'Shape at beginning of layer: {inputs.shape}')\n    x = Conv2D(filters, kernel_size=(3,3), padding='same', strides=1, activation='relu')(inputs)\n    print(f'Shape after first cnv layer: {x.shape}')\n    s = Conv2D(filters, kernel_size=(3,3), padding='same', strides=1, activation='relu')(x)\n    print(f'Shape after second cnv layer: {s.shape}')\n    p = MaxPooling2D(pool_size=(2,2), padding='same')(s)\n    print(f'Shape after second pooling layer: {p.shape}')\n    return p\n\ndef baseline_layer(filters, inputs):\n    x = Conv2D(filters, kernel_size=(3,3), padding='same', strides=1, activation='relu')(inputs)\n    x = Conv2D(filters, kernel_size=(3,3), padding='same', strides=1, activation='relu')(x)\n    return x\n\ndef decoder_block(filters, inputs):\n    print(f'Shape at beginning of layer: {inputs.shape}')\n    x = Conv2DTranspose(filters, kernel_size=(2,2), padding='same', activation='relu', strides=2)(inputs)\n    print(f'Shape after first trn cnv layer: {x.shape}')\n    x = Conv2D(filters, kernel_size=(2,2), padding='same', activation='relu')(x)\n    print(f'Shape after first cnv layer: {x.shape}')\n    x = Conv2D(filters, kernel_size=(2,2), padding='same', activation='relu')(x)\n    print(f'Shape after second cnv layer: {x.shape}')\n    return x\n\ndef m():\n    inputs = Input(shape=(28,28,1))\n\n    p1 = encoder_block(64, inputs=inputs)\n    p2 = encoder_block(128, inputs=p1)\n\n    baseline = baseline_layer(256, p2)\n\n    d1 = decoder_block(128, baseline)\n    d2 = decoder_block(64, d1)\n\n    outputs = Conv2D(1, kernel_size=(1, 1), padding='same', activation='sigmoid')(d2)\n    print(f'last shape: {outputs.shape}')\n    model = Model(inputs=inputs, outputs=outputs, name='m')\n\n    return model","metadata":{"execution":{"iopub.status.busy":"2025-01-23T08:34:14.345613Z","iopub.execute_input":"2025-01-23T08:34:14.345891Z","iopub.status.idle":"2025-01-23T08:34:14.356240Z","shell.execute_reply.started":"2025-01-23T08:34:14.345869Z","shell.execute_reply":"2025-01-23T08:34:14.355204Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"strategy = tf.distribute.MirroredStrategy()\nwith strategy.scope():\n    model = m()\n    model.compile(loss='mse') # works bad with optimizer='adam'\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2025-01-23T08:34:14.357548Z","iopub.execute_input":"2025-01-23T08:34:14.357856Z","iopub.status.idle":"2025-01-23T08:34:16.041455Z","shell.execute_reply.started":"2025-01-23T08:34:14.357835Z","shell.execute_reply":"2025-01-23T08:34:16.040521Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#early_stopping = EarlyStopping(monitor = 'val_loss', patience = 3, restore_best_weights = True)\n#unet_history = unet.fit(train_data, validation_data=[val_data], epochs=50, callbacks = [early_stopping])\n\nbatch_size = 256\n\n#noisey_train_images = #modify a copy of train_images\ntrain_data = tf.data.Dataset.from_tensor_slices((train_images, train_images))\ntrain_data = train_data.batch(batch_size)\n\nval_data = tf.data.Dataset.from_tensor_slices((test_images, test_images))\nval_data = val_data.batch(batch_size)\n\nhistory = model.fit(train_data, validation_data=[val_data], epochs=5)","metadata":{"execution":{"iopub.status.busy":"2025-01-23T08:34:16.042892Z","iopub.execute_input":"2025-01-23T08:34:16.043308Z","iopub.status.idle":"2025-01-23T08:35:37.226218Z","shell.execute_reply.started":"2025-01-23T08:34:16.043274Z","shell.execute_reply":"2025-01-23T08:35:37.225263Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.plot(history.history['loss'])\nplt.plot(history.history['val_loss'])\nplt.title('Model loss')\nplt.ylabel('loss')\nplt.xlabel('epoch')\nplt.legend(['train', 'validation'], loc='upper left')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2025-01-23T08:35:37.227629Z","iopub.execute_input":"2025-01-23T08:35:37.227872Z","iopub.status.idle":"2025-01-23T08:35:37.525638Z","shell.execute_reply.started":"2025-01-23T08:35:37.227852Z","shell.execute_reply":"2025-01-23T08:35:37.524746Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_image = test_images[10]\ntest_image = np.expand_dims(test_image, axis=0)\npredicted_image = model(test_image)\npredicted_image.shape, type(np.array(predicted_image))","metadata":{"execution":{"iopub.status.busy":"2025-01-23T08:37:16.228467Z","iopub.execute_input":"2025-01-23T08:37:16.229096Z","iopub.status.idle":"2025-01-23T08:37:16.795928Z","shell.execute_reply.started":"2025-01-23T08:37:16.229069Z","shell.execute_reply":"2025-01-23T08:37:16.795089Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"fig, (ax1, ax2) = plt.subplots(1, 2)\n\nax1.imshow(test_image.reshape(28, 28), cmap='gray')\n\nax2.imshow(np.array(predicted_image).reshape(28, 28), cmap='gray')\n\nplt.tight_layout()  # Adjust spacing between subplots\nax1.set_title('Original')\nax2.set_title('Reconstructed')\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2025-01-23T08:37:55.180782Z","iopub.execute_input":"2025-01-23T08:37:55.181479Z","iopub.status.idle":"2025-01-23T08:37:55.505837Z","shell.execute_reply.started":"2025-01-23T08:37:55.181452Z","shell.execute_reply":"2025-01-23T08:37:55.504977Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Works almost perfectly with as little as 5 epochs, and reduces the size from 28^2=784 to 7^2=49","metadata":{}}]}