Skip to content

Instantly share code, notes, and snippets.

@amaotone
Created July 29, 2019 04:30
Show Gist options
  • Select an option

  • Save amaotone/3c63ac5f7447ad965c700685d0df2050 to your computer and use it in GitHub Desktop.

Select an option

Save amaotone/3c63ac5f7447ad965c700685d0df2050 to your computer and use it in GitHub Desktop.
Sub-Pixel Conv with ICNR
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from PIL import Image\n",
"\n",
"import torch\n",
"import torch.nn.functional as F\n",
"from torch import nn"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"def show_image(x):\n",
" if isinstance(x, torch.Tensor):\n",
" x = x.detach().numpy()\n",
" if x.ndim == 4:\n",
" x = x[0]\n",
" if x.shape[2] != 3:\n",
" x = x.transpose(1, 2, 0)\n",
" x = (x - x.min()) / (x.max() - x.min()) # normalize\n",
" plt.imshow(x)\n",
" plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"image = Image.open('dog.jpg')\n",
"image = np.asarray(image, np.float32) / 255\n",
"show_image(image)\n",
"\n",
"x = image[np.newaxis, :, :, :].transpose(0, 3, 1, 2)\n",
"x = torch.from_numpy(x)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## without ICNR"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"out = nn.Conv2d(3, 12, 3, 1, 1)(x)\n",
"out = nn.PixelShuffle(2)(out)\n",
"\n",
"show_image(out)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## with ICNR"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"def ICNR(tensor, scale_factor=2, initializer=nn.init.kaiming_normal_):\n",
" OUT, IN, H, W = tensor.shape\n",
" sub = torch.zeros(OUT//scale_factor**2, IN, H, W)\n",
" sub = initializer(sub)\n",
" \n",
" kernel = torch.zeros_like(tensor)\n",
" for i in range(OUT):\n",
" kernel[i] = sub[i//scale_factor**2]\n",
" \n",
" return kernel\n",
"\n",
"conv = nn.Conv2d(3, 12, 3, 1, 1)\n",
"\n",
"kernel = ICNR(conv.weight)\n",
"conv.weight.data.copy_(kernel)\n",
"\n",
"out = conv(x)\n",
"out = nn.PixelShuffle(2)(out)\n",
"\n",
"show_image(out)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.4"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment