{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":16880,"databundleVersionId":858837,"sourceType":"competition"},{"sourceId":924245,"sourceType":"datasetVersion","datasetId":464091}],"dockerImageVersionId":29845,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"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":"2024-10-03T08:48:29.249465Z","iopub.execute_input":"2024-10-03T08:48:29.249848Z","iopub.status.idle":"2024-10-03T08:49:43.061622Z","shell.execute_reply.started":"2024-10-03T08:48:29.249786Z","shell.execute_reply":"2024-10-03T08:49:43.056132Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataset_path = '/kaggle/input/deepfake-faces/metadata.csv'","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:49:43.071897Z","iopub.execute_input":"2024-10-03T08:49:43.072161Z","iopub.status.idle":"2024-10-03T08:49:43.076900Z","shell.execute_reply.started":"2024-10-03T08:49:43.072122Z","shell.execute_reply":"2024-10-03T08:49:43.076005Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.read_csv(dataset_path)","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:49:43.078480Z","iopub.execute_input":"2024-10-03T08:49:43.078758Z","iopub.status.idle":"2024-10-03T08:49:43.207251Z","shell.execute_reply.started":"2024-10-03T08:49:43.078707Z","shell.execute_reply":"2024-10-03T08:49:43.206535Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.head()","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:49:43.208727Z","iopub.execute_input":"2024-10-03T08:49:43.209023Z","iopub.status.idle":"2024-10-03T08:49:43.224713Z","shell.execute_reply.started":"2024-10-03T08:49:43.208966Z","shell.execute_reply":"2024-10-03T08:49:43.223833Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.tail()","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:49:43.229155Z","iopub.execute_input":"2024-10-03T08:49:43.229733Z","iopub.status.idle":"2024-10-03T08:49:43.244225Z","shell.execute_reply.started":"2024-10-03T08:49:43.229554Z","shell.execute_reply":"2024-10-03T08:49:43.243489Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.shape","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:49:43.247249Z","iopub.execute_input":"2024-10-03T08:49:43.247542Z","iopub.status.idle":"2024-10-03T08:49:43.256170Z","shell.execute_reply.started":"2024-10-03T08:49:43.247483Z","shell.execute_reply":"2024-10-03T08:49:43.255207Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.columns","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:49:43.257442Z","iopub.execute_input":"2024-10-03T08:49:43.257742Z","iopub.status.idle":"2024-10-03T08:49:43.267884Z","shell.execute_reply.started":"2024-10-03T08:49:43.257682Z","shell.execute_reply":"2024-10-03T08:49:43.266822Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.duplicated().sum()","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:49:43.269222Z","iopub.execute_input":"2024-10-03T08:49:43.269554Z","iopub.status.idle":"2024-10-03T08:49:43.325638Z","shell.execute_reply.started":"2024-10-03T08:49:43.269495Z","shell.execute_reply":"2024-10-03T08:49:43.324532Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.isnull().sum()","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:49:43.327145Z","iopub.execute_input":"2024-10-03T08:49:43.327724Z","iopub.status.idle":"2024-10-03T08:49:43.362616Z","shell.execute_reply.started":"2024-10-03T08:49:43.327466Z","shell.execute_reply":"2024-10-03T08:49:43.361588Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.info()","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:49:43.364185Z","iopub.execute_input":"2024-10-03T08:49:43.364652Z","iopub.status.idle":"2024-10-03T08:49:43.402579Z","shell.execute_reply.started":"2024-10-03T08:49:43.364482Z","shell.execute_reply":"2024-10-03T08:49:43.401542Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.nunique()","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:49:43.404202Z","iopub.execute_input":"2024-10-03T08:49:43.404533Z","iopub.status.idle":"2024-10-03T08:49:43.482366Z","shell.execute_reply.started":"2024-10-03T08:49:43.404445Z","shell.execute_reply":"2024-10-03T08:49:43.481592Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"object_columns = df.select_dtypes(include=['object']).columns\nprint(\"Object type columns:\")\nprint(object_columns)\n\nnumerical_columns = df.select_dtypes(include=['int64', 'float64']).columns\nprint(\"\\nNumerical type columns:\")\nprint(numerical_columns)","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:49:43.483992Z","iopub.execute_input":"2024-10-03T08:49:43.484323Z","iopub.status.idle":"2024-10-03T08:49:43.502603Z","shell.execute_reply.started":"2024-10-03T08:49:43.484266Z","shell.execute_reply":"2024-10-03T08:49:43.501593Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def classify_features(df):\n    categorical_features = []\n    non_categorical_features = []\n    discrete_features = []\n    continuous_features = []\n\n    for column in df.columns:\n        if df[column].dtype == 'object':\n            if df[column].nunique() < 10:\n                categorical_features.append(column)\n            else:\n                non_categorical_features.append(column)\n        elif df[column].dtype in ['int64', 'float64']:\n            if df[column].nunique() < 10:\n                discrete_features.append(column)\n            else:\n                continuous_features.append(column)\n\n    return categorical_features, non_categorical_features, discrete_features, continuous_features","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:49:43.504586Z","iopub.execute_input":"2024-10-03T08:49:43.504932Z","iopub.status.idle":"2024-10-03T08:49:43.514629Z","shell.execute_reply.started":"2024-10-03T08:49:43.504874Z","shell.execute_reply":"2024-10-03T08:49:43.513598Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"categorical, non_categorical, discrete, continuous = classify_features(df)","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:49:43.516006Z","iopub.execute_input":"2024-10-03T08:49:43.516287Z","iopub.status.idle":"2024-10-03T08:49:43.571649Z","shell.execute_reply.started":"2024-10-03T08:49:43.516233Z","shell.execute_reply":"2024-10-03T08:49:43.570579Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"Categorical Features:\", categorical)\nprint(\"Non-Categorical Features:\", non_categorical)\nprint(\"Discrete Features:\", discrete)\nprint(\"Continuous Features:\", continuous)","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:49:43.573078Z","iopub.execute_input":"2024-10-03T08:49:43.573359Z","iopub.status.idle":"2024-10-03T08:49:43.578882Z","shell.execute_reply.started":"2024-10-03T08:49:43.573304Z","shell.execute_reply":"2024-10-03T08:49:43.578041Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = df.fillna(\"Not Available\")","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:49:43.580255Z","iopub.execute_input":"2024-10-03T08:49:43.580560Z","iopub.status.idle":"2024-10-03T08:49:43.626763Z","shell.execute_reply.started":"2024-10-03T08:49:43.580499Z","shell.execute_reply":"2024-10-03T08:49:43.625929Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for i in categorical:\n    print(i,':', df[i].unique())\n    print()","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:49:43.628019Z","iopub.execute_input":"2024-10-03T08:49:43.628266Z","iopub.status.idle":"2024-10-03T08:49:43.638321Z","shell.execute_reply.started":"2024-10-03T08:49:43.628225Z","shell.execute_reply":"2024-10-03T08:49:43.637512Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for i in categorical:\n    print(df[i].value_counts())\n    print()","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:49:43.640470Z","iopub.execute_input":"2024-10-03T08:49:43.640865Z","iopub.status.idle":"2024-10-03T08:49:43.670276Z","shell.execute_reply.started":"2024-10-03T08:49:43.640795Z","shell.execute_reply":"2024-10-03T08:49:43.669236Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np \nimport pandas as pd \nimport matplotlib.pyplot as plt\nimport seaborn as sns","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:49:43.671588Z","iopub.execute_input":"2024-10-03T08:49:43.671950Z","iopub.status.idle":"2024-10-03T08:49:43.677613Z","shell.execute_reply.started":"2024-10-03T08:49:43.671901Z","shell.execute_reply":"2024-10-03T08:49:43.676831Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import warnings\nwarnings.filterwarnings('ignore')","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:49:43.679036Z","iopub.execute_input":"2024-10-03T08:49:43.679341Z","iopub.status.idle":"2024-10-03T08:49:43.689231Z","shell.execute_reply.started":"2024-10-03T08:49:43.679295Z","shell.execute_reply":"2024-10-03T08:49:43.688385Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for i in categorical:\n    plt.figure(figsize=(30,20)) \n    plt.pie(df[i].value_counts(), labels=df[i].value_counts().index, \n            autopct='%1.1f%%', textprops={ 'fontsize': 20,\n                                           'color': 'black',\n                                           'weight': 'bold',\n                                           'family': 'serif' }) \n    hfont = {'fontname':'serif', 'weight': 'bold'}\n    plt.title(i, size=20, **hfont) \n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:49:43.690615Z","iopub.execute_input":"2024-10-03T08:49:43.691133Z","iopub.status.idle":"2024-10-03T08:49:44.232718Z","shell.execute_reply.started":"2024-10-03T08:49:43.690897Z","shell.execute_reply":"2024-10-03T08:49:44.231829Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for i in numerical_columns:\n    plt.figure(figsize=(15,6))\n    sns.distplot(df[i], kde = True, bins = 20)\n    plt.xticks(rotation = 90)\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:49:44.234183Z","iopub.execute_input":"2024-10-03T08:49:44.234578Z","iopub.status.idle":"2024-10-03T08:49:45.039186Z","shell.execute_reply.started":"2024-10-03T08:49:44.234509Z","shell.execute_reply":"2024-10-03T08:49:45.037893Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for i in categorical:\n    for j in numerical_columns:\n        plt.figure(figsize=(15,6))\n        sns.boxplot(x = df[i], y = df[j], data = df, palette = 'hls')\n        plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:49:45.041431Z","iopub.execute_input":"2024-10-03T08:49:45.042208Z","iopub.status.idle":"2024-10-03T08:49:45.860615Z","shell.execute_reply.started":"2024-10-03T08:49:45.042133Z","shell.execute_reply":"2024-10-03T08:49:45.859283Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for i in numerical_columns:\n    for j in numerical_columns:\n        if i != j:\n            plt.figure(figsize=(15,6))\n            sns.scatterplot(x = df[j], y = df[i], data = df, palette = 'hls')\n            plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:49:45.862642Z","iopub.execute_input":"2024-10-03T08:49:45.863336Z","iopub.status.idle":"2024-10-03T08:49:49.294038Z","shell.execute_reply.started":"2024-10-03T08:49:45.863259Z","shell.execute_reply":"2024-10-03T08:49:49.292893Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"real_df = df[df[\"label\"] == \"REAL\"]\nfake_df = df[df[\"label\"] == \"FAKE\"]\nsample_size = 10000\n\nreal_df = real_df.sample(sample_size, random_state=42)\nfake_df = fake_df.sample(sample_size, random_state=42)\n\nsample_meta = pd.concat([real_df, fake_df])","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:49:49.296746Z","iopub.execute_input":"2024-10-03T08:49:49.297325Z","iopub.status.idle":"2024-10-03T08:49:49.371822Z","shell.execute_reply.started":"2024-10-03T08:49:49.297109Z","shell.execute_reply":"2024-10-03T08:49:49.371035Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\nTrain_set, Test_set = train_test_split(sample_meta,test_size=0.2,random_state=42,stratify=sample_meta['label'])\nTrain_set, Val_set  = train_test_split(Train_set,test_size=0.3,random_state=42,stratify=Train_set['label'])","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:49:49.372906Z","iopub.execute_input":"2024-10-03T08:49:49.373218Z","iopub.status.idle":"2024-10-03T08:49:49.447472Z","shell.execute_reply.started":"2024-10-03T08:49:49.373162Z","shell.execute_reply":"2024-10-03T08:49:49.446694Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Train_set.shape,Val_set.shape,Test_set.shape","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:49:49.448894Z","iopub.execute_input":"2024-10-03T08:49:49.449221Z","iopub.status.idle":"2024-10-03T08:49:49.455816Z","shell.execute_reply.started":"2024-10-03T08:49:49.449161Z","shell.execute_reply":"2024-10-03T08:49:49.455035Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import cv2","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:49:49.457092Z","iopub.execute_input":"2024-10-03T08:49:49.457394Z","iopub.status.idle":"2024-10-03T08:49:49.467233Z","shell.execute_reply.started":"2024-10-03T08:49:49.457343Z","shell.execute_reply":"2024-10-03T08:49:49.466405Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"image_path = '/kaggle/input/deepfake-faces/faces_224/'\n\nimage_files = os.listdir(image_path)\n\nimage_files.sort()\n\nselected_images = image_files[:9]\n\nplt.figure(figsize=(10, 10))\n\nfor index, image_file in enumerate(selected_images):\n    image = cv2.imread(os.path.join(image_path, image_file))\n\n    plt.subplot(3, 3, index + 1)\n    plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))\n    plt.title(f'Image {index + 1}')\n    plt.axis('off')\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:49:49.468800Z","iopub.execute_input":"2024-10-03T08:49:49.469052Z","iopub.status.idle":"2024-10-03T08:49:50.632329Z","shell.execute_reply.started":"2024-10-03T08:49:49.469009Z","shell.execute_reply":"2024-10-03T08:49:50.631574Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for i, image_file in enumerate(image_files[:10]):\n    image = cv2.imread(os.path.join(image_path, image_file))\n    if image is not None:\n        height, width, _ = image.shape\n        print(f\"Resolution of image {i+1}: {width} x {height}\")\n    else:\n        print(f\"Error reading image {i+1}\")\n\nif len(image_files) < 10:\n    print(f\"Only {len(image_files)} images found in the directory.\")","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:49:50.634057Z","iopub.execute_input":"2024-10-03T08:49:50.634463Z","iopub.status.idle":"2024-10-03T08:49:50.671469Z","shell.execute_reply.started":"2024-10-03T08:49:50.634385Z","shell.execute_reply":"2024-10-03T08:49:50.670728Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(15,15))\nfor cur,i in enumerate(Train_set.index[25:50]):\n    plt.subplot(5,5,cur+1)\n    plt.xticks([])\n    plt.yticks([])\n    plt.grid(False)\n    \n    plt.imshow(cv2.imread('../input/deepfake-faces/faces_224/'+Train_set.loc[i,'videoname'][:-4]+'.jpg'))\n    \n    if(Train_set.loc[i,'label']=='FAKE'):\n        plt.xlabel('FAKE Image')\n    else:\n        plt.xlabel('REAL Image')\n        \nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:49:50.672824Z","iopub.execute_input":"2024-10-03T08:49:50.673111Z","iopub.status.idle":"2024-10-03T08:49:52.477078Z","shell.execute_reply.started":"2024-10-03T08:49:50.673056Z","shell.execute_reply":"2024-10-03T08:49:52.476244Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def retreive_dataset(set_name):\n    images,labels=[],[]\n    for (img, imclass) in zip(set_name['videoname'], set_name['label']):\n        images.append(cv2.imread('../input/deepfake-faces/faces_224/'+img[:-4]+'.jpg'))\n        if(imclass=='FAKE'):\n            labels.append(1)\n        else:\n            labels.append(0)\n    \n    return np.array(images),np.array(labels)","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:49:52.483324Z","iopub.execute_input":"2024-10-03T08:49:52.483793Z","iopub.status.idle":"2024-10-03T08:49:52.492651Z","shell.execute_reply.started":"2024-10-03T08:49:52.483710Z","shell.execute_reply":"2024-10-03T08:49:52.491845Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train,y_train=retreive_dataset(Train_set)\nX_val,y_val=retreive_dataset(Val_set)\nX_test,y_test=retreive_dataset(Test_set)","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:49:52.494611Z","iopub.execute_input":"2024-10-03T08:49:52.494935Z","iopub.status.idle":"2024-10-03T08:50:39.799092Z","shell.execute_reply.started":"2024-10-03T08:49:52.494866Z","shell.execute_reply":"2024-10-03T08:50:39.797970Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow.keras import layers, models\nfrom functools import partial","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:50:39.801006Z","iopub.execute_input":"2024-10-03T08:50:39.801398Z","iopub.status.idle":"2024-10-03T08:50:39.806598Z","shell.execute_reply.started":"2024-10-03T08:50:39.801327Z","shell.execute_reply":"2024-10-03T08:50:39.805612Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tf.random.set_seed(42)","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:50:39.808043Z","iopub.execute_input":"2024-10-03T08:50:39.808286Z","iopub.status.idle":"2024-10-03T08:50:39.827937Z","shell.execute_reply.started":"2024-10-03T08:50:39.808245Z","shell.execute_reply":"2024-10-03T08:50:39.827220Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow.keras import layers, models\nfrom functools import partial","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:50:39.833053Z","iopub.execute_input":"2024-10-03T08:50:39.833380Z","iopub.status.idle":"2024-10-03T08:50:39.839995Z","shell.execute_reply.started":"2024-10-03T08:50:39.833316Z","shell.execute_reply":"2024-10-03T08:50:39.839169Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def build_generator():\n    model = models.Sequential()\n    \n    # Initial dense layer, projecting noise into a larger dimension\n    model.add(layers.Dense(128 * 14 * 14, activation=\"relu\", input_dim=100))  # Adjust for better upsampling\n    model.add(layers.Reshape((14, 14, 128)))  # Start from a larger feature map, like 14x14\n    \n    # First upsampling layer\n    model.add(layers.UpSampling2D())  # Now output is 28x28\n    model.add(layers.Conv2D(128, kernel_size=3, padding=\"same\"))\n    model.add(layers.BatchNormalization(momentum=0.8))\n    model.add(layers.Activation(\"relu\"))\n    \n    # Second upsampling layer\n    model.add(layers.UpSampling2D())  # Now output is 56x56\n    model.add(layers.Conv2D(128, kernel_size=3, padding=\"same\"))\n    model.add(layers.BatchNormalization(momentum=0.8))\n    model.add(layers.Activation(\"relu\"))\n\n    # Third upsampling layer\n    model.add(layers.UpSampling2D())  # Now output is 112x112\n    model.add(layers.Conv2D(64, kernel_size=3, padding=\"same\"))\n    model.add(layers.BatchNormalization(momentum=0.8))\n    model.add(layers.Activation(\"relu\"))\n    \n    # Fourth upsampling layer\n    model.add(layers.UpSampling2D())  # Now output is 224x224\n    model.add(layers.Conv2D(3, kernel_size=3, padding=\"same\"))\n    model.add(layers.Activation(\"tanh\"))  # Final output in [-1, 1] range\n    \n    return model\n","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:50:39.841431Z","iopub.execute_input":"2024-10-03T08:50:39.841964Z","iopub.status.idle":"2024-10-03T08:50:39.855765Z","shell.execute_reply.started":"2024-10-03T08:50:39.841727Z","shell.execute_reply":"2024-10-03T08:50:39.854895Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def build_discriminator():\n    DefaultConv2D = partial(layers.Conv2D, kernel_size=3, padding=\"same\",\n                            activation=\"relu\", kernel_initializer=\"he_normal\")\n\n    model = models.Sequential([\n        DefaultConv2D(filters=64, kernel_size=7, input_shape=[224, 224, 3]),\n        layers.MaxPooling2D(),\n        layers.BatchNormalization(),\n        DefaultConv2D(filters=128),\n        DefaultConv2D(filters=128),\n        layers.MaxPooling2D(),\n        layers.BatchNormalization(),\n        layers.Flatten(),\n        layers.Dense(units=128, activation=\"relu\", kernel_initializer=\"he_normal\"),\n        layers.BatchNormalization(),\n        layers.Dropout(0.5),\n        layers.Dense(units=64, activation=\"relu\", kernel_initializer=\"he_normal\"),\n        layers.BatchNormalization(),\n        layers.Dropout(0.5),\n        layers.Dense(units=1, activation=\"sigmoid\")\n    ])\n    return model","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:50:39.856998Z","iopub.execute_input":"2024-10-03T08:50:39.857277Z","iopub.status.idle":"2024-10-03T08:50:39.869250Z","shell.execute_reply.started":"2024-10-03T08:50:39.857225Z","shell.execute_reply":"2024-10-03T08:50:39.868470Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Build the GAN by combining the generator and discriminator\ndef build_gan(generator, discriminator):\n    discriminator.trainable = False  # Freeze the discriminator's weights during GAN training\n    model = models.Sequential()\n    model.add(generator)\n    model.add(discriminator)\n    return model","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:50:39.870289Z","iopub.execute_input":"2024-10-03T08:50:39.870587Z","iopub.status.idle":"2024-10-03T08:50:39.881771Z","shell.execute_reply.started":"2024-10-03T08:50:39.870536Z","shell.execute_reply":"2024-10-03T08:50:39.880859Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Compile the models\ndef compile_gan(generator, discriminator, gan):\n    optimizer = tf.keras.optimizers.Adam(learning_rate=0.0002, beta_1=0.5)\n\n    # Compile the discriminator\n    discriminator.compile(optimizer=optimizer, loss=\"binary_crossentropy\", metrics=[\"accuracy\"])\n\n    # Compile the GAN\n    gan.compile(optimizer=optimizer, loss=\"binary_crossentropy\")","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:50:39.882924Z","iopub.execute_input":"2024-10-03T08:50:39.883136Z","iopub.status.idle":"2024-10-03T08:50:39.892439Z","shell.execute_reply.started":"2024-10-03T08:50:39.883099Z","shell.execute_reply":"2024-10-03T08:50:39.891769Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.callbacks import ModelCheckpoint\nimport numpy as np\n\ndef retrieve_dataset(set_name):\n    images, labels = [], []\n    for (img, imclass) in zip(set_name['videoname'], set_name['label']):\n        images.append(cv2.imread('../input/deepfake-faces/faces_224/'+img[:-4]+'.jpg'))\n        if imclass == 'FAKE':\n            labels.append(1)\n        else:\n            labels.append(0)\n    \n    return np.array(images), np.array(labels)\n\n# Function to save the best model weights manually\ndef save_best_weights(generator, g_loss, best_loss):\n    if g_loss < best_loss:\n        print(f\"New best generator loss: {g_loss}, saving model...\")\n        generator.save_weights('generator_best_weights.h5')\n        return g_loss\n    return best_loss\n\n# Train the GAN\ndef train_gan(generator, discriminator, gan, epochs, batch_size):\n    # Set up the data for training\n    X_train, y_train = retrieve_dataset(Train_set)\n\n    # Rescale images to [-1, 1] range for the generator's tanh activation\n    X_train = X_train / 127.5 - 1.0\n\n    # Track the best loss\n    best_g_loss = float('inf')\n\n    # Training loop\n    for epoch in range(epochs):\n        # Train discriminator\n        idx = np.random.randint(0, X_train.shape[0], batch_size)\n        real_imgs = X_train[idx]\n\n        # Generate a batch of fake images\n        noise = np.random.normal(0, 1, (batch_size, 100))  # 100 is the input noise dimension for the generator\n        fake_imgs = generator.predict(noise)\n\n        # Create labels\n        real_labels = np.ones((batch_size, 1))\n        fake_labels = np.zeros((batch_size, 1))\n\n        # Train the discriminator on real and fake images\n        d_loss_real = discriminator.train_on_batch(real_imgs, real_labels)\n        d_loss_fake = discriminator.train_on_batch(fake_imgs, fake_labels)\n\n        # Train generator via GAN (where discriminator is frozen)\n        noise = np.random.normal(0, 1, (batch_size, 100))\n        misleading_labels = np.ones((batch_size, 1))  # The generator wants to fool the discriminator into thinking fake images are real\n        g_loss = gan.train_on_batch(noise, misleading_labels)\n\n        # Manually save best model weights\n        best_g_loss = save_best_weights(generator, g_loss, best_g_loss)\n\n        # Print progress\n        print(f\"{epoch + 1}/{epochs} [D loss: {d_loss_real[0]} | D acc.: {100 * d_loss_real[1]}] [G loss: {g_loss}]\")\n\n\n","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:50:39.893646Z","iopub.execute_input":"2024-10-03T08:50:39.893908Z","iopub.status.idle":"2024-10-03T08:50:39.912111Z","shell.execute_reply.started":"2024-10-03T08:50:39.893859Z","shell.execute_reply":"2024-10-03T08:50:39.911251Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# def retrieve_dataset(set_name):\n#     images,labels=[],[]\n#     for (img, imclass) in zip(set_name['videoname'], set_name['label']):\n#         images.append(cv2.imread('../input/deepfake-faces/faces_224/'+img[:-4]+'.jpg'))\n#         if(imclass=='FAKE'):\n#             labels.append(1)\n#         else:\n#             labels.append(0)\n    \n#     return np.array(images),np.array(labels)\n\n\n# # Train the GAN\n# def train_gan(generator, discriminator, gan, epochs, batch_size):\n#     # Set up the data for training\n#     X_train, y_train = retrieve_dataset(Train_set)  # Use your dataset loading function\n\n#     # Rescale images to [-1, 1] range for the generator's tanh activation\n#     X_train = X_train / 127.5 - 1.0\n\n#     # Training loop\n#     for epoch in range(epochs):\n#         # Train discriminator\n#         # Get a random batch of real images\n#         idx = np.random.randint(0, X_train.shape[0], batch_size)\n#         real_imgs = X_train[idx]\n\n#         # Generate a batch of fake images\n#         noise = np.random.normal(0, 1, (batch_size, 100))  # 100 is the input noise dimension for the generator\n#         fake_imgs = generator.predict(noise)\n\n#         # Create labels\n#         real_labels = np.ones((batch_size, 1))\n#         fake_labels = np.zeros((batch_size, 1))\n\n#         # Train the discriminator on real and fake images\n#         d_loss_real = discriminator.train_on_batch(real_imgs, real_labels)\n#         d_loss_fake = discriminator.train_on_batch(fake_imgs, fake_labels)\n\n#         # Train generator via GAN (where discriminator is frozen)\n#         noise = np.random.normal(0, 1, (batch_size, 100))\n#         misleading_labels = np.ones((batch_size, 1))  # The generator wants to fool the discriminator into thinking fake images are real\n#         g_loss = gan.train_on_batch(noise, misleading_labels)\n\n#         # Print progress\n#         print(f\"{epoch + 1}/{epochs} [D loss: {d_loss_real[0]} | D acc.: {100 * d_loss_real[1]}] [G loss: {g_loss}]\")","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:50:39.913428Z","iopub.execute_input":"2024-10-03T08:50:39.913713Z","iopub.status.idle":"2024-10-03T08:50:39.925330Z","shell.execute_reply.started":"2024-10-03T08:50:39.913658Z","shell.execute_reply":"2024-10-03T08:50:39.924562Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Main training process\ngenerator = build_generator()\ndiscriminator = build_discriminator()\ngan = build_gan(generator, discriminator)\n\ncompile_gan(generator, discriminator, gan)\ntrain_gan(generator, discriminator, gan, epochs=10, batch_size=16)","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:50:39.926896Z","iopub.execute_input":"2024-10-03T08:50:39.927335Z","iopub.status.idle":"2024-10-03T08:51:16.376859Z","shell.execute_reply.started":"2024-10-03T08:50:39.927132Z","shell.execute_reply":"2024-10-03T08:51:16.376031Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import accuracy_score, f1_score, precision_score, recall_score, confusion_matrix, classification_report\n\n# Get predictions from the discriminator (since it's the classifier)\ny_test_pred = discriminator.predict(X_test)\ny_test_pred_binary = (y_test_pred > 0.5).astype(int)\n\n# Get predictions for the training set\ny_train_pred = discriminator.predict(X_train)\ny_train_pred_binary = (y_train_pred > 0.5).astype(int)\n\n# Calculate training accuracy\ntrain_accuracy = accuracy_score(y_train, y_train_pred_binary)\nprint(f\"Training Accuracy: {train_accuracy * 100:.2f}%\")\n\n# Calculate test accuracy\ntest_accuracy = accuracy_score(y_test, y_test_pred_binary)\nprint(f\"Test Accuracy: {test_accuracy * 100:.2f}%\")\n\n# Calculate F1 Score\nf1 = f1_score(y_test, y_test_pred_binary)\nprint(f\"F1 Score: {f1:.4f}\")\n\n# Calculate Precision\nprecision = precision_score(y_test, y_test_pred_binary)\nprint(f\"Precision: {precision:.4f}\")\n\n# Calculate Recall\nrecall = recall_score(y_test, y_test_pred_binary)\nprint(f\"Recall: {recall:.4f}\")\n\n# Confusion Matrix\nconf_matrix = confusion_matrix(y_test, y_test_pred_binary)\nprint(\"Confusion Matrix:\")\nprint(conf_matrix)\n\n# Classification Report (provides Precision, Recall, F1 for both classes)\nclass_report = classification_report(y_test, y_test_pred_binary)\nprint(\"Classification Report:\")\nprint(class_report)\n","metadata":{"execution":{"iopub.status.busy":"2024-10-03T08:51:16.378534Z","iopub.execute_input":"2024-10-03T08:51:16.378840Z","iopub.status.idle":"2024-10-03T08:51:31.307295Z","shell.execute_reply.started":"2024-10-03T08:51:16.378784Z","shell.execute_reply":"2024-10-03T08:51:31.306490Z"},"trusted":true},"execution_count":null,"outputs":[]}]}