Skip to content

Instantly share code, notes, and snippets.

@A03ki
Last active March 25, 2024 05:03
Show Gist options
  • Select an option

  • Save A03ki/2305398458cb8e2155e8e81333f0a965 to your computer and use it in GitHub Desktop.

Select an option

Save A03ki/2305398458cb8e2155e8e81333f0a965 to your computer and use it in GitHub Desktop.
Implementation of ICNR with PyTorch

ICNR

ICNR is an initialization method for sub-pixel convolution.

References

Papar

Github or Gist

Requirements

Python 3.6 or later
PyTorch 1.1.0 or later

Usage

For example, input Tensor with the sizes (64, 8, 32, 32) would be output as (64, 8, 64, 64) if you set upscale_factor to 2.

import torch
import torch.nn as nn

from icnr import ICNR


upscale_factor = 2
input = torch.randn(64, 3, 32, 32)
conv = nn.Conv2d(3, 3 * (upscale_factor ** 2), 3, 1, 1, bias=0)
pixelshuffle = nn.PixelShuffle(upscale_factor)
weight = ICNR(conv.weight, initializer=nn.init.kaiming_normal_,
              upscale_factor=upscale_factor)
conv.weight.data.copy_(weight)   # initialize conv.weight
output = conv(input)  # (64, 12, 32, 32)
output = pixelshuffle(output)  # (64, 3, 64, 64)

Visualization

See visualization.ipynb

import torch
def ICNR(tensor, initializer, upscale_factor=2, *args, **kwargs):
"tensor: the 2-dimensional Tensor or more"
upscale_factor_squared = upscale_factor * upscale_factor
assert tensor.shape[0] % upscale_factor_squared == 0, \
("The size of the first dimension: "
f"tensor.shape[0] = {tensor.shape[0]}"
" is not divisible by square of upscale_factor: "
f"upscale_factor = {upscale_factor}")
sub_kernel = torch.empty(tensor.shape[0] // upscale_factor_squared,
*tensor.shape[1:])
sub_kernel = initializer(sub_kernel, *args, **kwargs)
return sub_kernel.repeat_interleave(upscale_factor_squared, dim=0)
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "visualization.ipynb",
"provenance": [],
"collapsed_sections": []
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
}
},
"cells": [
{
"cell_type": "code",
"metadata": {
"id": "HlBQ86Dotjbx",
"colab_type": "code",
"colab": {}
},
"source": [
"import torch\n",
"import torch.nn as nn\n",
"import matplotlib.pyplot as plt\n",
"\n",
"from icnr import ICNR"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "mwJnAqsutv1r",
"colab_type": "code",
"colab": {}
},
"source": [
"upscale_factor = 2\n",
"input = torch.randn(4, 4, 5, 5)\n",
"pixelshuffle = nn.PixelShuffle(upscale_factor)\n",
"conv = nn.Conv2d(4, 4 * (upscale_factor ** 2), 3, 1, 1, bias=0)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "FZan9ltuzD1G",
"colab_type": "text"
},
"source": [
"## Initialization as usual"
]
},
{
"cell_type": "code",
"metadata": {
"id": "KtWjHlZJth64",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 282
},
"outputId": "4d838feb-4cfb-4a3f-d4bc-c5695a9cd326"
},
"source": [
"nn.init.normal_(conv.weight, mean=0.0, std=0.02)\n",
"output = conv(input)\n",
"output = pixelshuffle(output)\n",
"plt.imshow(output.detach().numpy()[0, 0, :])"
],
"execution_count": 3,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x7fbeffa4cf60>"
]
},
"metadata": {
"tags": []
},
"execution_count": 3
},
{
"output_type": "display_data",
"data": {
"image/png": "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\nDFEDyfwVrSS4NFnYNncAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "MrR5GjQzvI0h",
"colab_type": "text"
},
"source": [
"## Initialization with ICNR"
]
},
{
"cell_type": "code",
"metadata": {
"id": "izk1sr39sMDF",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 282
},
"outputId": "ff870e31-9535-46e0-ced7-070064c37151"
},
"source": [
"weight = ICNR(conv.weight, initializer=nn.init.normal_,\n",
" upscale_factor=upscale_factor, mean=0.0, std=0.02)\n",
"conv.weight.data.copy_(weight)\n",
"output = conv(input)\n",
"output = pixelshuffle(output)\n",
"plt.imshow(output.detach().numpy()[0, 0, :])"
],
"execution_count": 4,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x7fbeff5291d0>"
]
},
"metadata": {
"tags": []
},
"execution_count": 4
},
{
"output_type": "display_data",
"data": {
"image/png": "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\nOcwr8jw7AAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment