Skip to content

Instantly share code, notes, and snippets.

@gamble27
Created February 4, 2020 13:43
Show Gist options
  • Select an option

  • Save gamble27/a388e7666c9ac22c7ddea60f855b4ee2 to your computer and use it in GitHub Desktop.

Select an option

Save gamble27/a388e7666c9ac22c7ddea60f855b4ee2 to your computer and use it in GitHub Desktop.
df-detection.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "df-detection.ipynb",
"provenance": [],
"collapsed_sections": [
"xj6C-T07JAoZ"
],
"toc_visible": true,
"authorship_tag": "ABX9TyOFg7HypAjOvEXmymqpLYmw",
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"accelerator": "GPU"
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/gamble27/a388e7666c9ac22c7ddea60f855b4ee2/df-detection.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "code",
"metadata": {
"id": "1y6_kiDk4peR",
"colab_type": "code",
"colab": {}
},
"source": [
"import torch\n",
"import torchvision\n",
"import torchvision.transforms as transforms\n",
"from torch.utils.data.sampler import SubsetRandomSampler\n",
"\n",
"import torch.nn as nn\n",
"import torch.nn.functional as F\n",
"import torch.optim as optim\n",
"\n",
"import matplotlib.pyplot as plt\n",
"from tqdm import tqdm\n",
"import time\n",
"import pandas as pd\n",
"import numpy as np\n",
"import os\n",
"import copy"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "aI2ajoA65dxO",
"colab_type": "text"
},
"source": [
"## Download data"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "B6LAKW-Q9R_8",
"colab_type": "text"
},
"source": [
"### Upload files"
]
},
{
"cell_type": "code",
"metadata": {
"id": "jT9xKKqr5cLs",
"colab_type": "code",
"outputId": "be0a10e0-57c8-479e-f75b-916f9957fc53",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 123
}
},
"source": [
"# upload zip file here\n",
"from google.colab import drive\n",
"\n",
"drive.mount('/content/drive')"
],
"execution_count": 2,
"outputs": [
{
"output_type": "stream",
"text": [
"Go to this URL in a browser: https://accounts.google.com/o/oauth2/auth?client_id=947318989803-6bn6qk8qdgf4n4g3pfee6491hc0brc4i.apps.googleusercontent.com&redirect_uri=urn%3aietf%3awg%3aoauth%3a2.0%3aoob&response_type=code&scope=email%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdocs.test%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive.photos.readonly%20https%3a%2f%2fwww.googleapis.com%2fauth%2fpeopleapi.readonly\n",
"\n",
"Enter your authorization code:\n",
"··········\n",
"Mounted at /content/drive\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "qcOKDI4E6YlS",
"colab_type": "code",
"colab": {}
},
"source": [
"!unzip -q 'drive/My Drive/deep-fake-detection-knu-2020.zip' -d data"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "uVpmBu1zAYds",
"colab_type": "code",
"outputId": "a0d05f3a-a178-4af1-869e-348b8dd9a3bd",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
}
},
"source": [
"!ls"
],
"execution_count": 4,
"outputs": [
{
"output_type": "stream",
"text": [
"data drive sample_data\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Hn1Nn5xo9Vg7",
"colab_type": "text"
},
"source": [
"### Create training & validation dataset"
]
},
{
"cell_type": "code",
"metadata": {
"id": "KA4bPQC06xdf",
"colab_type": "code",
"outputId": "15c1cbc3-5b0c-4f8d-b567-c079f873bf92",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 51
}
},
"source": [
"BATCH_SIZE = 128\n",
"\n",
"train_data_path = 'data/train/train'\n",
"\n",
"VAL_SIZE = 0.15 # percentage of data for validation\n",
"\n",
"\n",
"transform_train = transforms.Compose(\n",
" [\n",
" transforms.RandomCrop(28, padding=2),\n",
" transforms.RandomHorizontalFlip(),\n",
" transforms.RandomRotation(10),\n",
" transforms.Grayscale(num_output_channels=1),\n",
" transforms.ToTensor(),\n",
" transforms.Normalize((0.5,), (0.5,))])\n",
"transform_test = transforms.Compose(\n",
" [transforms.Grayscale(num_output_channels=1),\n",
" transforms.ToTensor(),\n",
" transforms.Normalize((0.5,), (0.5,))]\n",
")\n",
"\n",
"# Creating dataset for training and validation\n",
"train_dataset = torchvision.datasets.ImageFolder(\n",
" root=train_data_path,\n",
" transform=transform_train)\n",
"val_dataset = torchvision.datasets.ImageFolder(\n",
" root=train_data_path,\n",
" transform=transform_test)\n",
"\n",
"# Shuffling data and choosing data that will be used for training and validation\n",
"num_train = len(train_dataset)\n",
"indices = list(range(num_train))\n",
"np.random.shuffle(indices)\n",
"split = int(np.floor(VAL_SIZE * num_train))\n",
"train_idx, val_idx = indices[split:], indices[:split]\n",
"\n",
"train_sampler = SubsetRandomSampler(train_idx)\n",
"val_sampler = SubsetRandomSampler(val_idx)\n",
"\n",
"# Creating dataloaders for training and validation\n",
"train_loader = torch.utils.data.DataLoader(\n",
" train_dataset,\n",
" batch_size = BATCH_SIZE,\n",
" num_workers=0, \n",
" sampler=train_sampler)\n",
"\n",
"val_loader = torch.utils.data.DataLoader(\n",
" val_dataset,\n",
" batch_size = BATCH_SIZE,\n",
" num_workers=0,\n",
" sampler=val_sampler)\n",
"\n",
"print(f\"Length train: {len(train_idx)}\")\n",
"print(f\"Length valid: {len(val_idx)}\")"
],
"execution_count": 2,
"outputs": [
{
"output_type": "stream",
"text": [
"Length train: 102000\n",
"Length valid: 18000\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "xj6C-T07JAoZ",
"colab_type": "text"
},
"source": [
"### Check out labels & stuff"
]
},
{
"cell_type": "code",
"metadata": {
"id": "_RYlzgPgYarw",
"colab_type": "code",
"colab": {}
},
"source": [
"visualize_loader = torch.utils.data.DataLoader(\n",
" val_dataset,\n",
" batch_size = 50,\n",
" num_workers=0,\n",
" sampler=val_sampler)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "OWZC4f5dJFRn",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 594
},
"outputId": "c28cf031-b2f7-4aef-a8af-5ea10a3da776"
},
"source": [
"# visualize data\n",
"fig=plt.figure(figsize=(20, 10))\n",
"data, label = next(iter(visualize_loader))\n",
"for i in range(1, 51):\n",
" img = data[i-1][0]\n",
" fig.add_subplot(5, 10, i)\n",
" plt.imshow(img, cmap='gray', vmin=0, vmax=1)\n",
"plt.show()"
],
"execution_count": 4,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\nCCGEEEIIIYQQARJMTp80knL4WCZNmuRtX3HFFS5+4403XGy9nE2aNHHx22+/7WLl8Mk/rC0ArFy5\nspZ6IkQ2OfbYY128xx57uLh///5eO/aysw/det7ZZ33ppZe6mHPJiMLgHASA/70Xyvz5873tZcuW\nFfS5QvP4MNy/KIq8fXEcV/l4QpSanXbaydt+9dVXXcxl2m1urOowbdq0xO0999zTxXbcc59Gjhzp\nYlsqfq+99nLxuHHjatbZAOnQoYO3zfcrm7OJS3VzvharDR+Tj2HzzjCc78WW8LY5fuoSBxxwgLfN\neXa4BLrN28OafPXVV94+/q5Zk6222iqxH3PmzKn0vICfz7B3794utjpy2fcuXbq42Ob+4ePZUvQi\nnQkTJhTUbtasWd523vL4MFrpI4QQQgghhBBCCBEgeukjhBBCCCGEEEIIESC5tnex9caWpuWllbvs\nsou3L2lJFy/JA4CpU6e6mG0LxSgdzMto33zzTW/fmjVranx8URxk5xLCx95rr732Whf/+c9/dnG/\nfv28drx0nZe022XSTz75pIsPOuggF7PFVhRG+/btvW22ZjVo0MDbV+hzpzq2reogO5fIA9Z2atME\nrMfabtja0bp1a2/fu+++62IuBc5WDgBYvHixi9nKwscGgMGDB7v46aefdnFaee+LL7448byc4mD8\n+PGJx2jZsqWLly5dmtguL5x33nne9o033uhia9tiew5jS3HzNv+2sDYjtkHbczHLly9P3Bc69jvn\n7ynJRgf4vxftd8vbM2fOTDxGr169XMw6Wj14vvPll19W+hnAt2ql2QO//fZbF6dZAkV2qF+/vrfN\ndsNVq1aV9Nxa6SOEEEIIIYQQQggRIHrpI4QQQgghhBBCCBEgubZ3sfXG2nAOPvhgFz/11FOJx+Cl\nqVz9wMJZ+nnJKgD88pe/dPF9992XeIxbbrnFxVzlS3YuIYoDZ9Vne1GjRo28dryUlpe733TTTV47\nrvy36aabevt22203F/Py22effbaq3c4VvJwY8Jchn3rqqS62S63ZcjBs2DAXsz0M8Jc8s63WLl3+\n29/+5uIVK1YU0vU6R+fOnb1triZkrV/W3lwq7NLmtWvXurh58+YuXr16dVn6I0RVOffcc11s7Tq7\n7767i19//fXEY/zrX/9yMacSAPxnzaJFixKP0axZs0rb2c907drVxWwlsGNx4cKFLp47d66Lf/rT\n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\n2cDSxg7PgdiWC/j3cdbG2gsLtRnlifbt23vbrA//HrPfBdtf2VoJJH9PabZG/t7TSsAz1vLDaUnY\n4sP3eMC38LEVVFTOokWLXMzvGgD/Ocnf6wEHHOC14xQHb775pouffvppr92DDz7o4kGDBrnYXmOD\nBw92sf3dx8fnNBf2GIWilT5CCCGEEEIIIYQQAaKXPkIIIYQQQgghhBABUmv2LrY62e0HHnjAxX37\n9vXa8bJGXgJrbTiMXZrKy+3YjmCXxvHxedmXbcdLXdlyZSsy7L333i7mf6NdrsdLvezSQl4SzJU6\nQuTFF1908fDhw719afaTYrLtttt627vssouL+TqwVSrq16+fuI+th6yvtReGAlexO/DAA719vNSc\nl1OyjdG2Y3ultW3x53g5r61GJYpHucZiMbCVxw499FAX87js3r27146tJ6FQ3eX9bG3huFBuvvlm\nb/vss8+uVj9CpmHDhi621qy0qj4TJ06sNOYl7ZUdM4nnn3/exfy8YzsX4M+/+J5sK6dedNFFiX1g\ny8VLL73kYra7lxP7bGELCP+7rA2H54P83LE2D7ZzWIsPH4MtCDfddJPXjtME8PPOphbgOQiPWXte\n7m/SsxlIv3fw98TWPLaYZZ3999/fxWypsNVH0+ZsadYvxh5zPVYbviewNfeMM87w2l1yySUu5mvO\nVidmy1AonHTSSd42X/c8nu31y2PM/ubka59/S9oxwdtJ1WbtMViftOuFLT577LGHt4/TIliLmFjH\n//3f/7mYrwNrOW3RooWL+dphi6dtd8IJJ7iYq3AB/u8RtuZylT4AuPrqq13MNjDAf29gq3BWB630\nEUIIIYQQQgghhAgQvfQRQgghhBBCCCGECBC99BFCCCGEEEIIIYQIkFrL6ZPGMccck7jvtttuc/E+\n++zjYlt6jcuGcmw/x97LOXPmeO3Ya8sebvZb23bsP3/11Ve9dn/9619dvNdee7n49NNP99qxB9SW\nK+V+vPfee8g7Z555povZxw8AQ4cOdbEtJ8yl06+66qoqn5dLewPAiBEjXMyeaMuECRNczGVRbXlq\n9kvb3ACc74fzM9gSyp9++mliP/KKLWPKHmT2N1sfNPuWx48fn3g8Hh+PP/64iw877LBq9ljkAR5T\n7LcG/GvE5opiL3WeaNCggbfN+QTYi/7dd98lHsPeX3bYYQcXd+jQwcVPPfVU4jG4RO69997r7eOc\n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\nAwAAAAAAkCDKu4xTTjkl2L733nt9bId/xsOvbDlWpSGYeUPCYnZIZjzTvx12aVdVKUJZRZ5jjjkm\n2J47d267x8VDkidPnuzjuPTHnuPMM8/08c9+9rOa21kNuzJQLeVIXZF9r0+ZMiXYd8stt/i4lnLF\nast14tLBiy++2Md29aDUjRo1Kti2Q8ttP41XTrKrnQ0cODDYZ1e4e/fdd31sh5k3gi3jsu2NVxih\npKs69u956623+tiWZkkfL3H4UFwiYK+LttQrLluwv2evfRMmTAiOs2URL7zwQu6+QYMG+TheEbIs\nbJ+KS1SK7t/+7d9a3YTSs2VR9t4uLguw95RxCXOed955x8fz5s2rqX09e/Zs93xS5dVom23s2LHB\ntv0b2fuSuLxr+vTpPj700EN9fMYZZwTH2b+fLXuVwnt3e/44T/bz1U7fEJdJ5rU9Lre2pSiVVke1\n56/02Q00U3w/bt/3tmQy7rN2xb34fW/PUam8K680udL39Urf6+2/xZamxf2r2vbVAyN9AAAAAAAA\nEsRDHwAAAAAAgATx0AcAAAAAACBBxSm+bRE770TeXDNSWEsd1+3Z+kFbTxvPXZBXFxgvB2frCuPf\nsXWLZfHDH/4w2K52Wewf/OAHVR3X6Hl8LObx6bhK+bF173fffbePH3vsseC4gw8+uK5tsvOX/OpX\nv6rruYvsmmuuCbZHjBjh4/nz59d0TjtPUKXlhe0yxNYJJ5wQbNvPuDVr1vjYzvkkhUsP2+V3Fy1a\nFBxn55GK58T43ve+5+Pvfve7PrbvRUl6+OGH2217SvLmtrLLF0v5y5/G1zFbpx4vU2zZOS3s8sjx\nPHW2z44cOTLYZ6+1tta/rHP6lFk8DyE6Lp4n50PxPaWdAybv8zVmP1Pj+dmqldc+SVqyZElN52yE\ngw46KNh+9tlnfWw/7+LjDjjgAB//7ne/87Gd5zM+Lv6My5ubI57zyG7b61N8nF3+2X4Gx+8J+5ln\nzxfPV2LnGNl5552Dfa+88kq7bQcabZdddgm27XyNdt6seB4qe98Yf0+2/cVenyrNP1bpe3i157N9\n1va3+Li4DzcSI30AAAAAAAASxEMfAAAAAACABHX58q7nnnvOx8uWLQv25ZV0xUvW2qFZdshZpSXb\nKy3zVml5uEr7iqraci6kYdy4ccG2LcNZsGBBsG/atGk+3rx5s4+PPvro4Lh9993Xx88//3xd2vmh\n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\nII/lRw7TU/VEzs657SXdJumcLMvetv/PXZZlmXMuy/m9MySd0dmGovPIYRrIY/mRwzSQx/Ijh2kg\nj+VHDtNAHsuPHKapqoc+zrnu2pL8G7Ms+3C5qzXOuf5Zlq1yzvWXtLa9382ybLqk6W3nafdN0giz\nZ8/2cTzE/dFHH/WxHX4VDwvPG2oZDx2zpVp2WGS8Gtiuu+7qYzvcbPXq1cFxt956q4/t6ijxOe1w\nz60pYw7xcWXIY/yetSWKtpRKkn75y182qhkVfeITn/CxHcZpVxlqlEbkcOrUqcFxdhj6ZZdd5uMd\ndtghOM6Wd+22224+jstK7VDaeFjtpz71qfaaqiFDhrT7cylcheHFF18M9tmysGeffdbH8RB8W1YW\nl3RZcUmXZUt/u3fv7uN4NZP2NKMv2hWxbJnBM888ExxnV6G01754tS57zbDXPilcAcwOMY7/FrYc\nwV5L43zXu28vXrzYx7ZkVAqvz0uXLq36nGX4PC2bZpR0xVLLo11Zya7AFJdJxmW41bArysSl2Jb9\nPNy8eXPucbWUc7Wn2Tm0qxXWqtJqZ716fTTPbbxKWspS64tdUStzGK+MVe2K1ZWmO7H3MDaOy7vy\n7vvi4/L2xeVd9n7Lrugc/xvtZ3K8yp4tLdu0aVNuO6pVzepdTtLVkl7MssyuSThT0sS2eKKkGfHv\nolDIYcnRF5NBDkuOvpgMclhy9MXyI4dpII/lRw7TVs1In4MlfU3S751zH/7frt+V9BNJtzrnTpO0\nXNJXGtNE1MH2IocpoC+WH30xDfTF8qMvpoG+WH7kMA3ksfzIYcKqWb1rjqS8pTfG5fwcxfLHLMvI\nYcnRF5NAX0wAfTEJ9MUE0BfLjxymgTyWHzlMW9UTOReRXaLtvPPOC/bZ5X3tEu1SWPtn6wXjuX/s\ntq31i2vubE3f5z73OR/HdXu2HvtXv/qVj+O5hGwNXzxPgj123bp1Aopm3333DbZtXzzppJOCfbaP\nTZ482cejRo0Kjps2bZqPr7rqKh9/4QtfCI6zNbWnnXZabhttv7fnsLW1ZXLBBdWtnDl06NBg2y7t\nbpcDjuujFy5c6ON4Dgf7ubbffvv52M7HI0mnn366j+1cEnHNtl02+PDDD/dx/Dm+//77+/jJJ5/0\nsZ0vSJI+//nP+zj+rM37XI/nu5kyZYpa4eijj/bxnXfe6eP4fWqvO3/zN3/j43ipUXs9iZfwtTmx\n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\n",
"text/plain": [
"<Figure size 1440x720 with 50 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Z1m8Fjn59Y1c",
"colab_type": "text"
},
"source": [
"### Create test dataset "
]
},
{
"cell_type": "code",
"metadata": {
"id": "aCu0L1-R7PlI",
"colab_type": "code",
"outputId": "2da96da0-e0b9-42c9-8e3b-32eac4e2f1b0",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
}
},
"source": [
"test_data_path = 'data/test/'\n",
"\n",
"test_dataset = torchvision.datasets.ImageFolder(\n",
" root=test_data_path,\n",
" transform=transform_test)\n",
"\n",
"test_loader = torch.utils.data.DataLoader(\n",
" test_dataset,\n",
" batch_size = 1,\n",
" num_workers=0,\n",
" shuffle=False)\n",
"\n",
"print(f\"Length test: {len(test_dataset)}\")"
],
"execution_count": 26,
"outputs": [
{
"output_type": "stream",
"text": [
"Length test: 20000\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "LmI6UaHQ9dnl",
"colab_type": "text"
},
"source": [
"## Enable CUDA"
]
},
{
"cell_type": "code",
"metadata": {
"id": "_By9MKrv9olq",
"colab_type": "code",
"outputId": "9b770fb0-a50d-4689-e31d-3c5b925f1ebd",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
}
},
"source": [
"device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n",
"\n",
"# Assume that we are on a CUDA machine, then this should print a CUDA device:\n",
"print(device)"
],
"execution_count": 4,
"outputs": [
{
"output_type": "stream",
"text": [
"cuda:0\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "xRWt57HPAC58",
"colab_type": "text"
},
"source": [
"## Create classificator"
]
},
{
"cell_type": "code",
"metadata": {
"id": "iFr0xV8G_8nn",
"colab_type": "code",
"colab": {}
},
"source": [
"class ConvBrick(nn.Module):\n",
" def __init__(self, in_channels, out_channels, kernel_size, p=0, *args, **kwargs):\n",
" super(ConvBrick, self).__init__()\n",
"\n",
" self.nothing = lambda x: x\n",
"\n",
" self.norm = nn.BatchNorm2d(out_channels)\n",
" self.drop = nn.Dropout2d(p) if p>0 else self.nothing\n",
" self.conv = nn.Conv2d(in_channels, out_channels, kernel_size, *args, **kwargs)\n",
" self.actf = torch.tanh\n",
"\n",
" def forward(self, x):\n",
" x = self.drop(x)\n",
" x = self.conv(x)\n",
" x = self.norm(x)\n",
" x = self.actf(x)\n",
" return x"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "zOcTsCYkFIdZ",
"colab_type": "code",
"colab": {}
},
"source": [
"class LinearBrick(nn.Module):\n",
" def __init__(self, in_features, out_features, activation=F.relu, p=0):\n",
" super(LinearBrick, self).__init__()\n",
"\n",
" self.nothing = lambda x: x\n",
"\n",
" self.norm = nn.BatchNorm1d(in_features)\n",
" self.drop = nn.Dropout(p) if p>0 else self.nothing\n",
" self.fc = nn.Linear(in_features, out_features)\n",
" self.actf = activation if activation is not None else self.nothing\n",
"\n",
" def forward(self, x):\n",
" x = self.norm(x)\n",
" x = self.drop(x)\n",
" x = self.fc(x)\n",
" x = self.actf(x)\n",
" return x"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "X1FicB0cFXkF",
"colab_type": "code",
"colab": {}
},
"source": [
"class TrickyNet(nn.Module):\n",
" def __init__(self):\n",
" super(TrickyNet, self).__init__()\n",
"\n",
" self.maxch = 256\n",
"\n",
" self.conv11 = ConvBrick(1, 32, 3) # 28x28 -> 26x26\n",
" self.conv12 = ConvBrick(32, 64, 3) # 26x26 -> 24x24\n",
" self.pool1 = nn.MaxPool2d(2, 2) # 24x24 -> 12x12\n",
"\n",
" self.conv21 = ConvBrick(64, 96, 3) # 12x12 -> 10x10\n",
" self.conv22 = ConvBrick(96, 128, 3) # 10x10 -> 8x8\n",
" self.pool2 = nn.MaxPool2d(2, 2) # 8x8 -> 4x4\n",
"\n",
" self.conv31 = ConvBrick(128, self.maxch, 3) # 4x4 -> 2x2\n",
" self.pool3 = nn.MaxPool2d(2, 2) # 2x2 -> 1x1\n",
"\n",
" self.pool4 = nn.AvgPool2d(kernel_size=1, stride=1) # 1x1 -> 1x1\n",
"\n",
" self.fc1 = LinearBrick(self.maxch, 32, p=0.3, activation=torch.tanh)\n",
" self.fc2 = LinearBrick(32, 1, p=0.2, activation=torch.sigmoid)\n",
"\n",
" def forward(self, x):\n",
" x = self.conv12(self.conv11(x))\n",
" x = self.pool1(x)\n",
" x = self.conv22(self.conv21(x))\n",
" x = self.pool2(x)\n",
" x = self.pool3(self.conv31(x))\n",
" x = self.pool4(x)\n",
"\n",
" x = x.view(-1, self.maxch)\n",
" x = self.fc1(x)\n",
" x = self.fc2(x)\n",
" return x"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "rIACfp56LfBx",
"colab_type": "code",
"colab": {}
},
"source": [
"model = TrickyNet().to(device)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "xKLGnLaC8mDI",
"colab_type": "text"
},
"source": [
"## Train & test the model"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "JcOMQZoZ8yWU",
"colab_type": "text"
},
"source": [
"### Define train & validation functions"
]
},
{
"cell_type": "code",
"metadata": {
"id": "t_Qb6uMU8waT",
"colab_type": "code",
"colab": {}
},
"source": [
"def train(model, optimizer, criterion, epoch, trainloader=train_loader, device=device):\n",
" model.train()\n",
" train_loss = 0\n",
" correct = 0\n",
" total = 0\n",
" for batch_idx, (inputs, targets) in enumerate(trainloader):\n",
" inputs, targets = inputs.to(device), targets.to(device)\n",
" optimizer.zero_grad()\n",
" outputs = model(inputs)\n",
" targets1 = torch.reshape(targets, (targets.shape[0], 1)).to(device)\n",
" loss = criterion(outputs, targets1)\n",
" loss.backward()\n",
" optimizer.step()\n",
" train_loss += loss.item()\n",
" predicted = torch.round(outputs)\n",
" total += targets.size(0)\n",
" correct += predicted.eq(targets1).sum().item()\n",
" # free some memory at GPU\n",
" inputs.to(\"cpu\")\n",
" targets.to(\"cpu\")\n",
" targets1.to(\"cpu\")\n",
" # print results\n",
" if (batch_idx % 100 == 0):\n",
" print('Loss: %.3f | Acc: %.3f%% (%d/%d)'\n",
" % (train_loss/(batch_idx+1), 100.*correct/total, correct, total))\n",
"\n",
"def valid(model, device, valloader=val_loader):\n",
" model.eval()\n",
" correct = 0\n",
" total = 0\n",
" loss = 0\n",
" with torch.no_grad():\n",
" for data in valloader:\n",
" # get prediction\n",
" images, labels = data\n",
" images, labels = images.to(device), labels.to(device)\n",
" outputs = model(images)\n",
" labels1 = torch.reshape(labels, (labels.shape[0], 1)).to(device)\n",
" # get accuracy\n",
" predicted = torch.round(outputs)\n",
" total += labels.size(0)\n",
" correct += (predicted == labels1).sum().item()\n",
" # get loss\n",
" loss += criterion(outputs, labels1).item()\n",
" # free some memory at GPU\n",
" images.to(\"cpu\")\n",
" labels.to(\"cpu\")\n",
" labels1.to(\"cpu\")\n",
" accuracy = 100. * correct / total\n",
" print('Accuracy on validation images: %.3f %%' % (accuracy))\n",
" print(f\"Loss of the network on validation images: {loss:.3f}\")\n",
" return loss"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "VYcg6i3kOEfm",
"colab_type": "text"
},
"source": [
"### Define LogLoss criterion"
]
},
{
"cell_type": "code",
"metadata": {
"id": "PwcXieP9OLwo",
"colab_type": "code",
"colab": {}
},
"source": [
"def LogLoss(y_pred, y_true, eps=1e-15):\n",
" eps = torch.full(y_true.shape, eps).to(y_pred.device)\n",
" # loss = torch.Tensor([0.]).to(y_pred.device)\n",
" loss = -(y_true*torch.log(torch.max(eps, torch.min(1-eps, y_pred))) +\n",
" (1-y_true)*torch.log(torch.max(eps, torch.min(1-eps, y_pred)))).sum() / (y_pred.shape[0])\n",
" return loss"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "sUGv9uZNTSjk",
"colab_type": "code",
"outputId": "42f74236-0db4-4990-c433-a8f72ef3db28",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
}
},
"source": [
"# check if it works properly\n",
"a = torch.randn((4,), requires_grad=True).to(device)\n",
"b = torch.randn((4,), requires_grad=True).to(device)\n",
"LogLoss(a,b)"
],
"execution_count": 16,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"tensor(18.1490, device='cuda:0', grad_fn=<DivBackward0>)"
]
},
"metadata": {
"tags": []
},
"execution_count": 16
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "NckOpomAUvlG",
"colab_type": "code",
"colab": {}
},
"source": [
"criterion = LogLoss"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "fVukgsWoCEfQ",
"colab_type": "text"
},
"source": [
"### Train classifier"
]
},
{
"cell_type": "code",
"metadata": {
"id": "JOmSydIMvIuz",
"colab_type": "code",
"colab": {}
},
"source": [
"optimizer = optim.SGD(\n",
" model.parameters(), \n",
" lr=0.01, momentum=0.9\n",
" )"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "KL7CFDJDCDUJ",
"colab_type": "code",
"outputId": "74d108cd-e29b-46e2-a39d-c708cb0eb95a",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000
}
},
"source": [
"epochs = 20\n",
"min_loss = 1\n",
"for epoch in range(1, epochs + 1):\n",
" print(f\"Epoch {epoch}\")\n",
" train(model, optimizer, criterion, epoch, device=device)\n",
" loss = valid(model, device)\n",
" if loss < min_loss and loss != 0.:\n",
" min_loss = loss\n",
" best_wts = copy.deepcopy(model.state_dict())\n"
],
"execution_count": 19,
"outputs": [
{
"output_type": "stream",
"text": [
"Epoch 1\n",
"Loss: 0.699 | Acc: 55.469% (71/128)\n",
"Loss: 0.222 | Acc: 49.745% (6431/12928)\n",
"Loss: 0.126 | Acc: 49.716% (12791/25728)\n",
"Loss: 0.089 | Acc: 49.852% (19207/38528)\n",
"Loss: 0.069 | Acc: 49.858% (25591/51328)\n",
"Loss: 0.056 | Acc: 49.849% (31967/64128)\n",
"Loss: 0.048 | Acc: 49.916% (38399/76928)\n",
"Loss: 0.041 | Acc: 49.982% (44848/89728)\n",
"Accuracy on validation images: 50.000 %\n",
"Loss of the network on validation images: 0.218\n",
"Epoch 2\n",
"Loss: 0.003 | Acc: 50.000% (64/128)\n",
"Loss: 0.003 | Acc: 50.333% (6507/12928)\n",
"Loss: 0.002 | Acc: 50.521% (12998/25728)\n",
"Loss: 0.002 | Acc: 50.363% (19404/38528)\n",
"Loss: 0.002 | Acc: 50.203% (25768/51328)\n",
"Loss: 0.002 | Acc: 50.117% (32139/64128)\n",
"Loss: 0.002 | Acc: 50.109% (38548/76928)\n",
"Loss: 0.002 | Acc: 50.050% (44909/89728)\n",
"Accuracy on validation images: 50.000 %\n",
"Loss of the network on validation images: 0.076\n",
"Epoch 3\n",
"Loss: 0.001 | Acc: 50.781% (65/128)\n",
"Loss: 0.001 | Acc: 49.660% (6420/12928)\n",
"Loss: 0.001 | Acc: 50.113% (12893/25728)\n",
"Loss: 0.001 | Acc: 50.086% (19297/38528)\n",
"Loss: 0.001 | Acc: 49.984% (25656/51328)\n",
"Loss: 0.001 | Acc: 50.042% (32091/64128)\n",
"Loss: 0.001 | Acc: 50.055% (38506/76928)\n",
"Loss: 0.001 | Acc: 50.031% (44892/89728)\n",
"Accuracy on validation images: 50.000 %\n",
"Loss of the network on validation images: 0.042\n",
"Epoch 4\n",
"Loss: 0.001 | Acc: 55.469% (71/128)\n",
"Loss: 0.001 | Acc: 49.675% (6422/12928)\n",
"Loss: 0.001 | Acc: 49.949% (12851/25728)\n",
"Loss: 0.001 | Acc: 49.857% (19209/38528)\n",
"Loss: 0.001 | Acc: 49.897% (25611/51328)\n",
"Loss: 0.001 | Acc: 49.992% (32059/64128)\n",
"Loss: 0.001 | Acc: 50.035% (38491/76928)\n",
"Loss: 0.001 | Acc: 49.997% (44861/89728)\n",
"Accuracy on validation images: 50.000 %\n",
"Loss of the network on validation images: 0.028\n",
"Epoch 5\n",
"Loss: 0.000 | Acc: 51.562% (66/128)\n",
"Loss: 0.000 | Acc: 49.946% (6457/12928)\n",
"Loss: 0.000 | Acc: 49.965% (12855/25728)\n",
"Loss: 0.000 | Acc: 49.927% (19236/38528)\n",
"Loss: 0.000 | Acc: 49.834% (25579/51328)\n",
"Loss: 0.000 | Acc: 50.027% (32081/64128)\n",
"Loss: 0.000 | Acc: 49.936% (38415/76928)\n",
"Loss: 0.000 | Acc: 49.949% (44818/89728)\n",
"Accuracy on validation images: 50.000 %\n",
"Loss of the network on validation images: 0.019\n",
"Epoch 6\n",
"Loss: 0.000 | Acc: 47.656% (61/128)\n",
"Loss: 0.000 | Acc: 49.698% (6425/12928)\n",
"Loss: 0.000 | Acc: 49.502% (12736/25728)\n",
"Loss: 0.000 | Acc: 49.829% (19198/38528)\n",
"Loss: 0.000 | Acc: 49.998% (25663/51328)\n",
"Loss: 0.000 | Acc: 50.090% (32122/64128)\n",
"Loss: 0.000 | Acc: 50.096% (38538/76928)\n",
"Loss: 0.000 | Acc: 50.029% (44890/89728)\n",
"Accuracy on validation images: 50.000 %\n",
"Loss of the network on validation images: 0.015\n",
"Epoch 7\n",
"Loss: 0.000 | Acc: 47.656% (61/128)\n",
"Loss: 0.000 | Acc: 49.907% (6452/12928)\n",
"Loss: 0.000 | Acc: 49.763% (12803/25728)\n",
"Loss: 0.000 | Acc: 49.624% (19119/38528)\n",
"Loss: 0.000 | Acc: 49.774% (25548/51328)\n",
"Loss: 0.000 | Acc: 49.843% (31963/64128)\n",
"Loss: 0.000 | Acc: 49.858% (38355/76928)\n",
"Loss: 0.000 | Acc: 49.919% (44791/89728)\n",
"Accuracy on validation images: 50.000 %\n",
"Loss of the network on validation images: 0.012\n",
"Epoch 8\n",
"Loss: 0.000 | Acc: 52.344% (67/128)\n",
"Loss: 0.000 | Acc: 49.845% (6444/12928)\n",
"Loss: 0.000 | Acc: 49.743% (12798/25728)\n",
"Loss: 0.000 | Acc: 49.933% (19238/38528)\n",
"Loss: 0.000 | Acc: 49.864% (25594/51328)\n",
"Loss: 0.000 | Acc: 49.900% (32000/64128)\n",
"Loss: 0.000 | Acc: 49.847% (38346/76928)\n",
"Loss: 0.000 | Acc: 49.943% (44813/89728)\n",
"Accuracy on validation images: 50.000 %\n",
"Loss of the network on validation images: 0.010\n",
"Epoch 9\n",
"Loss: 0.000 | Acc: 47.656% (61/128)\n",
"Loss: 0.000 | Acc: 49.544% (6405/12928)\n",
"Loss: 0.000 | Acc: 50.058% (12879/25728)\n",
"Loss: 0.000 | Acc: 49.966% (19251/38528)\n",
"Loss: 0.000 | Acc: 49.932% (25629/51328)\n",
"Loss: 0.000 | Acc: 49.896% (31997/64128)\n",
"Loss: 0.000 | Acc: 49.865% (38360/76928)\n",
"Loss: 0.000 | Acc: 49.918% (44790/89728)\n",
"Accuracy on validation images: 50.000 %\n",
"Loss of the network on validation images: 0.008\n",
"Epoch 10\n",
"Loss: 0.000 | Acc: 56.250% (72/128)\n",
"Loss: 0.000 | Acc: 50.333% (6507/12928)\n",
"Loss: 0.000 | Acc: 49.984% (12860/25728)\n",
"Loss: 0.000 | Acc: 49.920% (19233/38528)\n",
"Loss: 0.000 | Acc: 49.910% (25618/51328)\n",
"Loss: 0.000 | Acc: 49.977% (32049/64128)\n",
"Loss: 0.000 | Acc: 50.029% (38486/76928)\n",
"Loss: 0.000 | Acc: 50.016% (44878/89728)\n",
"Accuracy on validation images: 50.000 %\n",
"Loss of the network on validation images: 0.007\n",
"Epoch 11\n",
"Loss: 0.000 | Acc: 47.656% (61/128)\n",
"Loss: 0.000 | Acc: 50.000% (6464/12928)\n",
"Loss: 0.000 | Acc: 49.977% (12858/25728)\n",
"Loss: 0.000 | Acc: 49.844% (19204/38528)\n",
"Loss: 0.000 | Acc: 49.914% (25620/51328)\n",
"Loss: 0.000 | Acc: 49.941% (32026/64128)\n",
"Loss: 0.000 | Acc: 50.056% (38507/76928)\n",
"Loss: 0.000 | Acc: 49.999% (44863/89728)\n",
"Accuracy on validation images: 50.000 %\n",
"Loss of the network on validation images: 0.006\n",
"Epoch 12\n",
"Loss: 0.000 | Acc: 54.688% (70/128)\n",
"Loss: 0.000 | Acc: 49.722% (6428/12928)\n",
"Loss: 0.000 | Acc: 49.708% (12789/25728)\n",
"Loss: 0.000 | Acc: 49.878% (19217/38528)\n",
"Loss: 0.000 | Acc: 49.813% (25568/51328)\n",
"Loss: 0.000 | Acc: 49.872% (31982/64128)\n",
"Loss: 0.000 | Acc: 49.914% (38398/76928)\n",
"Loss: 0.000 | Acc: 49.964% (44832/89728)\n",
"Accuracy on validation images: 50.000 %\n",
"Loss of the network on validation images: 0.006\n",
"Epoch 13\n",
"Loss: 0.000 | Acc: 42.969% (55/128)\n",
"Loss: 0.000 | Acc: 49.783% (6436/12928)\n",
"Loss: 0.000 | Acc: 50.117% (12894/25728)\n",
"Loss: 0.000 | Acc: 49.862% (19211/38528)\n",
"Loss: 0.000 | Acc: 50.037% (25683/51328)\n",
"Loss: 0.000 | Acc: 50.016% (32074/64128)\n",
"Loss: 0.000 | Acc: 50.053% (38505/76928)\n",
"Loss: 0.000 | Acc: 50.052% (44911/89728)\n",
"Accuracy on validation images: 50.000 %\n",
"Loss of the network on validation images: 0.005\n",
"Epoch 14\n",
"Loss: 0.000 | Acc: 42.188% (54/128)\n",
"Loss: 0.000 | Acc: 49.814% (6440/12928)\n",
"Loss: 0.000 | Acc: 50.000% (12864/25728)\n",
"Loss: 0.000 | Acc: 49.938% (19240/38528)\n",
"Loss: 0.000 | Acc: 50.094% (25712/51328)\n",
"Loss: 0.000 | Acc: 49.950% (32032/64128)\n",
"Loss: 0.000 | Acc: 50.087% (38531/76928)\n",
"Loss: 0.000 | Acc: 50.036% (44896/89728)\n",
"Accuracy on validation images: 50.000 %\n",
"Loss of the network on validation images: 0.004\n",
"Epoch 15\n",
"Loss: 0.000 | Acc: 47.656% (61/128)\n",
"Loss: 0.000 | Acc: 49.899% (6451/12928)\n",
"Loss: 0.000 | Acc: 49.891% (12836/25728)\n",
"Loss: 0.000 | Acc: 50.096% (19301/38528)\n",
"Loss: 0.000 | Acc: 50.056% (25693/51328)\n",
"Loss: 0.000 | Acc: 49.961% (32039/64128)\n",
"Loss: 0.000 | Acc: 50.086% (38530/76928)\n",
"Loss: 0.000 | Acc: 50.031% (44892/89728)\n",
"Accuracy on validation images: 50.000 %\n",
"Loss of the network on validation images: 0.004\n",
"Epoch 16\n",
"Loss: 0.000 | Acc: 44.531% (57/128)\n",
"Loss: 0.000 | Acc: 49.691% (6424/12928)\n",
"Loss: 0.000 | Acc: 49.685% (12783/25728)\n",
"Loss: 0.000 | Acc: 49.901% (19226/38528)\n",
"Loss: 0.000 | Acc: 50.041% (25685/51328)\n",
"Loss: 0.000 | Acc: 50.067% (32107/64128)\n",
"Loss: 0.000 | Acc: 50.043% (38497/76928)\n",
"Loss: 0.000 | Acc: 49.982% (44848/89728)\n",
"Accuracy on validation images: 50.000 %\n",
"Loss of the network on validation images: 0.004\n",
"Epoch 17\n",
"Loss: 0.000 | Acc: 48.438% (62/128)\n",
"Loss: 0.000 | Acc: 50.124% (6480/12928)\n",
"Loss: 0.000 | Acc: 49.837% (12822/25728)\n",
"Loss: 0.000 | Acc: 49.657% (19132/38528)\n",
"Loss: 0.000 | Acc: 49.725% (25523/51328)\n",
"Loss: 0.000 | Acc: 49.986% (32055/64128)\n",
"Loss: 0.000 | Acc: 50.038% (38493/76928)\n",
"Loss: 0.000 | Acc: 50.041% (44901/89728)\n",
"Accuracy on validation images: 50.000 %\n",
"Loss of the network on validation images: 0.003\n",
"Epoch 18\n",
"Loss: 0.000 | Acc: 56.250% (72/128)\n",
"Loss: 0.000 | Acc: 49.752% (6432/12928)\n",
"Loss: 0.000 | Acc: 49.938% (12848/25728)\n",
"Loss: 0.000 | Acc: 49.702% (19149/38528)\n",
"Loss: 0.000 | Acc: 49.807% (25565/51328)\n",
"Loss: 0.000 | Acc: 49.785% (31926/64128)\n",
"Loss: 0.000 | Acc: 49.965% (38437/76928)\n",
"Loss: 0.000 | Acc: 49.952% (44821/89728)\n",
"Accuracy on validation images: 50.000 %\n",
"Loss of the network on validation images: 0.003\n",
"Epoch 19\n",
"Loss: 0.000 | Acc: 47.656% (61/128)\n",
"Loss: 0.000 | Acc: 50.511% (6530/12928)\n",
"Loss: 0.000 | Acc: 50.292% (12939/25728)\n",
"Loss: 0.000 | Acc: 50.117% (19309/38528)\n",
"Loss: 0.000 | Acc: 50.160% (25746/51328)\n",
"Loss: 0.000 | Acc: 50.106% (32132/64128)\n",
"Loss: 0.000 | Acc: 50.087% (38531/76928)\n",
"Loss: 0.000 | Acc: 49.964% (44832/89728)\n",
"Accuracy on validation images: 50.000 %\n",
"Loss of the network on validation images: 0.003\n",
"Epoch 20\n",
"Loss: 0.000 | Acc: 57.031% (73/128)\n",
"Loss: 0.000 | Acc: 50.015% (6466/12928)\n",
"Loss: 0.000 | Acc: 50.078% (12884/25728)\n",
"Loss: 0.000 | Acc: 50.008% (19267/38528)\n",
"Loss: 0.000 | Acc: 50.064% (25697/51328)\n",
"Loss: 0.000 | Acc: 49.959% (32038/64128)\n",
"Loss: 0.000 | Acc: 49.966% (38438/76928)\n",
"Loss: 0.000 | Acc: 50.030% (44891/89728)\n",
"Accuracy on validation images: 50.000 %\n",
"Loss of the network on validation images: 0.003\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "xpxemSNaQS8r",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"outputId": "779c9b20-9153-41b7-ec1a-79da34eabb80"
},
"source": [
"model.load_state_dict(best_wts)\n",
"print(f\"min loss: {min_loss}\")"
],
"execution_count": 24,
"outputs": [
{
"output_type": "stream",
"text": [
"min loss: 0.002672908065505908\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "VAxTOdxxzsnM",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"outputId": "b337dd06-cc2b-400f-f6da-491d1a688d2f"
},
"source": [
"data, y_true = next(iter(val_loader))\n",
"y_pred = model(data.to(device)).to(device)\n",
"y_pred = torch.reshape(y_pred, (y_pred.shape[0],)).to(device)\n",
"y_true = y_true.to(device)\n",
"criterion(y_pred, y_true)"
],
"execution_count": 25,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"tensor(1.8398e-05, device='cuda:0', grad_fn=<DivBackward0>)"
]
},
"metadata": {
"tags": []
},
"execution_count": 25
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "rxbtFxUORrJh",
"colab_type": "code",
"colab": {}
},
"source": [
"torch.save(best_wts, \"drive/My Drive/tricky_wts.pth\")"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "1iOKPOlfQlSF",
"colab_type": "text"
},
"source": [
"## Make test predictions"
]
},
{
"cell_type": "code",
"metadata": {
"id": "MSVfbR5EF4VA",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"outputId": "8ca95256-82b2-4dc4-da42-12a04a3f0c07"
},
"source": [
"test_loc = \"data/test/test\"\n",
"images = os.listdir(test_loc)\n",
"len(images)"
],
"execution_count": 30,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"20000"
]
},
"metadata": {
"tags": []
},
"execution_count": 30
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "1wMGCTxIVOTC",
"colab_type": "code",
"colab": {}
},
"source": [
"imsize = 256\n",
"loader = transforms.Compose([transforms.Gray(imsize), transforms.ToTensor()])\n",
"\n",
"def image_loader(image_name):\n",
" \"\"\"load image, returns cuda tensor\"\"\"\n",
" image = Image.open(image_name)\n",
" image = loader(image).float()\n",
" image = Variable(image, requires_grad=True)\n",
" image = image.unsqueeze(0) #this is for VGG, may not be needed for ResNet\n",
" return image.cuda() #assumes that you're using GPU\n",
"\n",
"image = image_loader(PATH TO IMAGE)\n",
"\n",
"your_trained_net(image)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "mWanaVpxTFvw",
"colab_type": "code",
"colab": {}
},
"source": [
"import csv "
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "ehjuJnQVV6IZ",
"colab_type": "code",
"colab": {}
},
"source": [
"model.eval()\n",
"count = 0\n",
"new_results = []\n",
"with torch.no_grad():\n",
" for (data, title) in test_loader:\n",
" data = data.to(device)\n",
" output = model(data)\n",
" new_results.append(output.item())"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "2MgxqR-rYfVt",
"colab_type": "code",
"colab": {}
},
"source": [
"with open('new_results.csv', 'w', newline='') as file:\n",
" writer = csv.writer(file)\n",
" writer.writerow([\"imagename\", \"is_fake\"])\n",
" for i in range(len(new_results)):\n",
" writer.writerow([images[i], new_results[i]])"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "FL9IM13XZB52",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 203
},
"outputId": "adc029d4-0664-4c7f-b5bc-1fd4980090e8"
},
"source": [
"df = pd.read_csv(\"new_results.csv\")\n",
"df.head()"
],
"execution_count": 47,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>imagename</th>\n",
" <th>is_fake</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>12782.png</td>\n",
" <td>0.999987</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1027.png</td>\n",
" <td>0.999975</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>7063.png</td>\n",
" <td>0.999977</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>18047.png</td>\n",
" <td>0.999987</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>11015.png</td>\n",
" <td>0.999988</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" imagename is_fake\n",
"0 12782.png 0.999987\n",
"1 1027.png 0.999975\n",
"2 7063.png 0.999977\n",
"3 18047.png 0.999987\n",
"4 11015.png 0.999988"
]
},
"metadata": {
"tags": []
},
"execution_count": 47
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "7tSMq4BDZVuk",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"outputId": "94d1bd4e-49fe-49ec-997d-6ae7e9ccdee7"
},
"source": [
"np.round(df['is_fake'].to_numpy()).sum()"
],
"execution_count": 48,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"20000.0"
]
},
"metadata": {
"tags": []
},
"execution_count": 48
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "V42eJR5GbDo_",
"colab_type": "code",
"colab": {}
},
"source": [
"# as we can see, the model just thinks all images are real ];"
],
"execution_count": 0,
"outputs": []
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment