diff --git a/CoordConv.ipynb b/CoordConv.ipynb index eb47dce..15e6956 100644 --- a/CoordConv.ipynb +++ b/CoordConv.ipynb @@ -175,7 +175,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 3, @@ -210,7 +210,7 @@ "onehots_tensor = torch.from_numpy(onehots)\n", "\n", "conv_layer = nn.Conv2d(in_channels=1, out_channels=1, kernel_size=(9,9), padding=4, stride=1)\n", - "w = torch.ones(1,1,9, 9)\n", + "w = torch.ones(1, 1, 9, 9)\n", "conv_layer.weight.data = w\n", "\n", "images_tensor = conv_layer(onehots_tensor)\n", @@ -254,8 +254,8 @@ " train_set = np.array(train_set)\n", " test_set = np.array(test_set)\n", " \n", - " train_set = train_set[:, None, None, :]\n", - " test_set = test_set[:, None, None, :]\n", + " train_set = train_set[:, :, None, None]\n", + " test_set = test_set[:, :, None, None]\n", "\n", " print(train_set.shape)\n", " print(test_set.shape)\n", @@ -293,6 +293,7 @@ "name": "stdout", "output_type": "stream", "text": [ + "Train set : (2508, 2, 1, 1)\n", "Train set : (2508, 2, 64, 64) 0.93650794 0.06349207\n", "Test set : (628, 2, 64, 64) 0.93650794 0.06349207\n" ] @@ -344,6 +345,7 @@ " test_set[i, 0, 0, 0] = x\n", " test_set[i, 1, 0, 0] = y\n", "\n", + " print('Train set : ', train_set.shape)\n", " train_set = np.tile(train_set, [1, 1, 64, 64])\n", " test_set = np.tile(test_set, [1, 1, 64, 64])\n", "\n", @@ -404,7 +406,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -414,16 +416,16 @@ "----------------------------------------------------------------\n", " Layer (type) Output Shape Param #\n", "================================================================\n", - " AddCoords-1 [-1, 5, 64, 64] 0\n", - " Conv2d-2 [-1, 32, 64, 64] 192\n", + " AddCoords-1 [-1, 4, 64, 64] 0\n", + " Conv2d-2 [-1, 32, 64, 64] 160\n", " CoordConv2d-3 [-1, 32, 64, 64] 96\n", " Conv2d-4 [-1, 64, 64, 64] 2,112\n", " Conv2d-5 [-1, 64, 64, 64] 4,160\n", " Conv2d-6 [-1, 1, 64, 64] 65\n", " Conv2d-7 [-1, 1, 64, 64] 2\n", "================================================================\n", - "Total params: 6,627\n", - "Trainable params: 6,627\n", + "Total params: 6,595\n", + "Trainable params: 6,595\n", "Non-trainable params: 0\n", "----------------------------------------------------------------\n" ] @@ -435,7 +437,7 @@ "class Net(nn.Module):\n", " def __init__(self):\n", " super(Net, self).__init__()\n", - " self.coordconv = CoordConv2d(2, 32, 1, with_r=True)\n", + " self.coordconv = CoordConv2d(2, 32, 1, with_r=False)\n", " self.conv1 = nn.Conv2d(32, 64, 1)\n", " self.conv2 = nn.Conv2d(64, 64, 1)\n", " self.conv3 = nn.Conv2d(64, 1, 1)\n", @@ -465,7 +467,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ @@ -484,7 +486,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -498,7 +500,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 17, "metadata": {}, "outputs": [], "source": [ @@ -522,23 +524,23 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Train Epoch: 1 [2508/2508 (100%)] Loss: 7.513226\n", - "Train Epoch: 2 [2508/2508 (100%)] Loss: 4.021207\n", - "Train Epoch: 3 [2508/2508 (100%)] Loss: 2.022669\n", - "Train Epoch: 4 [2508/2508 (100%)] Loss: 1.027538\n", - "Train Epoch: 5 [2508/2508 (100%)] Loss: 0.476256\n", - "Train Epoch: 6 [2508/2508 (100%)] Loss: 0.249001\n", - "Train Epoch: 7 [2508/2508 (100%)] Loss: 0.141679\n", - "Train Epoch: 8 [2508/2508 (100%)] Loss: 0.089806\n", - "Train Epoch: 9 [2508/2508 (100%)] Loss: 0.060917\n", - "Train Epoch: 10 [2508/2508 (100%)] Loss: 0.045695\n" + "Train Epoch: 1 [2508/2508 (100%)] Loss: 7.840931\n", + "Train Epoch: 2 [2508/2508 (100%)] Loss: 4.514653\n", + "Train Epoch: 3 [2508/2508 (100%)] Loss: 2.307229\n", + "Train Epoch: 4 [2508/2508 (100%)] Loss: 1.239156\n", + "Train Epoch: 5 [2508/2508 (100%)] Loss: 0.567990\n", + "Train Epoch: 6 [2508/2508 (100%)] Loss: 0.292752\n", + "Train Epoch: 7 [2508/2508 (100%)] Loss: 0.160531\n", + "Train Epoch: 8 [2508/2508 (100%)] Loss: 0.101639\n", + "Train Epoch: 9 [2508/2508 (100%)] Loss: 0.069184\n", + "Train Epoch: 10 [2508/2508 (100%)] Loss: 0.050106\n" ] } ], @@ -549,7 +551,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ @@ -582,7 +584,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 20, "metadata": {}, "outputs": [ { @@ -590,13 +592,13 @@ "output_type": "stream", "text": [ "\n", - "Test set: Average loss: 0.0459, Accuracy: 628/628 (100%)\n", + "Test set: Average loss: 0.0523, Accuracy: 628/628 (100%)\n", "\n" ] }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] diff --git a/README.md b/README.md index 39f1731..7d81016 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,22 @@ # CoordConv + ![](https://img.shields.io/badge/pytorch-0.4.0-blue.svg) ![](https://img.shields.io/badge/python-3.6.5-brightgreen.svg) + Pytorch implementation of CoordConv for N-D ConvLayers, and the experiments. -Reference from the paper "An intriguing failing of convolutional neural networks and the CoordConv solution." +Reference from the paper: [An intriguing failing of convolutional neural networks and the CoordConv solution](https://arxiv.org/abs/1807.03247) Extends the CoordinateChannel concatenation from 2D to 1D and 3D tensors. # Requirements + - pytorch 0.4.0 - torchvision 0.2.1 - torchsummary 1.3 - sklearn 0.19.1 # Usage + ```python from coordconv import CoordConv1d, CoordConv2d, CoordConv3d @@ -39,17 +43,24 @@ net = Net().to(device) ``` # Experiments + Implement experiments from origin paper. ## Coordinate Classification + Use `experiments/generate_data.py` to generate `Uniform` and `Quadrant` datasets for Coordinate Classification task. Use `experiments/train_and_test.py` to train and test neural network model. -### Images +### Uniform Datasets |Train|Test|Predictions| |:---:|:---:|:---:| |![](https://i.loli.net/2018/07/16/5b4c7db11abf9.png)|![](https://i.loli.net/2018/07/16/5b4c7dbd03169.png)|![](https://i.loli.net/2018/07/16/5b4c8d88a70a2.png)| +### Quadrant Datasets + +|Train|Test|Predictions| +|:---:|:---:|:---:| +|![](https://i.loli.net/2018/07/16/5b4c98bba0fec.png)|![](https://i.loli.net/2018/07/16/5b4c98cbf0293.png)|![](https://i.loli.net/2018/07/16/5b4c98d77096f.png)| \ No newline at end of file diff --git a/experiments/generate_data.py b/experiments/generate_data.py index 817d997..adf5c4d 100644 --- a/experiments/generate_data.py +++ b/experiments/generate_data.py @@ -67,8 +67,8 @@ else: train_set = np.array(train_set) test_set = np.array(test_set) - train_set = train_set[:, None, None, :] - test_set = test_set[:, None, None, :] + train_set = train_set[:, :, None, None] + test_set = test_set[:, :, None, None] print(train_set.shape) print(test_set.shape) @@ -87,4 +87,4 @@ else: np.save('data-quadrant/train_onehot.npy', train_onehot) np.save('data-quadrant/train_images.npy', train_images) np.save('data-quadrant/test_onehot.npy', test_onehot) - np.save('data-quadrant/test_images.npy', test_images) \ No newline at end of file + np.save('data-quadrant/test_images.npy', test_images)