Created
December 26, 2018 13:53
-
-
Save NTT123/d35478eb15d4930c5d95527d79f2caba to your computer and use it in GitHub Desktop.
RN.ipynb
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"nbformat": 4, | |
"nbformat_minor": 0, | |
"metadata": { | |
"colab": { | |
"name": "RN.ipynb", | |
"version": "0.3.2", | |
"provenance": [], | |
"collapsed_sections": [], | |
"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/NTT123/d35478eb15d4930c5d95527d79f2caba/rn.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>" | |
] | |
}, | |
{ | |
"metadata": { | |
"id": "COHBUzv3LakE", | |
"colab_type": "text" | |
}, | |
"cell_type": "markdown", | |
"source": [ | |
"# Relational Neural Network\n", | |
"\n", | |
"A simple neural network module for relational reasoning\n", | |
"\n", | |
"https://arxiv.org/abs/1706.01427\n", | |
"https://papers.nips.cc/paper/7082-a-simple-neural-network-module-for-relational-reasoning.pdf" | |
] | |
}, | |
{ | |
"metadata": { | |
"id": "_7cbY0u-tJP6", | |
"colab_type": "toc" | |
}, | |
"cell_type": "markdown", | |
"source": [ | |
">[Relational Neural Network](#scrollTo=COHBUzv3LakE)\n", | |
"\n", | |
">>[Sort-of-CLEVR dataset](#scrollTo=5z5GYCfYL1a4)\n", | |
"\n", | |
">>[Model](#scrollTo=WYMqN9ttpyaP)\n", | |
"\n", | |
">>[Dataloader](#scrollTo=cvXcnub4yZBu)\n", | |
"\n", | |
">>[Training](#scrollTo=dVGlOWPu2qsT)\n", | |
"\n", | |
">>[Demo](#scrollTo=KReoH3_uglVK)\n", | |
"\n" | |
] | |
}, | |
{ | |
"metadata": { | |
"id": "5z5GYCfYL1a4", | |
"colab_type": "text" | |
}, | |
"cell_type": "markdown", | |
"source": [ | |
"## Sort-of-CLEVR dataset" | |
] | |
}, | |
{ | |
"metadata": { | |
"id": "EdWfXpbuC86o", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 765 | |
}, | |
"outputId": "faca9f37-d575-4d8c-d9ee-fe11c4f628fd" | |
}, | |
"cell_type": "code", | |
"source": [ | |
"!apt install libcairo2-dev -y -q\n", | |
"!pip install pycairo -q\n", | |
"!wget -q \"https://media.wired.com/photos/5aecf815efa7377a337590ee/master/w_582,c_limit/FINALGettyImages-950416996-.jpg\" -O bg.jpg\n", | |
"!pip3 install tensorboardX" | |
], | |
"execution_count": 1, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"Reading package lists...\n", | |
"Building dependency tree...\n", | |
"Reading state information...\n", | |
"The following additional packages will be installed:\n", | |
" libcairo-script-interpreter2 libpixman-1-dev libxcb-shm0-dev\n", | |
"Suggested packages:\n", | |
" libcairo2-doc\n", | |
"The following NEW packages will be installed:\n", | |
" libcairo-script-interpreter2 libcairo2-dev libpixman-1-dev libxcb-shm0-dev\n", | |
"0 upgraded, 4 newly installed, 0 to remove and 8 not upgraded.\n", | |
"Need to get 930 kB of archives.\n", | |
"After this operation, 3,985 kB of additional disk space will be used.\n", | |
"Get:1 http://archive.ubuntu.com/ubuntu bionic/main amd64 libcairo-script-interpreter2 amd64 1.15.10-2 [53.4 kB]\n", | |
"Get:2 http://archive.ubuntu.com/ubuntu bionic/main amd64 libpixman-1-dev amd64 0.34.0-2 [244 kB]\n", | |
"Get:3 http://archive.ubuntu.com/ubuntu bionic/main amd64 libxcb-shm0-dev amd64 1.13-1 [6,676 B]\n", | |
"Get:4 http://archive.ubuntu.com/ubuntu bionic/main amd64 libcairo2-dev amd64 1.15.10-2 [626 kB]\n", | |
"Fetched 930 kB in 2s (386 kB/s)\n", | |
"Selecting previously unselected package libcairo-script-interpreter2:amd64.\n", | |
"(Reading database ... 110842 files and directories currently installed.)\n", | |
"Preparing to unpack .../libcairo-script-interpreter2_1.15.10-2_amd64.deb ...\n", | |
"Unpacking libcairo-script-interpreter2:amd64 (1.15.10-2) ...\n", | |
"Selecting previously unselected package libpixman-1-dev:amd64.\n", | |
"Preparing to unpack .../libpixman-1-dev_0.34.0-2_amd64.deb ...\n", | |
"Unpacking libpixman-1-dev:amd64 (0.34.0-2) ...\n", | |
"Selecting previously unselected package libxcb-shm0-dev:amd64.\n", | |
"Preparing to unpack .../libxcb-shm0-dev_1.13-1_amd64.deb ...\n", | |
"Unpacking libxcb-shm0-dev:amd64 (1.13-1) ...\n", | |
"Selecting previously unselected package libcairo2-dev:amd64.\n", | |
"Preparing to unpack .../libcairo2-dev_1.15.10-2_amd64.deb ...\n", | |
"Unpacking libcairo2-dev:amd64 (1.15.10-2) ...\n", | |
"Setting up libcairo-script-interpreter2:amd64 (1.15.10-2) ...\n", | |
"Setting up libxcb-shm0-dev:amd64 (1.13-1) ...\n", | |
"Processing triggers for libc-bin (2.27-3ubuntu1) ...\n", | |
"Setting up libpixman-1-dev:amd64 (0.34.0-2) ...\n", | |
"Setting up libcairo2-dev:amd64 (1.15.10-2) ...\n", | |
"Collecting tensorboardX\n", | |
"\u001b[?25l Downloading https://files.pythonhosted.org/packages/3b/10/0cc87d34b4a02109bee5f7b9bd9c95524fbb540311f6fbcc3758591a3f3a/tensorboardX-1.5-py2.py3-none-any.whl (112kB)\n", | |
"\u001b[K 100% |████████████████████████████████| 112kB 2.7MB/s \n", | |
"\u001b[?25hRequirement already satisfied: six in /usr/local/lib/python3.6/dist-packages (from tensorboardX) (1.11.0)\n", | |
"Requirement already satisfied: protobuf>=3.2.0 in /usr/local/lib/python3.6/dist-packages (from tensorboardX) (3.6.1)\n", | |
"Requirement already satisfied: numpy in /usr/local/lib/python3.6/dist-packages (from tensorboardX) (1.14.6)\n", | |
"Requirement already satisfied: setuptools in /usr/local/lib/python3.6/dist-packages (from protobuf>=3.2.0->tensorboardX) (40.6.3)\n", | |
"Installing collected packages: tensorboardX\n", | |
"Successfully installed tensorboardX-1.5\n" | |
], | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"metadata": { | |
"id": "K47z0QEOSBXd", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"cell_type": "code", | |
"source": [ | |
"import random\n", | |
"import cairo\n", | |
"import math \n", | |
"from PIL import Image\n", | |
"import numpy as np\n", | |
"\n", | |
"class Object(object):\n", | |
" def __init__(self, shape, color, pos):\n", | |
" self._shape = shape\n", | |
" self._color = color\n", | |
" self._pos = pos\n", | |
"\n", | |
" \n", | |
"colorlist = ['red', 'blue', 'green', 'orange', 'yellow', 'gray']\n", | |
"\n", | |
"colors = {\n", | |
"'red' : (255/255 , 8/255, 0/255),\n", | |
"'blue' : (31 /255 , 117/255, 254/255),\n", | |
"'green' : (74 /255 , 255/255, 0/255),\n", | |
"'orange' : (237/255 , 135/255, 45/255),\n", | |
"'yellow' : (255/255 , 246/255, 0/255),\n", | |
"'gray' : (103/255 , 103/255, 103/255),\n", | |
"}\n", | |
"\n", | |
"class Env(object):\n", | |
" def __init__(self, bg, num_obj=6, size=75, obj_size=5):\n", | |
" self._num_obj = num_obj\n", | |
" self._size = size\n", | |
" self._obj_size = obj_size\n", | |
" bg = Image.open(bg)\n", | |
" x = random.randint(0, bg.size[0]-1-size)\n", | |
" y = random.randint(0, bg.size[1]-1-size)\n", | |
" bg = bg.crop( box=(x, y, x+size, y+size) )\n", | |
" bg.save(\"mybg__.png\")\n", | |
" self._bg = cairo.ImageSurface.create_from_png(\"mybg__.png\")\n", | |
" self._objs = []\n", | |
" for i in range(num_obj):\n", | |
" color = colorlist[i]\n", | |
" shape = random.choice(['square', 'circle'])\n", | |
" done = False\n", | |
" while not done:\n", | |
" pos = random.randint(obj_size, size-obj_size-1), random.randint(obj_size, size-obj_size-1)\n", | |
" for o in self._objs:\n", | |
" dx = o._pos[0] - pos[0]\n", | |
" dy = o._pos[1] - pos[1]\n", | |
" \n", | |
" if dx**2 + dy**2 < 2 * (2*obj_size)**2:\n", | |
" break\n", | |
" else:\n", | |
" done = True\n", | |
" self._objs.append(Object(shape=shape, color=color, pos=pos))\n", | |
" def render(self, filename):\n", | |
" with cairo.ImageSurface(cairo.FORMAT_ARGB32, self._size, self._size) as surface:\n", | |
" context = cairo.Context(surface)\n", | |
" #context.set_line_width(0.04)\n", | |
" \n", | |
" #context.set_source_rgb(0.9, 0.9, 0.9)\n", | |
" #context.rectangle(0, 0, self._size, self._size)\n", | |
" #context.fill()\n", | |
" \n", | |
" context.set_source_surface(self._bg, 0.0, 0.0)\n", | |
" context.paint()\n", | |
" \n", | |
" for o in self._objs:\n", | |
" if o._shape == \"circle\":\n", | |
" context.arc(o._pos[0], o._pos[1], self._obj_size, 0.0, 2.0*math.pi)\n", | |
" \n", | |
" if o._shape == \"square\":\n", | |
" x1, y1 = o._pos[0] - self._obj_size, o._pos[1] - self._obj_size\n", | |
" context.rectangle(x1, y1, 2*self._obj_size , 2*self._obj_size)\n", | |
" \n", | |
" context.set_source_rgb( *colors[o._color ] )\n", | |
" context.fill_preserve()\n", | |
" context.set_source_rgb(0.1, 0.1, 0.1)\n", | |
" context.set_line_width(1)\n", | |
" context.stroke()\n", | |
"\n", | |
" surface.write_to_png(filename)\n", | |
" \n", | |
" def generate_question(self):\n", | |
" bits = [0 for _ in range(11)]\n", | |
" bits[random.randint(0, 5)] = 1 # color\n", | |
" bits[6 + random.randint(0, 1)] = 1 # question type\n", | |
" bits[8 + random.randint(0, 2)] = 1 # question subtype\n", | |
" \n", | |
" return bits\n", | |
" \n", | |
" def answer_type_1_q1(self, o):\n", | |
" # What is the shape of the red object?\n", | |
" return o._shape\n", | |
" \n", | |
" def answer_type_1_q2(self, o):\n", | |
" # Is the red object on the left or right of the image?\n", | |
" if o._pos[0] < self._size//2:\n", | |
" return \"left\"\n", | |
" else:\n", | |
" return \"right\"\n", | |
"\n", | |
" def answer_type_1_q3(self, o):\n", | |
" # Is the red object on the top or bottom of the image?\n", | |
" if o._pos[1] < self._size//2:\n", | |
" return \"top\"\n", | |
" else:\n", | |
" return \"bottom\"\n", | |
"\n", | |
" def answer_type_2_q1(self, o):\n", | |
" # What is the shape of the object that is closest to the green object?\n", | |
" mindist = None\n", | |
" minobj = None\n", | |
" for oo in self._objs:\n", | |
" if oo._color != o._color:\n", | |
" dist = (o._pos[0] - oo._pos[0])**2 + (o._pos[1] - oo._pos[1])**2\n", | |
" if mindist == None:\n", | |
" mindist = dist\n", | |
" minobj = oo\n", | |
" elif mindist > dist:\n", | |
" mindist = dist\n", | |
" minobj = oo\n", | |
" return minobj._shape\n", | |
" \n", | |
" \n", | |
" def answer_type_2_q2(self, o):\n", | |
" # What is the shape of the object that is furthest from the green object?\n", | |
" maxdist = None\n", | |
" maxobj = None\n", | |
" for oo in self._objs:\n", | |
" if oo._color != o._color:\n", | |
" dist = (o._pos[0] - oo._pos[0])**2 + (o._pos[1] - oo._pos[1])**2\n", | |
" if maxdist == None:\n", | |
" maxdist = dist\n", | |
" maxobj = oo\n", | |
" elif maxdist < dist:\n", | |
" maxdist = dist\n", | |
" maxobj = oo\n", | |
" return maxobj._shape\n", | |
"\n", | |
" def answer_type_2_q3(self, o):\n", | |
" # How many objects have the shape of the green object? \n", | |
" c = 0\n", | |
" for oo in self._objs:\n", | |
" if oo._shape == o._shape:\n", | |
" c = c + 1\n", | |
" \n", | |
" return str(c)\n", | |
" \n", | |
" def parse_question(self, question):\n", | |
" for i in range(6):\n", | |
" if question[i] == 1:\n", | |
" color = colorlist[i]\n", | |
" \n", | |
" typ= question[6]\n", | |
" subtype = question[8] * 2 + question[9] * 1 + question[10] * 0 \n", | |
" return color, typ, subtype\n", | |
" \n", | |
" def answer_question(self, question):\n", | |
" c, t, st = self.parse_question(question)\n", | |
" for o in self._objs:\n", | |
" if o._color == c:\n", | |
" break\n", | |
" oracle = [self.answer_type_1_q1, self.answer_type_1_q2, self.answer_type_1_q3]\n", | |
" oracle += [self.answer_type_2_q1, self.answer_type_2_q2, self.answer_type_2_q3]\n", | |
" \n", | |
" return oracle[st + t*3](o)\n", | |
"\n", | |
" def question_to_english(self, question):\n", | |
" lst = [ \"What is the shape of the {} object?\",\n", | |
" \"Is the {} object on the left or right of the image?\",\n", | |
" \"Is the {} object on the top or bottom of the image?\",\n", | |
" \"What is the shape of the object that is closest to the {} object?\",\n", | |
" \"What is the shape of the object that is furthest from the {} object?\",\n", | |
" \"How many objects have the shape of the {} object?\" ]\n", | |
" \n", | |
" c, t, st = self.parse_question(question)\n", | |
" print(t, st, c, st + 3*t)\n", | |
" return lst[st + 3*t].format(c)\n", | |
" " | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"id": "R8sAbpBMypBJ", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"cell_type": "code", | |
"source": [ | |
"def generate_example(bg, out):\n", | |
" myenv = Env(bg, size=128, obj_size=10)\n", | |
" pair = []\n", | |
" for _ in range(20):\n", | |
" q = myenv.generate_question()\n", | |
" ans = myenv.answer_question(q)\n", | |
" q = \"\".join(map(str, q))\n", | |
" pair.append(\"{} {} {}\".format(out, q, ans.rjust(10)))\n", | |
" \n", | |
" myenv.render(out)\n", | |
" return \"\\n\".join(pair) " | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"id": "1qHucBiCZEs6", | |
"colab_type": "code", | |
"outputId": "09ddbe20-3719-4d3f-a621-b501733c6f8f", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 145 | |
} | |
}, | |
"cell_type": "code", | |
"source": [ | |
"!mkdir env\n", | |
"examples = []\n", | |
"for i in range(10_000):\n", | |
" examples.append(generate_example(\"bg.jpg\", \"env/{0:05d}.png\".format(i)))\n", | |
" \n", | |
"open('SortOfCLEVR.txt', \"w\").write(\"\\n\".join(examples))\n", | |
"from PIL import Image\n", | |
"Image.open(\"env/00000.png\")" | |
], | |
"execution_count": 4, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<PIL.PngImagePlugin.PngImageFile image mode=RGB size=128x128 at 0x7F76C9F72A58>" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
}, | |
"execution_count": 4 | |
} | |
] | |
}, | |
{ | |
"metadata": { | |
"id": "uuPAzxbx36EG", | |
"colab_type": "code", | |
"outputId": "90add681-71c0-46c1-f5b4-46793dae64c9", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 85 | |
} | |
}, | |
"cell_type": "code", | |
"source": [ | |
"!head -n 4 SortOfCLEVR.txt" | |
], | |
"execution_count": 5, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"env/00000.png 10000010001 circle\n", | |
"env/00000.png 10000010001 circle\n", | |
"env/00000.png 10000001100 bottom\n", | |
"env/00000.png 00000110100 6\n" | |
], | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"metadata": { | |
"id": "ApDo28rc2lD4", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 145 | |
}, | |
"outputId": "5dc7a1ae-1410-4937-bdd9-f1f7c80680d9" | |
}, | |
"cell_type": "code", | |
"source": [ | |
"!mkdir env_test\n", | |
"examples = []\n", | |
"for i in range(1000):\n", | |
" examples.append(generate_example(\"bg.jpg\", \"env_test/{0:05d}.png\".format(i)))\n", | |
" \n", | |
"open('SortOfCLEVR_test.txt', \"w\").write(\"\\n\".join(examples))\n", | |
"Image.open(\"env_test/00000.png\")" | |
], | |
"execution_count": 6, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"image/png": "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\nRU5ErkJggg==\n", | |
"text/plain": [ | |
"<PIL.PngImagePlugin.PngImageFile image mode=RGB size=128x128 at 0x7F76C7C2E668>" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
}, | |
"execution_count": 6 | |
} | |
] | |
}, | |
{ | |
"metadata": { | |
"id": "dOF1eBHJuc-x", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 85 | |
}, | |
"outputId": "b92a00da-60c1-483e-eec3-07a2d6eee0c1" | |
}, | |
"cell_type": "code", | |
"source": [ | |
"!head -n 4 SortOfCLEVR_test.txt" | |
], | |
"execution_count": 7, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"env_test/00000.png 10000010010 square\n", | |
"env_test/00000.png 00001010100 3\n", | |
"env_test/00000.png 10000001001 square\n", | |
"env_test/00000.png 00000101001 circle\n" | |
], | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"metadata": { | |
"id": "WYMqN9ttpyaP", | |
"colab_type": "text" | |
}, | |
"cell_type": "markdown", | |
"source": [ | |
"## Model" | |
] | |
}, | |
{ | |
"metadata": { | |
"id": "N0oAIAE4ui0c", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 54 | |
}, | |
"outputId": "0add920f-7f02-4f30-97a7-6405aec1b4ea" | |
}, | |
"cell_type": "code", | |
"source": [ | |
"!pip3 install torch torchvision -q" | |
], | |
"execution_count": 8, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"tcmalloc: large alloc 1073750016 bytes == 0x6239c000 @ 0x7f60cb3d32a4 0x591a07 0x5b5d56 0x502e9a 0x506859 0x502209 0x502f3d 0x506859 0x504c28 0x502540 0x502f3d 0x506859 0x504c28 0x502540 0x502f3d 0x506859 0x504c28 0x502540 0x502f3d 0x507641 0x502209 0x502f3d 0x506859 0x504c28 0x502540 0x502f3d 0x507641 0x504c28 0x502540 0x502f3d 0x507641\n" | |
], | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"metadata": { | |
"id": "jjaRqZsrjk74", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"cell_type": "code", | |
"source": [ | |
"import torch\n", | |
"import torch.nn as nn\n", | |
"\n", | |
"class Encoder(nn.Module):\n", | |
" def __init__(self):\n", | |
" super().__init__()\n", | |
" self.seq = nn.Sequential(\n", | |
" nn.Conv2d(3, 24, 3, 2, 1, bias=False),\n", | |
" nn.BatchNorm2d(24), \n", | |
" nn.ReLU(),\n", | |
" nn.Conv2d(24, 24, 3, 2, 1, bias=False),\n", | |
" nn.BatchNorm2d(24), \n", | |
" nn.ReLU(),\n", | |
" nn.Conv2d(24, 24, 3, 2, 1, bias=False),\n", | |
" nn.BatchNorm2d(24), \n", | |
" nn.ReLU(),\n", | |
" nn.Conv2d(24, 24, 3, 2, 1, bias=False),\n", | |
" nn.BatchNorm2d(24), \n", | |
" nn.ReLU(),\n", | |
" )\n", | |
" \n", | |
" def forward(self, x):\n", | |
" x = self.seq(x)\n", | |
" \n", | |
" return x\n", | |
" \n", | |
"class RN(nn.Module):\n", | |
" def __init__(self):\n", | |
" super().__init__()\n", | |
" self.enc = Encoder()\n", | |
" self.relations = nn.Sequential(\n", | |
" nn.Conv2d(24*2+4 + 11, 128, 1, 1, 0, bias=False),\n", | |
" nn.BatchNorm2d(128),\n", | |
" nn.ReLU(),\n", | |
" nn.Conv2d(128, 128, 1, 1, 0, bias=False),\n", | |
" nn.BatchNorm2d(128),\n", | |
" nn.ReLU(),\n", | |
" nn.Conv2d(128, 128, 1, 1, 0, bias=False),\n", | |
" nn.BatchNorm2d(128),\n", | |
" nn.ReLU(),\n", | |
" nn.Conv2d(128, 128, 1, 1, 0, bias=False),\n", | |
" nn.BatchNorm2d(128),\n", | |
" nn.ReLU(),\n", | |
" )\n", | |
" \n", | |
" self.output = nn.Sequential(\n", | |
" nn.Conv2d(128, 128, 1, 1, 0, bias=False),\n", | |
" nn.BatchNorm2d(128),\n", | |
" nn.ReLU(),\n", | |
"\n", | |
" nn.Conv2d(128, 128, 1, 1, 0, bias=False),\n", | |
" nn.BatchNorm2d(128),\n", | |
" nn.ReLU(),\n", | |
"\n", | |
" nn.Conv2d(128, 128, 1, 1, 0, bias=False),\n", | |
" nn.BatchNorm2d(128),\n", | |
" nn.ReLU(),\n", | |
" \n", | |
" nn.Dropout2d(0.5),\n", | |
"\n", | |
" nn.Conv2d(128, 12, 1, 1, 0, bias=False),\n", | |
" nn.BatchNorm2d(12),\n", | |
" )\n", | |
" \n", | |
" tag = torch.linspace(-1, 1, 8)\n", | |
" tagx = tag.unsqueeze(0).expand(8,8)\n", | |
" tagy = tag.unsqueeze(1).expand(8,8)\n", | |
" tag = torch.stack((tagx, tagy), dim=0)\n", | |
" \n", | |
" self.register_buffer('tag', tag.unsqueeze(0)) \n", | |
" \n", | |
" def forward(self, x, q):\n", | |
" x = self.enc(x)\n", | |
" \n", | |
" tag = self.tag.expand(x.shape[0], self.tag.shape[1], self.tag.shape[2], self.tag.shape[3])\n", | |
" \n", | |
" x = torch.cat((x, tag), dim=1)\n", | |
" \n", | |
" x = x.reshape(x.shape[0], x.shape[1], -1)\n", | |
" \n", | |
" x1 = x.unsqueeze(2)\n", | |
" x2 = x.unsqueeze(3)\n", | |
" \n", | |
" x1 = x1.expand(-1, -1, x1.shape[3], -1)\n", | |
" x2 = x2.expand(-1, -1, -1, x2.shape[2])\n", | |
" \n", | |
" q = q.unsqueeze(2).unsqueeze(3)\n", | |
" q = q.expand(-1, -1, x1.shape[2], x1.shape[3])\n", | |
" \n", | |
" x = torch.cat((x1, x2, q), dim=1)\n", | |
" \n", | |
" x = self.relations(x)\n", | |
" x = x.reshape(x.shape[0], x.shape[1], -1).sum(dim=2)#.sum(dim=2)\n", | |
" x = x.unsqueeze(2).unsqueeze(3)\n", | |
" x = self.output(x)\n", | |
" return x.squeeze()" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"id": "cvXcnub4yZBu", | |
"colab_type": "text" | |
}, | |
"cell_type": "markdown", | |
"source": [ | |
"## Dataloader" | |
] | |
}, | |
{ | |
"metadata": { | |
"id": "bZ8E0JPPzUOH", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"cell_type": "code", | |
"source": [ | |
"from torch.utils.data import Dataset, DataLoader\n", | |
"import numpy as np\n", | |
"import re" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"id": "yriHpSV3yatX", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"cell_type": "code", | |
"source": [ | |
"class SoCLEVR(Dataset):\n", | |
" def __init__(self, filename, output_dic = {}):\n", | |
" super().__init__()\n", | |
" \n", | |
" lines = open(filename, \"r\").readlines()\n", | |
" self.output_dic = output_dic\n", | |
" c = 0\n", | |
" \n", | |
" self.data = []\n", | |
" self.env = {}\n", | |
" \n", | |
" for line in lines:\n", | |
" line = line.strip()\n", | |
" e, q, a = re.split(\"[ ]+\", line)\n", | |
" \n", | |
" if e not in self.env:\n", | |
" img = Image.open(e)\n", | |
" self.env[e] = np.asarray(img)\n", | |
" \n", | |
" e = self.env[e]\n", | |
" \n", | |
" q = np.asarray(list(map(float, q)), dtype=np.float32)\n", | |
" \n", | |
" if a not in self.output_dic:\n", | |
" self.output_dic[a] = c\n", | |
" c = c + 1\n", | |
" \n", | |
" a = self.output_dic[a]\n", | |
" \n", | |
" self.data.append((e, q, a))\n", | |
" \n", | |
" def __len__(self):\n", | |
" return len(self.data)\n", | |
" \n", | |
" def __getitem__(self, idx):\n", | |
" return self.data[idx]" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"id": "LYZDIl_EzNKi", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"cell_type": "code", | |
"source": [ | |
"soclevr = SoCLEVR(\"SortOfCLEVR.txt\")\n", | |
"\n", | |
"soclevr_test = SoCLEVR(\"SortOfCLEVR_test.txt\", output_dic=soclevr.output_dic)" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"id": "ChkypNxK2gGk", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 350 | |
}, | |
"outputId": "b4221fe5-f960-4a23-cb4a-eae65b7982f3" | |
}, | |
"cell_type": "code", | |
"source": [ | |
"import matplotlib.pyplot as plt\n", | |
"plt.imshow(soclevr[1000][0])\n", | |
"_ = plt.axis(\"off\")" | |
], | |
"execution_count": 13, | |
"outputs": [ | |
{ | |
"output_type": "display_data", | |
"data": { | |
"image/png": "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\n+48vtrJf7D0FADDRtCv+RA53BpPLkTtTkP63npeGeu+9TGFaea5jevg2wkQzHtkhCxHdE/lQrtsI\nbrL38z2I0f/NF7Z5xwKqlPUes+MfThLGtxXfanybIJeS6zBkFd0oTB6xTKLQ0M7fjYLTlJc5S6/g\n8fJ9ViOXDyfsSePLvUaTfvc7M6xsZT01KLximGglXaFMVKFQKKqAPkQVCoWiCqg6r7COKN+Xd6rH\nWR8hq5q+876tyRinB6mVzz/ztJWNGktqa0MT6Ustonkj4n1mMqQSx50Qp4j3FXHvj0JczA4xk//P\nhaK/tpdkGSFOx7n/CQqnuftuJ5f60KkAgO0GOsfpIBNEuZnGsO9IycxJJ78CAPjL/VT16R+PPWxl\n/+aQr9FNpP6ff8guVtbA6ny9R+uMGCY92wsBjc+kfNc4zruA52Z5PanHWSc2LWn8eGxqiaXFsVcq\n0IYhV2qqcXwrpx1IhZ1bHyazxesLRZ2/4UEKY8pMptCmYeIDQpGdWjtvSc6q050koRmPkN7/j1mv\n0bqVHaxsnzF0fnWc315etcLKsnU05p4BXcvDdxazQ4pD2ua8MBsA8HCzmA8OnkDOsCTr5YFbD5lD\noXxusljvZtKx2Sbg+yXlUsQ4P+p4/bRzHYbw9TuOr1tDuxSyfv2pmfRF1XmFQqHYMPCiqJtikF8Q\niqXKp6+k+FT4HAcjjiV5N0adKoECXuRuR/+Y1iEI3Tx3enPnuJpSMS50wNT3ufM/xP4ecqoBNfQh\nd8lPDqNc7y37S6tlQ24qrcQmahIOxeBhclcMVBwmlDedbHkdNz++mftK3HrfDADA4y+/Y2VRHTl1\njjxuql12ZCMxUVP1qSQdk9HGjolf30eM7eFlIizVUr5+dhUxu98cKrnse9ZzwDhT+sipC7rMhHrx\nXDeEcmIVLr156XsU7jO6v3hJ9tiKEgTiZXK8JEvidAo4K8J2Q/aEOVU41/499u/c+KTUPX3kzbkA\ngK2Gk7PwnK9MtjLDA3vxdksdx8vji0hluI5rqC4tiHpx9D7EfI8YTLRxC+ce8phFd3B4XS4h5/4B\nT+39M18CADy3YJGVNQ2ikLQ4z93k7SUc6TjDnk1YnqNLl7n2AEcxIeZkiCQ5tM8z8XyR3EUlzqrw\nmki20IkRvI21rP/edRLWBGWiCoVCUQXUJrpZoGsVpTW/GyNv9X9M9afAsYkWCsQ+UimyZxXLcoxa\n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\np39GhZ95K9wAAAAASUVORK5CYII=\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x7f76ca650b38>" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
} | |
} | |
] | |
}, | |
{ | |
"metadata": { | |
"id": "dVGlOWPu2qsT", | |
"colab_type": "text" | |
}, | |
"cell_type": "markdown", | |
"source": [ | |
"## Training" | |
] | |
}, | |
{ | |
"metadata": { | |
"id": "AAt-1WBF2EO6", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"cell_type": "code", | |
"source": [ | |
"dataloader = DataLoader(soclevr, batch_size=64, shuffle=True)" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"id": "kJAdaJB-TE0h", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"cell_type": "code", | |
"source": [ | |
"dataloader_test = DataLoader(soclevr_test, batch_size=64, shuffle=True)\n", | |
"dataloader_test_iter = iter(dataloader_test)" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"id": "TgdsHlagv1fK", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"cell_type": "code", | |
"source": [ | |
"dev = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"id": "DqHiv5Mo4MzO", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"cell_type": "code", | |
"source": [ | |
"rn = RN().to(dev)" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"id": "CudSDFAM8v7K", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"cell_type": "code", | |
"source": [ | |
"optimizer = torch.optim.Adam(rn.parameters(), lr=1e-4)\n", | |
"lossfn = nn.CrossEntropyLoss()" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"id": "03Fs2MDf8966", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"cell_type": "code", | |
"source": [ | |
"counter = 0" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"id": "irgk_gB-s8wW", | |
"colab_type": "code", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 102 | |
}, | |
"outputId": "6e616391-423c-450a-b9dd-8c111da4ae5c" | |
}, | |
"cell_type": "code", | |
"source": [ | |
"!pip install tensorboardcolab\n", | |
"from tensorboardcolab import *\n", | |
"tbc=TensorBoardColab(graph_path=\"./log\")" | |
], | |
"execution_count": 21, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"Requirement already satisfied: tensorboardcolab in /usr/local/lib/python3.6/dist-packages (0.0.22)\n" | |
], | |
"name": "stdout" | |
}, | |
{ | |
"output_type": "stream", | |
"text": [ | |
"Using TensorFlow backend.\n" | |
], | |
"name": "stderr" | |
}, | |
{ | |
"output_type": "stream", | |
"text": [ | |
"Wait for 8 seconds...\n", | |
"TensorBoard link:\n", | |
"http://83ff18d0.ngrok.io\n" | |
], | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"metadata": { | |
"id": "nsfaESqG3dVd", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"cell_type": "code", | |
"source": [ | |
"from tensorboardX import SummaryWriter\n", | |
"writer = SummaryWriter(log_dir=\"./log/1_128_bn_relu\")" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"id": "m929zvdn3-wf", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"cell_type": "code", | |
"source": [ | |
"for epoch in range(1, 10000):\n", | |
" for step, (e, q, a) in enumerate(dataloader):\n", | |
" counter = counter + 1\n", | |
" e = e.permute(0, 3, 1, 2)\n", | |
" e = e.float()/255*2 - 1.0 \n", | |
" e = e.to(dev)\n", | |
" q = q.to(dev)\n", | |
" a = a.to(dev)\n", | |
"\n", | |
" output = rn(e, q)\n", | |
" loss = lossfn(output, a)\n", | |
" optimizer.zero_grad()\n", | |
" loss.backward()\n", | |
" optimizer.step()\n", | |
" writer.add_scalar(\"loss\", loss.item(), counter)\n", | |
" \n", | |
" if counter % 100 == 0:\n", | |
" rn.eval()\n", | |
" with torch.no_grad():\n", | |
" e, q, a = dataloader_test_iter.next()\n", | |
" e = e.permute(0, 3, 1, 2)\n", | |
" e = e.float()/255*2 - 1.0 \n", | |
" e = e.to(dev)\n", | |
" q = q.to(dev)\n", | |
" a = a.to(dev)\n", | |
" output = rn(e, q)\n", | |
" loss = lossfn(output, a) \n", | |
" acc = torch.sum(output.argmax(dim=1) == a) * 100.0 / output.shape[0]\n", | |
" writer.add_scalar(\"test_accuracy\", acc.item(), counter)\n", | |
" rn.train()" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"id": "KReoH3_uglVK", | |
"colab_type": "text" | |
}, | |
"cell_type": "markdown", | |
"source": [ | |
"## Demo" | |
] | |
}, | |
{ | |
"metadata": { | |
"id": "VR00dT_1jOKS", | |
"colab_type": "code", | |
"cellView": "form", | |
"colab": {} | |
}, | |
"cell_type": "code", | |
"source": [ | |
"#@title Download a trained model\n", | |
"\n", | |
"#taken from this StackOverflow answer: https://stackoverflow.com/a/39225039\n", | |
"import requests\n", | |
"def download_file_from_google_drive(id, destination):\n", | |
" URL = \"https://docs.google.com/uc?export=download\"\n", | |
"\n", | |
" session = requests.Session()\n", | |
"\n", | |
" response = session.get(URL, params = { 'id' : id }, stream = True)\n", | |
" token = get_confirm_token(response)\n", | |
"\n", | |
" if token:\n", | |
" params = { 'id' : id, 'confirm' : token }\n", | |
" response = session.get(URL, params = params, stream = True)\n", | |
"\n", | |
" save_response_content(response, destination) \n", | |
"\n", | |
"def get_confirm_token(response):\n", | |
" for key, value in response.cookies.items():\n", | |
" if key.startswith('download_warning'):\n", | |
" return value\n", | |
"\n", | |
" return None\n", | |
"\n", | |
"def save_response_content(response, destination):\n", | |
" CHUNK_SIZE = 32768\n", | |
"\n", | |
" with open(destination, \"wb\") as f:\n", | |
" for chunk in response.iter_content(CHUNK_SIZE):\n", | |
" if chunk: # filter out keep-alive new chunks\n", | |
" f.write(chunk)\n", | |
"\n", | |
"\n", | |
"file_id = '12XyhvO2NjdzvZ4zuhFadC0y_MJn7UwbN'\n", | |
"download_file_from_google_drive(file_id, \"model.ckpt\")" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"id": "b0gfpvRJuaxN", | |
"colab_type": "code", | |
"cellView": "form", | |
"outputId": "5a1b5a6e-69db-46f6-f4d8-4eabc17d204e", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 145 | |
} | |
}, | |
"cell_type": "code", | |
"source": [ | |
"#@title Create a random environment\n", | |
"output_dic = {'1': 10,\n", | |
" '2': 9,\n", | |
" '3': 8,\n", | |
" '4': 5,\n", | |
" '5': 6,\n", | |
" '6': 11,\n", | |
" 'bottom': 7,\n", | |
" 'circle': 1,\n", | |
" 'left': 4,\n", | |
" 'right': 2,\n", | |
" 'square': 3,\n", | |
" 'top': 0}\n", | |
"\n", | |
"dev = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n", | |
"rn = RN().to(dev)\n", | |
"\n", | |
"rn.load_state_dict(torch.load(\"model.ckpt\"))\n", | |
"\n", | |
"rn = rn.eval()\n", | |
"from PIL import Image\n", | |
"_ = generate_example(\"bg.jpg\", \"env.png\")\n", | |
"Image.open(\"env.png\")" | |
], | |
"execution_count": 25, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<PIL.PngImagePlugin.PngImageFile image mode=RGB size=128x128 at 0x7F76869C7550>" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
}, | |
"execution_count": 25 | |
} | |
] | |
}, | |
{ | |
"metadata": { | |
"id": "oGMQwCapOl0A", | |
"colab_type": "text" | |
}, | |
"cell_type": "markdown", | |
"source": [ | |
"Each image has 6 objects. Each object has:\n", | |
"1. shape: square or cicle\n", | |
"2. color: 6 colors (red, blue, green, orange, yellow, gray) \n", | |
"3. position: any where in a 128x128 env\n", | |
"\n" | |
] | |
}, | |
{ | |
"metadata": { | |
"id": "BXCPJ4yagqBE", | |
"colab_type": "code", | |
"cellView": "form", | |
"outputId": "3f9ec864-cd5b-4ef9-e87c-14230615f677", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 34 | |
} | |
}, | |
"cell_type": "code", | |
"source": [ | |
"#@title Ask a question { run: \"auto\" }\n", | |
"#@markdown Choose an object with color\n", | |
"\n", | |
"object_color = \"green\" #@param ['red', 'blue', 'green', 'orange', 'yellow', 'gray']\n", | |
"\n", | |
"#@markdown Choose a question\n", | |
"\n", | |
"question = \"1 What is the shape of the object?\" #@param [\"1 What is the shape of the object?\", \"2 Is the object on the left or right of the image?\", \"3 Is the object on the top or bottom of the image?\", \"4 What is the shape of the object that is closest to the chosen object?\", \"5 What is the shape of the object that is furthest from the chosen object?\", \"6 How many objects have the shape of the chosen object?\"]\n", | |
"\n", | |
"\n", | |
"for i in range(6):\n", | |
" if object_color == colorlist[i]:\n", | |
" break\n", | |
"\n", | |
"q = [0 for _ in range(11)]\n", | |
"#print(i)\n", | |
"q[i] = 1\n", | |
"\n", | |
"qq = int(question[0])\n", | |
"#print(qq)\n", | |
"if qq <= 3:\n", | |
" q[7] = 1\n", | |
" q[8 + (4-qq)-1] = 1\n", | |
"else:\n", | |
" q[6] = 1 \n", | |
" q[8 + (4-(qq-3))-1] = 1\n", | |
" \n", | |
"q = list(map(int, q))\n", | |
"\n", | |
"#print(q)\n", | |
"q = np.asarray(q, dtype=np.float32)\n", | |
"#print(i)\n", | |
"\n", | |
"e = np.asarray(Image.open(\"env.png\"), dtype=np.float32)\n", | |
"e = torch.from_numpy(e).permute(2, 0, 1).unsqueeze(0).to(dev)\n", | |
"e = e /255 * 2 - 1.0\n", | |
"q = torch.from_numpy(q).unsqueeze(0).to(dev)\n", | |
"\n", | |
"out = rn(e, q)\n", | |
"#print(out)\n", | |
"o = torch.argmax(out).item()\n", | |
"\n", | |
"idx2word = {}\n", | |
"for k, v in output_dic.items():\n", | |
" idx2word[v] = k\n", | |
" \n", | |
"print(idx2word[o])" | |
], | |
"execution_count": 27, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"square\n" | |
], | |
"name": "stdout" | |
} | |
] | |
} | |
] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment