{"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":2154267,"sourceType":"datasetVersion","datasetId":923624}],"dockerImageVersionId":30664,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport tensorflow as tf\nfrom tqdm import tqdm\nimport os\nimport cv2\nfrom tensorflow.keras import layers, Sequential, datasets, Model\nimport warnings\nwarnings.filterwarnings('ignore')\n# مازال يشكوا الصد حتي كرهت نفسه صاد الحروف و دالها","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-03-19T22:22:49.946160Z","iopub.execute_input":"2024-03-19T22:22:49.946964Z","iopub.status.idle":"2024-03-19T22:22:49.952360Z","shell.execute_reply.started":"2024-03-19T22:22:49.946922Z","shell.execute_reply":"2024-03-19T22:22:49.951432Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dir_path = r\"/kaggle/input/another-anime-face-dataset/animefaces256cleaner\"\ndef load_images(folder_path, img_size = (128, 128)):\n    X = []\n    limit = 10000\n    for img_name in tqdm(os.listdir(folder_path)[:limit]):\n        img_path = os.path.join(folder_path, img_name)\n        img_array = cv2.imread(img_path)\n        img_array = cv2.resize(img_array, img_size)\n        img_array = img_array[:,:,::-1]\n        X.append(img_array / 255.0)\n        if len(X) >= limit:\n            break\n    return np.array(X)\n\nimg_size = 64\nX_train = load_images(dir_path, (img_size, img_size))\nX_train.shape","metadata":{"execution":{"iopub.status.busy":"2024-03-19T22:24:42.134285Z","iopub.execute_input":"2024-03-19T22:24:42.134654Z","iopub.status.idle":"2024-03-19T22:26:04.108779Z","shell.execute_reply.started":"2024-03-19T22:24:42.134624Z","shell.execute_reply":"2024-03-19T22:26:04.107847Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"learning_rate = 0.0003\nKL_coef = 0.01\nlatent_dim = 64\nbatch_size = 100","metadata":{"execution":{"iopub.status.busy":"2024-03-19T23:00:45.155922Z","iopub.execute_input":"2024-03-19T23:00:45.156824Z","iopub.status.idle":"2024-03-19T23:00:45.161235Z","shell.execute_reply.started":"2024-03-19T23:00:45.156777Z","shell.execute_reply":"2024-03-19T23:00:45.160131Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def show_images(images, title = None):\n    plt.figure(figsize = (6, 6))\n    for i in range(12):\n        plt.subplot(3, 4, i + 1)\n        plt.imshow(images[i])\n        plt.title(title)\n        plt.xticks([])\n        plt.yticks([])\n    plt.tight_layout()\n    plt.show()\nshow_images(X_train)","metadata":{"execution":{"iopub.status.busy":"2024-03-19T23:00:47.188835Z","iopub.execute_input":"2024-03-19T23:00:47.189515Z","iopub.status.idle":"2024-03-19T23:00:47.970436Z","shell.execute_reply.started":"2024-03-19T23:00:47.189481Z","shell.execute_reply":"2024-03-19T23:00:47.969434Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class VariationalAutoencoder(Model):\n    def __init__(self, latent_dim = latent_dim):\n        super().__init__()\n        self.encoder = Sequential([\n            layers.Conv2D(32, kernel_size = (3, 3), strides = 1, padding = 'same'),\n            layers.BatchNormalization(),\n            layers.LeakyReLU(0.2),\n            \n            layers.Conv2D(64, kernel_size = (3, 3), strides = 2, padding = 'same'),\n            layers.BatchNormalization(),\n            layers.LeakyReLU(0.2),\n            \n            layers.Conv2D(128, kernel_size = (3, 3), strides = 1, padding = 'same'),\n            layers.BatchNormalization(),\n            layers.LeakyReLU(0.2),\n            \n            layers.Conv2D(256, kernel_size = (3, 3), strides = 2, padding = 'same'),\n            layers.BatchNormalization(),\n            layers.LeakyReLU(0.2),\n            \n            layers.Flatten(),\n            layers.Dense(2048),\n            layers.BatchNormalization(),\n            layers.LeakyReLU(0.2),\n        ])\n        self.get_mean = layers.Dense(latent_dim)\n        self.get_logvar = layers.Dense(latent_dim)\n        self.decoder = Sequential([\n            \n            layers.Dense(2048),\n            layers.BatchNormalization(),\n            layers.LeakyReLU(0.2),\n            \n            layers.Dense(256 * 16 * 16),\n            layers.BatchNormalization(),\n            layers.LeakyReLU(0.2),\n            \n            layers.Reshape((16, 16, 256)),\n            layers.Conv2DTranspose(128, kernel_size = (3, 3), strides = 2, padding = 'same'),\n            layers.BatchNormalization(),\n            layers.LeakyReLU(0.2),\n            \n            layers.Conv2DTranspose(128, kernel_size = (3, 3), strides = 1, padding = 'same'),\n            layers.BatchNormalization(),\n            layers.LeakyReLU(0.2),\n            \n            layers.Conv2DTranspose(64, kernel_size = (3, 3), strides = 2, padding = 'same'),\n            layers.BatchNormalization(),\n            layers.LeakyReLU(0.2),\n            \n            layers.Conv2DTranspose(32, kernel_size = (3, 3), strides = 1, padding = 'same'),\n            layers.BatchNormalization(),\n            layers.LeakyReLU(0.2),\n            \n            layers.Conv2DTranspose(3, kernel_size = (3, 3), strides = 1, padding = 'same', activation = 'sigmoid'),\n        ])\n        \n    def vae_loss(self, reconstructions, inputs, z_mean, z_log_var):\n        reconstruction_loss = tf.reduce_mean(tf.square(reconstructions - inputs))\n        kl_loss = -KL_coef * tf.reduce_mean(1 + z_log_var - tf.square(z_mean) - tf.exp(z_log_var))\n        total_loss = reconstruction_loss + kl_loss\n        return kl_loss, reconstruction_loss, total_loss\n        \n    def encode(self, x):\n        return self.encoder(x)\n        \n    def decode(self, x):\n        return self.decoder(x)\n        \n    def sample(self, mean, logvar):\n        eps = tf.random.normal(tf.shape(mean))\n        return mean + tf.exp(logvar) * eps\n    \n    def call(self, x):\n        encoded = self.encode(x)\n        mean, logvar = self.get_mean(encoded), self.get_logvar(encoded)\n        latent_space = self.sample(mean, logvar)\n        decoded = self.decode(latent_space)\n        return mean, logvar, decoded\n    \n    def train_step(self, batch):\n        with tf.GradientTape() as tape:\n            mean, logvar, y_pred = self.call(batch)\n            kl_loss, reconstruction_loss, loss = self.vae_loss(y_pred, batch, mean, logvar)\n        gradients = tape.gradient(loss, self.trainable_variables)\n        self.optimizer.apply_gradients(zip(gradients, self.trainable_variables))\n        \n        return {'kl_loss' : kl_loss, 'reconstruction_loss': reconstruction_loss, 'total_loss' : loss}","metadata":{"execution":{"iopub.status.busy":"2024-03-20T00:21:56.101865Z","iopub.execute_input":"2024-03-20T00:21:56.102732Z","iopub.status.idle":"2024-03-20T00:21:56.121815Z","shell.execute_reply.started":"2024-03-20T00:21:56.102698Z","shell.execute_reply":"2024-03-20T00:21:56.120775Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = VariationalAutoencoder()\nmodel.compile(optimizer = tf.keras.optimizers.Adam(learning_rate = learning_rate))","metadata":{"execution":{"iopub.status.busy":"2024-03-20T00:21:56.700375Z","iopub.execute_input":"2024-03-20T00:21:56.701260Z","iopub.status.idle":"2024-03-20T00:21:56.744142Z","shell.execute_reply.started":"2024-03-20T00:21:56.701226Z","shell.execute_reply":"2024-03-20T00:21:56.743181Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fixed_noise = tf.random.normal((60, latent_dim))","metadata":{"execution":{"iopub.status.busy":"2024-03-20T00:21:57.686305Z","iopub.execute_input":"2024-03-20T00:21:57.687174Z","iopub.status.idle":"2024-03-20T00:21:57.692513Z","shell.execute_reply.started":"2024-03-20T00:21:57.687141Z","shell.execute_reply":"2024-03-20T00:21:57.691539Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.fit(X_train, epochs = 500)","metadata":{"execution":{"iopub.status.busy":"2024-03-20T01:36:32.512642Z","iopub.execute_input":"2024-03-20T01:36:32.513585Z","iopub.status.idle":"2024-03-20T01:47:28.544465Z","shell.execute_reply.started":"2024-03-20T01:36:32.513541Z","shell.execute_reply":"2024-03-20T01:47:28.542872Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_pred = model.decode(fixed_noise)\nshow_images(y_pred)","metadata":{"execution":{"iopub.status.busy":"2024-03-20T01:47:35.803924Z","iopub.execute_input":"2024-03-20T01:47:35.804595Z","iopub.status.idle":"2024-03-20T01:47:36.480215Z","shell.execute_reply.started":"2024-03-20T01:47:35.804564Z","shell.execute_reply":"2024-03-20T01:47:36.479330Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}