├── README.md ├── config.py ├── data └── mnist_sequence1_sample_5distortions5x5.npz ├── lib ├── __pycache__ │ ├── data_loader.cpython-35.pyc │ └── network.cpython-35.pyc ├── data_loader.py └── network.py ├── main.py ├── models └── .gitignore ├── py35_pytorch03_version ├── README.md ├── cnn.out ├── config.py ├── data │ └── .gitignore ├── lib │ ├── __pycache__ │ │ ├── data_loader.cpython-35.pyc │ │ └── network.cpython-35.pyc │ ├── data_loader.py │ └── network.py ├── main.py ├── models │ └── .gitignore ├── stn.out └── transform_img │ ├── 0.png │ ├── 1.png │ ├── 10.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ └── 9.png └── transform_img ├── 0.png ├── 1.png ├── 10.png ├── 11.png ├── 12.png ├── 13.png ├── 14.png ├── 15.png ├── 2.png ├── 3.png ├── 4.png ├── 5.png ├── 6.png ├── 7.png ├── 8.png └── 9.png /README.md: -------------------------------------------------------------------------------- 1 | # Tpatial-Transformer-Networks-pytorch 2 | - Refer to [daviddao/spatial-transformer-tensorflow](https://github.com/daviddao/spatial-transformer-tensorflow)(Tensorflow) . 3 | - Implementation of [**Spatial Transformer Networks**](https://arxiv.org/abs/1506.02025). 4 | 5 | ## Statement 6 | - Do the Experiments on the **cluttered MNIST** dataset of [daviddao](https://github.com/daviddao/spatial-transformer-tensorflow). 7 | - The accuracy and loss records can be find in **cnn.out & stn.out**. 8 | - The transform img can be find in **transform_img/**. 9 | - **py35_pytorch03_version contains** the old version code 10 | 11 | ## Environment 12 | - python3.6 13 | - pytorch 0.4.0 14 | 15 | 16 | 17 | ## Accuracy 18 | **CNN** 19 | 20 | - Testing: epoch[195/200] loss:0.5264 acc:0.9211 21 | - Testing: epoch[196/200] loss:0.5185 acc:0.9194 22 | - Testing: epoch[197/200] loss:0.5160 acc:0.9158 23 | - Testing: epoch[198/200] loss:0.5053 acc:0.9183 24 | - Testing: epoch[199/200] loss:0.5057 acc:0.9153 25 | 26 | **STN** 27 | 28 | - Testing: epoch[195/200] loss:0.0880 acc:0.9762 29 | - Testing: epoch[196/200] loss:0.0961 acc:0.9757 30 | - Testing: epoch[197/200] loss:0.0893 acc:0.9742 31 | - Testing: epoch[198/200] loss:0.1015 acc:0.9740 32 | - Testing: epoch[199/200] loss:0.0938 acc:0.9738 33 | 34 | ## Transform Image 35 | **(input|transform|input|transform)** 36 | ![](transform_img/0.png) 37 | -------------------------------------------------------------------------------- /config.py: -------------------------------------------------------------------------------- 1 | cuda_num = 0 2 | LR = 0.001 3 | epoch = 200 4 | show_train_result_every_batch = 100 5 | test_every_epoch = 1 6 | save_model_every_epoch = 1 7 | 8 | height = 40 9 | width = 40 10 | channel = 1 11 | 12 | train_batch_size = 64 13 | test_batch_size = 128 14 | 15 | drop_prob = 0.8 16 | 17 | data_path = 'data/mnist_sequence1_sample_5distortions5x5.npz' 18 | model_name = 'model_%s.pkl' 19 | model_dir = 'models/' 20 | transform_img_dir = 'transform_img' 21 | mode = 'stn' 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /data/mnist_sequence1_sample_5distortions5x5.npz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/data/mnist_sequence1_sample_5distortions5x5.npz -------------------------------------------------------------------------------- /lib/__pycache__/data_loader.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/lib/__pycache__/data_loader.cpython-35.pyc -------------------------------------------------------------------------------- /lib/__pycache__/network.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/lib/__pycache__/network.cpython-35.pyc -------------------------------------------------------------------------------- /lib/data_loader.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import torch 3 | from torch.utils import data 4 | import config as cfg 5 | import logging 6 | 7 | # logging.getLogger().setLevel(logging.INFO) 8 | 9 | 10 | def to_torch_formart(img, target, data_type=''): 11 | ''' 12 | 13 | :param img: (b, l) 14 | :param target: (b, 1) 15 | :param data_type: string 16 | :return: (b, c, h, w), (b) 17 | ''' 18 | batch_size = img.size(0) 19 | img = img.view(batch_size, cfg.channel, cfg.height, cfg.width) 20 | target = target.view(batch_size).long() 21 | print(data_type, img.size(), target.size()) 22 | return img, target 23 | 24 | 25 | def get_data_loader(): 26 | ''' 27 | 28 | :return: train_loader, test_loader 29 | ''' 30 | mnist_cluttered = np.load(cfg.data_path) 31 | X_train = torch.from_numpy(mnist_cluttered['X_train']) 32 | y_train = torch.from_numpy(mnist_cluttered['y_train']) 33 | X_valid = torch.from_numpy(mnist_cluttered['X_valid']) 34 | y_valid = torch.from_numpy(mnist_cluttered['y_valid']) 35 | X_test = torch.from_numpy(mnist_cluttered['X_test']) 36 | y_test = torch.from_numpy(mnist_cluttered['y_test']) 37 | 38 | X_train, y_train = to_torch_formart(X_train, y_train, data_type='Training') 39 | X_test = torch.cat([X_test, X_valid], dim=0) 40 | y_test = torch.cat([y_test, y_valid], dim=0) 41 | X_test, y_test = to_torch_formart(X_test, y_test, data_type='Testing') 42 | 43 | train_dataset = data.TensorDataset(X_train, y_train) 44 | test_dataset = data.TensorDataset(X_test, y_test) 45 | data.TensorDataset() 46 | train_loader = data.DataLoader(dataset=train_dataset, batch_size=cfg.train_batch_size, shuffle=True) 47 | test_loader = data.DataLoader(dataset=test_dataset, batch_size=cfg.test_batch_size) 48 | 49 | return train_loader, test_loader 50 | 51 | -------------------------------------------------------------------------------- /lib/network.py: -------------------------------------------------------------------------------- 1 | import torch 2 | from torch import nn 3 | from torch.nn import functional as F 4 | import numpy as np 5 | import config as cfg 6 | 7 | 8 | class Network(nn.Module): 9 | def __init__(self, mode='stn'): 10 | assert mode in ['stn', 'cnn'] 11 | 12 | super(Network, self).__init__() 13 | self.mode = mode 14 | self.local_net = LocalNetwork() 15 | self.conv = nn.Sequential( 16 | nn.Conv2d(in_channels=cfg.channel, out_channels=16, kernel_size=3, stride=2, padding=1), 17 | nn.ReLU(), 18 | nn.Conv2d(in_channels=16, out_channels=16, kernel_size=3, stride=2, padding=1), 19 | nn.ReLU(), 20 | ) 21 | 22 | self.fc = nn.Sequential( 23 | nn.Linear(in_features=cfg.height // 4 * cfg.width // 4 * 16, out_features=1024), 24 | nn.ReLU(), 25 | nn.Dropout(cfg.drop_prob), 26 | nn.Linear(in_features=1024, out_features=10) 27 | ) 28 | 29 | def forward(self, img): 30 | ''' 31 | :param img: (b, c, h, w) 32 | :return: (b, c, h, w), (b,) 33 | ''' 34 | batch_size = img.size(0) 35 | if self.mode == 'stn': 36 | transform_img = self.local_net(img) 37 | img = transform_img 38 | else: 39 | transform_img = None 40 | 41 | conv_output = self.conv(img).view(batch_size, -1) 42 | predict = self.fc(conv_output) 43 | return transform_img, predict 44 | 45 | 46 | class LocalNetwork(nn.Module): 47 | def __init__(self): 48 | super(LocalNetwork, self).__init__() 49 | self.fc = nn.Sequential( 50 | nn.Linear(in_features=cfg.channel * cfg.height * cfg.width, 51 | out_features=20), 52 | nn.Tanh(), 53 | nn.Dropout(cfg.drop_prob), 54 | nn.Linear(in_features=20, out_features=6), 55 | nn.Tanh(), 56 | ) 57 | bias = torch.from_numpy(np.array([1, 0, 0, 0, 1, 0])) 58 | 59 | nn.init.constant_(self.fc[3].weight, 0) 60 | self.fc[3].bias.data.copy_(bias) 61 | 62 | def forward(self, img): 63 | ''' 64 | 65 | :param img: (b, c, h, w) 66 | :return: (b, c, h, w) 67 | ''' 68 | batch_size = img.size(0) 69 | 70 | theta = self.fc(img.view(batch_size, -1)).view(batch_size, 2, 3) 71 | 72 | grid = F.affine_grid(theta, torch.Size((batch_size, cfg.channel, cfg.height, cfg.width))) 73 | img_transform = F.grid_sample(img, grid) 74 | 75 | return img_transform 76 | 77 | 78 | if __name__ == '__main__': 79 | net = LocalNetwork() 80 | 81 | x = torch.randn(1, 1, 40, 40) + 1 82 | net(x) 83 | 84 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import torch 2 | from torch import nn 3 | from torch.autograd import Variable 4 | import torchvision.utils as vutils 5 | from lib.data_loader import get_data_loader 6 | from lib.network import Network 7 | import config as cfg 8 | import logging 9 | import os 10 | 11 | 12 | def calc_acc(x, y): 13 | x = torch.max(x, dim=-1)[1] 14 | hit = torch.sum(x == y).item() * 1.0 15 | accuracy = hit / x.size(0) 16 | return accuracy 17 | 18 | logging.getLogger().setLevel(logging.INFO) 19 | logging.info('Mode: %s' % cfg.mode) 20 | if not os.path.exists(cfg.model_dir): 21 | os.mkdir(cfg.model_dir) 22 | if not os.path.exists(cfg.transform_img_dir): 23 | os.mkdir(cfg.transform_img_dir) 24 | 25 | train_loader, test_loader = get_data_loader() 26 | train_batch_nb = len(train_loader) 27 | test_batch_nb = len(test_loader) 28 | 29 | print('Train batch_nb:%d' % train_batch_nb) 30 | print('Test batch_nb:%d' % test_batch_nb) 31 | 32 | net = Network(mode=cfg.mode) 33 | if torch.cuda.is_available(): 34 | net.cuda(cfg.cuda_num) 35 | 36 | opt = torch.optim.Adam(net.parameters(), lr=cfg.LR) 37 | loss_func = nn.CrossEntropyLoss() 38 | 39 | for epoch_idx in range(cfg.epoch): 40 | # ========================== Training Model ============================= 41 | net.train() 42 | torch.set_grad_enabled(True) 43 | for batch_idx, (train_img, train_target) in enumerate(train_loader): 44 | if torch.cuda.is_available(): 45 | train_img = train_img.cuda(cfg.cuda_num) 46 | train_target = train_target.cuda(cfg.cuda_num) 47 | 48 | _, predict = net(train_img) 49 | 50 | loss = loss_func(predict, train_target) 51 | net.zero_grad() 52 | loss.backward() 53 | opt.step() 54 | 55 | # acc = calc_acc(predict, train_target) 56 | # if batch_idx % cfg.show_train_result_every_batch == 0: 57 | # logging.info('epoch[%d/%d] batch[%d/%d] loss:%.4f acc:%.4f' 58 | # % (epoch_idx, cfg.epoch, batch_idx, train_batch_nb, loss.data[0], acc)) 59 | 60 | # ========================== Testing Model ============================= 61 | if (epoch_idx + 1) % cfg.test_every_epoch == 0: 62 | total_loss = 0 63 | total_acc = 0 64 | net.eval() 65 | torch.set_grad_enabled(False) 66 | for batch_idx, (test_img, test_target) in enumerate(test_loader): 67 | batch_size = test_img.size(0) 68 | 69 | if torch.cuda.is_available(): 70 | test_img = test_img.cuda(cfg.cuda_num) 71 | test_target = test_target.cuda(cfg.cuda_num) 72 | 73 | transform_img, predict = net(test_img) 74 | 75 | loss = loss_func(predict, test_target) 76 | acc = calc_acc(predict, test_target) 77 | 78 | total_loss += loss 79 | total_acc += acc 80 | 81 | if cfg.mode == 'stn': 82 | img_list = [] 83 | for idx in range(batch_size): 84 | img_list.append(test_img[idx]) 85 | img_list.append(transform_img[idx]) 86 | output_img = torch.stack(img_list) 87 | 88 | vutils.save_image(output_img.data, os.path.join(cfg.transform_img_dir, '%d.png' % batch_idx), 89 | nrow=20) 90 | 91 | mean_loss = total_loss / test_batch_nb 92 | mean_acc = total_acc / test_batch_nb 93 | logging.info('========= Testing: epoch[%d/%d] loss:%.4f acc:%.4f' % (epoch_idx, cfg.epoch, mean_loss.item(), mean_acc)) 94 | 95 | if (epoch_idx + 1) % cfg.save_model_every_epoch == 0: 96 | state_dict = net.state_dict() 97 | torch.save(state_dict, os.path.join(cfg.model_dir, cfg.model_name % cfg.mode)) 98 | -------------------------------------------------------------------------------- /models/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/models/.gitignore -------------------------------------------------------------------------------- /py35_pytorch03_version/README.md: -------------------------------------------------------------------------------- 1 | # Tpatial-Transformer-Networks-pytorch 2 | - Refer to [daviddao/spatial-transformer-tensorflow](https://github.com/daviddao/spatial-transformer-tensorflow)(Tensorflow) . 3 | - Implementation of [**Spatial Transformer Networks**](https://arxiv.org/abs/1506.02025). 4 | 5 | ## Statement 6 | - Do the Experiments on the **cluttered MNIST** dataset of [daviddao](https://github.com/daviddao/spatial-transformer-tensorflow). 7 | - The accuracy and loss records can be find in **cnn.out & stn.out**. 8 | - The transform img can be find in **transform_img/**. 9 | 10 | ## Environment 11 | - python3.5 12 | - pytorch '0.2.0+eed323c' 13 | 14 | 15 | ## Accuracy 16 | **CNN** 17 | 18 | - ========= Testing: epoch[195/200] loss:0.5183 acc:0.9188 19 | - ========= Testing: epoch[196/200] loss:0.5136 acc:0.9208 20 | - ========= Testing: epoch[197/200] loss:0.5165 acc:0.9167 21 | - ========= Testing: epoch[198/200] loss:0.4953 acc:0.9182 22 | - ========= Testing: epoch[199/200] loss:0.5040 acc:0.9249 23 | 24 | **STN** 25 | 26 | - ========= Testing: epoch[195/200] loss:0.0899 acc:0.9743 27 | - ========= Testing: epoch[196/200] loss:0.0889 acc:0.9745 28 | - ========= Testing: epoch[197/200] loss:0.0920 acc:0.9703 29 | - ========= Testing: epoch[198/200] loss:0.0871 acc:0.9765 30 | - ========= Testing: epoch[199/200] loss:0.0900 acc:0.9748 31 | 32 | ## Transform Image 33 | **(input|transform|input|transform)** 34 | ![](transform_img/0.png) 35 | -------------------------------------------------------------------------------- /py35_pytorch03_version/cnn.out: -------------------------------------------------------------------------------- 1 | INFO:root:Mode: cnn 2 | INFO:root:========= Testing: epoch[0/200] loss:1.2153 acc:0.6215 3 | INFO:root:========= Testing: epoch[1/200] loss:0.7748 acc:0.7549 4 | INFO:root:========= Testing: epoch[2/200] loss:0.5892 acc:0.8215 5 | INFO:root:========= Testing: epoch[3/200] loss:0.4803 acc:0.8571 6 | INFO:root:========= Testing: epoch[4/200] loss:0.4415 acc:0.8712 7 | INFO:root:========= Testing: epoch[5/200] loss:0.3954 acc:0.8751 8 | INFO:root:========= Testing: epoch[6/200] loss:0.3729 acc:0.8844 9 | INFO:root:========= Testing: epoch[7/200] loss:0.3534 acc:0.8818 10 | INFO:root:========= Testing: epoch[8/200] loss:0.3397 acc:0.8946 11 | INFO:root:========= Testing: epoch[9/200] loss:0.3405 acc:0.8927 12 | INFO:root:========= Testing: epoch[10/200] loss:0.3317 acc:0.8965 13 | INFO:root:========= Testing: epoch[11/200] loss:0.3274 acc:0.9024 14 | INFO:root:========= Testing: epoch[12/200] loss:0.3366 acc:0.8926 15 | INFO:root:========= Testing: epoch[13/200] loss:0.3303 acc:0.8918 16 | INFO:root:========= Testing: epoch[14/200] loss:0.3322 acc:0.9045 17 | INFO:root:========= Testing: epoch[15/200] loss:0.3345 acc:0.8997 18 | INFO:root:========= Testing: epoch[16/200] loss:0.3305 acc:0.9058 19 | INFO:root:========= Testing: epoch[17/200] loss:0.3340 acc:0.9130 20 | INFO:root:========= Testing: epoch[18/200] loss:0.3392 acc:0.9063 21 | INFO:root:========= Testing: epoch[19/200] loss:0.3615 acc:0.9032 22 | INFO:root:========= Testing: epoch[20/200] loss:0.3465 acc:0.9041 23 | INFO:root:========= Testing: epoch[21/200] loss:0.3570 acc:0.9078 24 | INFO:root:========= Testing: epoch[22/200] loss:0.3511 acc:0.9074 25 | INFO:root:========= Testing: epoch[23/200] loss:0.3416 acc:0.9098 26 | INFO:root:========= Testing: epoch[24/200] loss:0.3505 acc:0.9044 27 | INFO:root:========= Testing: epoch[25/200] loss:0.3503 acc:0.9082 28 | INFO:root:========= Testing: epoch[26/200] loss:0.3363 acc:0.9143 29 | INFO:root:========= Testing: epoch[27/200] loss:0.3313 acc:0.9088 30 | INFO:root:========= Testing: epoch[28/200] loss:0.3416 acc:0.9130 31 | INFO:root:========= Testing: epoch[29/200] loss:0.3608 acc:0.9096 32 | INFO:root:========= Testing: epoch[30/200] loss:0.3530 acc:0.9091 33 | INFO:root:========= Testing: epoch[31/200] loss:0.3620 acc:0.9096 34 | INFO:root:========= Testing: epoch[32/200] loss:0.3604 acc:0.9078 35 | INFO:root:========= Testing: epoch[33/200] loss:0.3610 acc:0.9088 36 | INFO:root:========= Testing: epoch[34/200] loss:0.3670 acc:0.9026 37 | INFO:root:========= Testing: epoch[35/200] loss:0.3653 acc:0.9081 38 | INFO:root:========= Testing: epoch[36/200] loss:0.3642 acc:0.9125 39 | INFO:root:========= Testing: epoch[37/200] loss:0.3483 acc:0.9162 40 | INFO:root:========= Testing: epoch[38/200] loss:0.3765 acc:0.9110 41 | INFO:root:========= Testing: epoch[39/200] loss:0.3764 acc:0.9093 42 | INFO:root:========= Testing: epoch[40/200] loss:0.3761 acc:0.9104 43 | INFO:root:========= Testing: epoch[41/200] loss:0.3942 acc:0.9110 44 | INFO:root:========= Testing: epoch[42/200] loss:0.3749 acc:0.9127 45 | INFO:root:========= Testing: epoch[43/200] loss:0.3773 acc:0.9104 46 | INFO:root:========= Testing: epoch[44/200] loss:0.3760 acc:0.9129 47 | INFO:root:========= Testing: epoch[45/200] loss:0.3839 acc:0.9095 48 | INFO:root:========= Testing: epoch[46/200] loss:0.3991 acc:0.9098 49 | INFO:root:========= Testing: epoch[47/200] loss:0.3769 acc:0.9071 50 | INFO:root:========= Testing: epoch[48/200] loss:0.3860 acc:0.9104 51 | INFO:root:========= Testing: epoch[49/200] loss:0.3768 acc:0.9140 52 | INFO:root:========= Testing: epoch[50/200] loss:0.4018 acc:0.9093 53 | INFO:root:========= Testing: epoch[51/200] loss:0.3908 acc:0.9162 54 | INFO:root:========= Testing: epoch[52/200] loss:0.3654 acc:0.9112 55 | INFO:root:========= Testing: epoch[53/200] loss:0.3973 acc:0.9108 56 | INFO:root:========= Testing: epoch[54/200] loss:0.4009 acc:0.9132 57 | INFO:root:========= Testing: epoch[55/200] loss:0.3830 acc:0.9143 58 | INFO:root:========= Testing: epoch[56/200] loss:0.4222 acc:0.9101 59 | INFO:root:========= Testing: epoch[57/200] loss:0.3980 acc:0.9146 60 | INFO:root:========= Testing: epoch[58/200] loss:0.3816 acc:0.9180 61 | INFO:root:========= Testing: epoch[59/200] loss:0.4181 acc:0.9083 62 | INFO:root:========= Testing: epoch[60/200] loss:0.3847 acc:0.9169 63 | INFO:root:========= Testing: epoch[61/200] loss:0.3940 acc:0.9136 64 | INFO:root:========= Testing: epoch[62/200] loss:0.4094 acc:0.9121 65 | INFO:root:========= Testing: epoch[63/200] loss:0.4080 acc:0.9120 66 | INFO:root:========= Testing: epoch[64/200] loss:0.3932 acc:0.9180 67 | INFO:root:========= Testing: epoch[65/200] loss:0.3847 acc:0.9169 68 | INFO:root:========= Testing: epoch[66/200] loss:0.4013 acc:0.9138 69 | INFO:root:========= Testing: epoch[67/200] loss:0.3893 acc:0.9197 70 | INFO:root:========= Testing: epoch[68/200] loss:0.3998 acc:0.9189 71 | INFO:root:========= Testing: epoch[69/200] loss:0.3936 acc:0.9202 72 | INFO:root:========= Testing: epoch[70/200] loss:0.4013 acc:0.9211 73 | INFO:root:========= Testing: epoch[71/200] loss:0.4140 acc:0.9192 74 | INFO:root:========= Testing: epoch[72/200] loss:0.4224 acc:0.9178 75 | INFO:root:========= Testing: epoch[73/200] loss:0.4265 acc:0.9165 76 | INFO:root:========= Testing: epoch[74/200] loss:0.4226 acc:0.9150 77 | INFO:root:========= Testing: epoch[75/200] loss:0.3734 acc:0.9231 78 | INFO:root:========= Testing: epoch[76/200] loss:0.4076 acc:0.9185 79 | INFO:root:========= Testing: epoch[77/200] loss:0.4200 acc:0.9144 80 | INFO:root:========= Testing: epoch[78/200] loss:0.4334 acc:0.9108 81 | INFO:root:========= Testing: epoch[79/200] loss:0.3953 acc:0.9209 82 | INFO:root:========= Testing: epoch[80/200] loss:0.4079 acc:0.9154 83 | INFO:root:========= Testing: epoch[81/200] loss:0.4233 acc:0.9149 84 | INFO:root:========= Testing: epoch[82/200] loss:0.4225 acc:0.9178 85 | INFO:root:========= Testing: epoch[83/200] loss:0.4024 acc:0.9185 86 | INFO:root:========= Testing: epoch[84/200] loss:0.4009 acc:0.9219 87 | INFO:root:========= Testing: epoch[85/200] loss:0.4163 acc:0.9253 88 | INFO:root:========= Testing: epoch[86/200] loss:0.4229 acc:0.9231 89 | INFO:root:========= Testing: epoch[87/200] loss:0.4285 acc:0.9209 90 | INFO:root:========= Testing: epoch[88/200] loss:0.3989 acc:0.9233 91 | INFO:root:========= Testing: epoch[89/200] loss:0.4303 acc:0.9204 92 | INFO:root:========= Testing: epoch[90/200] loss:0.4311 acc:0.9172 93 | INFO:root:========= Testing: epoch[91/200] loss:0.4097 acc:0.9201 94 | INFO:root:========= Testing: epoch[92/200] loss:0.4324 acc:0.9193 95 | INFO:root:========= Testing: epoch[93/200] loss:0.4646 acc:0.9147 96 | INFO:root:========= Testing: epoch[94/200] loss:0.4754 acc:0.9172 97 | INFO:root:========= Testing: epoch[95/200] loss:0.4605 acc:0.9138 98 | INFO:root:========= Testing: epoch[96/200] loss:0.4540 acc:0.9169 99 | INFO:root:========= Testing: epoch[97/200] loss:0.4432 acc:0.9196 100 | INFO:root:========= Testing: epoch[98/200] loss:0.4243 acc:0.9251 101 | INFO:root:========= Testing: epoch[99/200] loss:0.4365 acc:0.9189 102 | INFO:root:========= Testing: epoch[100/200] loss:0.4769 acc:0.9172 103 | INFO:root:========= Testing: epoch[101/200] loss:0.4669 acc:0.9192 104 | INFO:root:========= Testing: epoch[102/200] loss:0.4714 acc:0.9177 105 | INFO:root:========= Testing: epoch[103/200] loss:0.4889 acc:0.9141 106 | INFO:root:========= Testing: epoch[104/200] loss:0.4605 acc:0.9227 107 | INFO:root:========= Testing: epoch[105/200] loss:0.4555 acc:0.9212 108 | INFO:root:========= Testing: epoch[106/200] loss:0.4639 acc:0.9167 109 | INFO:root:========= Testing: epoch[107/200] loss:0.4604 acc:0.9197 110 | INFO:root:========= Testing: epoch[108/200] loss:0.4477 acc:0.9229 111 | INFO:root:========= Testing: epoch[109/200] loss:0.4494 acc:0.9229 112 | INFO:root:========= Testing: epoch[110/200] loss:0.4636 acc:0.9194 113 | INFO:root:========= Testing: epoch[111/200] loss:0.4914 acc:0.9197 114 | INFO:root:========= Testing: epoch[112/200] loss:0.4766 acc:0.9135 115 | INFO:root:========= Testing: epoch[113/200] loss:0.4723 acc:0.9162 116 | INFO:root:========= Testing: epoch[114/200] loss:0.4463 acc:0.9194 117 | INFO:root:========= Testing: epoch[115/200] loss:0.4581 acc:0.9185 118 | INFO:root:========= Testing: epoch[116/200] loss:0.4616 acc:0.9213 119 | INFO:root:========= Testing: epoch[117/200] loss:0.4906 acc:0.9152 120 | INFO:root:========= Testing: epoch[118/200] loss:0.4653 acc:0.9159 121 | INFO:root:========= Testing: epoch[119/200] loss:0.4566 acc:0.9172 122 | INFO:root:========= Testing: epoch[120/200] loss:0.4679 acc:0.9184 123 | INFO:root:========= Testing: epoch[121/200] loss:0.4532 acc:0.9182 124 | INFO:root:========= Testing: epoch[122/200] loss:0.4509 acc:0.9230 125 | INFO:root:========= Testing: epoch[123/200] loss:0.4750 acc:0.9209 126 | INFO:root:========= Testing: epoch[124/200] loss:0.5052 acc:0.9152 127 | INFO:root:========= Testing: epoch[125/200] loss:0.4509 acc:0.9265 128 | INFO:root:========= Testing: epoch[126/200] loss:0.4404 acc:0.9245 129 | INFO:root:========= Testing: epoch[127/200] loss:0.4824 acc:0.9204 130 | INFO:root:========= Testing: epoch[128/200] loss:0.4875 acc:0.9213 131 | INFO:root:========= Testing: epoch[129/200] loss:0.4458 acc:0.9221 132 | INFO:root:========= Testing: epoch[130/200] loss:0.4464 acc:0.9229 133 | INFO:root:========= Testing: epoch[131/200] loss:0.4725 acc:0.9191 134 | INFO:root:========= Testing: epoch[132/200] loss:0.5117 acc:0.9187 135 | INFO:root:========= Testing: epoch[133/200] loss:0.4793 acc:0.9193 136 | INFO:root:========= Testing: epoch[134/200] loss:0.4864 acc:0.9140 137 | INFO:root:========= Testing: epoch[135/200] loss:0.4737 acc:0.9151 138 | INFO:root:========= Testing: epoch[136/200] loss:0.5139 acc:0.9201 139 | INFO:root:========= Testing: epoch[137/200] loss:0.4853 acc:0.9231 140 | INFO:root:========= Testing: epoch[138/200] loss:0.4772 acc:0.9191 141 | INFO:root:========= Testing: epoch[139/200] loss:0.4990 acc:0.9184 142 | INFO:root:========= Testing: epoch[140/200] loss:0.5053 acc:0.9177 143 | INFO:root:========= Testing: epoch[141/200] loss:0.4589 acc:0.9245 144 | INFO:root:========= Testing: epoch[142/200] loss:0.4645 acc:0.9235 145 | INFO:root:========= Testing: epoch[143/200] loss:0.4767 acc:0.9191 146 | INFO:root:========= Testing: epoch[144/200] loss:0.4771 acc:0.9191 147 | INFO:root:========= Testing: epoch[145/200] loss:0.5273 acc:0.9162 148 | INFO:root:========= Testing: epoch[146/200] loss:0.5156 acc:0.9198 149 | INFO:root:========= Testing: epoch[147/200] loss:0.4720 acc:0.9235 150 | INFO:root:========= Testing: epoch[148/200] loss:0.5022 acc:0.9230 151 | INFO:root:========= Testing: epoch[149/200] loss:0.4886 acc:0.9150 152 | INFO:root:========= Testing: epoch[150/200] loss:0.5130 acc:0.9159 153 | INFO:root:========= Testing: epoch[151/200] loss:0.4812 acc:0.9223 154 | INFO:root:========= Testing: epoch[152/200] loss:0.4793 acc:0.9250 155 | INFO:root:========= Testing: epoch[153/200] loss:0.4909 acc:0.9262 156 | INFO:root:========= Testing: epoch[154/200] loss:0.4792 acc:0.9219 157 | INFO:root:========= Testing: epoch[155/200] loss:0.4701 acc:0.9221 158 | INFO:root:========= Testing: epoch[156/200] loss:0.4594 acc:0.9216 159 | INFO:root:========= Testing: epoch[157/200] loss:0.4789 acc:0.9245 160 | INFO:root:========= Testing: epoch[158/200] loss:0.5124 acc:0.9216 161 | INFO:root:========= Testing: epoch[159/200] loss:0.5149 acc:0.9262 162 | INFO:root:========= Testing: epoch[160/200] loss:0.5231 acc:0.9198 163 | INFO:root:========= Testing: epoch[161/200] loss:0.5032 acc:0.9223 164 | INFO:root:========= Testing: epoch[162/200] loss:0.4974 acc:0.9208 165 | INFO:root:========= Testing: epoch[163/200] loss:0.4859 acc:0.9213 166 | INFO:root:========= Testing: epoch[164/200] loss:0.4884 acc:0.9228 167 | INFO:root:========= Testing: epoch[165/200] loss:0.5026 acc:0.9228 168 | INFO:root:========= Testing: epoch[166/200] loss:0.4738 acc:0.9257 169 | INFO:root:========= Testing: epoch[167/200] loss:0.4744 acc:0.9260 170 | INFO:root:========= Testing: epoch[168/200] loss:0.5474 acc:0.9171 171 | INFO:root:========= Testing: epoch[169/200] loss:0.5192 acc:0.9184 172 | INFO:root:========= Testing: epoch[170/200] loss:0.4908 acc:0.9205 173 | INFO:root:========= Testing: epoch[171/200] loss:0.5110 acc:0.9166 174 | INFO:root:========= Testing: epoch[172/200] loss:0.5501 acc:0.9156 175 | INFO:root:========= Testing: epoch[173/200] loss:0.5301 acc:0.9198 176 | INFO:root:========= Testing: epoch[174/200] loss:0.5254 acc:0.9259 177 | INFO:root:========= Testing: epoch[175/200] loss:0.5210 acc:0.9237 178 | INFO:root:========= Testing: epoch[176/200] loss:0.5429 acc:0.9154 179 | INFO:root:========= Testing: epoch[177/200] loss:0.5710 acc:0.9146 180 | INFO:root:========= Testing: epoch[178/200] loss:0.5282 acc:0.9221 181 | INFO:root:========= Testing: epoch[179/200] loss:0.5379 acc:0.9211 182 | INFO:root:========= Testing: epoch[180/200] loss:0.5450 acc:0.9179 183 | INFO:root:========= Testing: epoch[181/200] loss:0.5345 acc:0.9179 184 | INFO:root:========= Testing: epoch[182/200] loss:0.5288 acc:0.9221 185 | INFO:root:========= Testing: epoch[183/200] loss:0.5422 acc:0.9173 186 | INFO:root:========= Testing: epoch[184/200] loss:0.5054 acc:0.9239 187 | INFO:root:========= Testing: epoch[185/200] loss:0.5089 acc:0.9244 188 | INFO:root:========= Testing: epoch[186/200] loss:0.5009 acc:0.9247 189 | INFO:root:========= Testing: epoch[187/200] loss:0.5523 acc:0.9182 190 | INFO:root:========= Testing: epoch[188/200] loss:0.5347 acc:0.9211 191 | INFO:root:========= Testing: epoch[189/200] loss:0.5305 acc:0.9203 192 | INFO:root:========= Testing: epoch[190/200] loss:0.5579 acc:0.9149 193 | INFO:root:========= Testing: epoch[191/200] loss:0.5412 acc:0.9159 194 | INFO:root:========= Testing: epoch[192/200] loss:0.5582 acc:0.9179 195 | INFO:root:========= Testing: epoch[193/200] loss:0.5198 acc:0.9208 196 | INFO:root:========= Testing: epoch[194/200] loss:0.5585 acc:0.9110 197 | INFO:root:========= Testing: epoch[195/200] loss:0.5183 acc:0.9188 198 | INFO:root:========= Testing: epoch[196/200] loss:0.5136 acc:0.9208 199 | INFO:root:========= Testing: epoch[197/200] loss:0.5165 acc:0.9167 200 | INFO:root:========= Testing: epoch[198/200] loss:0.4953 acc:0.9182 201 | INFO:root:========= Testing: epoch[199/200] loss:0.5040 acc:0.9249 202 | Training torch.Size([10000, 1, 40, 40]) torch.Size([10000]) 203 | Testing torch.Size([2000, 1, 40, 40]) torch.Size([2000]) 204 | Train batch_nb:157 205 | Test batch_nb:16 206 | -------------------------------------------------------------------------------- /py35_pytorch03_version/config.py: -------------------------------------------------------------------------------- 1 | cuda_num = 1 2 | LR = 0.001 3 | epoch = 200 4 | show_train_result_every_batch = 100 5 | test_every_epoch = 1 6 | save_model_every_epoch = 1 7 | 8 | height = 40 9 | width = 40 10 | channel = 1 11 | 12 | train_batch_size = 64 13 | test_batch_size = 128 14 | 15 | drop_prob = 0.8 16 | 17 | data_path = 'data/mnist_sequence1_sample_5distortions5x5.npz' 18 | model_name = 'model_%s.pkl' 19 | model_dir = 'models/' 20 | transform_img_dir = 'transform_img' 21 | mode = 'stn' 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /py35_pytorch03_version/data/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/py35_pytorch03_version/data/.gitignore -------------------------------------------------------------------------------- /py35_pytorch03_version/lib/__pycache__/data_loader.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/py35_pytorch03_version/lib/__pycache__/data_loader.cpython-35.pyc -------------------------------------------------------------------------------- /py35_pytorch03_version/lib/__pycache__/network.cpython-35.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/py35_pytorch03_version/lib/__pycache__/network.cpython-35.pyc -------------------------------------------------------------------------------- /py35_pytorch03_version/lib/data_loader.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import torch 3 | from torch.utils import data 4 | import config as cfg 5 | import logging 6 | 7 | # logging.getLogger().setLevel(logging.INFO) 8 | 9 | 10 | def to_torch_formart(img, target, data_type=''): 11 | ''' 12 | 13 | :param img: (b, l) 14 | :param target: (b, 1) 15 | :param data_type: string 16 | :return: (b, c, h, w), (b) 17 | ''' 18 | batch_size = img.size(0) 19 | img = img.view(batch_size, cfg.channel, cfg.height, cfg.width) 20 | target = target.view(batch_size) 21 | print(data_type, img.size(), target.size()) 22 | return img, target 23 | 24 | 25 | def get_data_loader(): 26 | ''' 27 | 28 | :return: train_loader, test_loader 29 | ''' 30 | mnist_cluttered = np.load(cfg.data_path) 31 | X_train = torch.from_numpy(mnist_cluttered['X_train']) 32 | y_train = torch.from_numpy(mnist_cluttered['y_train']) 33 | X_valid = torch.from_numpy(mnist_cluttered['X_valid']) 34 | y_valid = torch.from_numpy(mnist_cluttered['y_valid']) 35 | X_test = torch.from_numpy(mnist_cluttered['X_test']) 36 | y_test = torch.from_numpy(mnist_cluttered['y_test']) 37 | 38 | X_train, y_train = to_torch_formart(X_train, y_train, data_type='Training') 39 | X_test = torch.cat([X_test, X_valid], dim=0) 40 | y_test = torch.cat([y_test, y_valid], dim=0) 41 | X_test, y_test = to_torch_formart(X_test, y_test, data_type='Testing') 42 | 43 | train_dataset = data.TensorDataset(data_tensor=X_train, target_tensor=y_train) 44 | test_dataset = data.TensorDataset(data_tensor=X_test, target_tensor=y_test) 45 | 46 | train_loader = data.DataLoader(dataset=train_dataset, batch_size=cfg.train_batch_size, shuffle=True) 47 | test_loader = data.DataLoader(dataset=test_dataset, batch_size=cfg.test_batch_size) 48 | 49 | return train_loader, test_loader 50 | 51 | -------------------------------------------------------------------------------- /py35_pytorch03_version/lib/network.py: -------------------------------------------------------------------------------- 1 | import torch 2 | from torch import nn 3 | from torch.nn import functional as F 4 | import numpy as np 5 | import config as cfg 6 | 7 | 8 | class Network(nn.Module): 9 | def __init__(self, mode='stn'): 10 | assert mode in ['stn', 'cnn'] 11 | 12 | super(Network, self).__init__() 13 | self.mode = mode 14 | self.local_net = LocalNetwork() 15 | self.conv = nn.Sequential( 16 | nn.Conv2d(in_channels=cfg.channel, out_channels=16, kernel_size=3, stride=2, padding=1), 17 | nn.ReLU(), 18 | nn.Conv2d(in_channels=16, out_channels=16, kernel_size=3, stride=2, padding=1), 19 | nn.ReLU(), 20 | ) 21 | 22 | self.fc = nn.Sequential( 23 | nn.Linear(in_features=cfg.height // 4 * cfg.width // 4 * 16, out_features=1024), 24 | nn.ReLU(), 25 | nn.Dropout(cfg.drop_prob), 26 | nn.Linear(in_features=1024, out_features=10) 27 | ) 28 | 29 | def forward(self, img): 30 | ''' 31 | :param img: (b, c, h, w) 32 | :return: (b, c, h, w), (b,) 33 | ''' 34 | batch_size = img.size(0) 35 | if self.mode == 'stn': 36 | transform_img = self.local_net(img) 37 | img = transform_img 38 | else: 39 | transform_img = None 40 | 41 | conv_output = self.conv(img).view(batch_size, -1) 42 | predict = self.fc(conv_output) 43 | return transform_img, predict 44 | 45 | 46 | class LocalNetwork(nn.Module): 47 | def __init__(self): 48 | super(LocalNetwork, self).__init__() 49 | self.fc = nn.Sequential( 50 | nn.Linear(in_features=cfg.channel * cfg.height * cfg.width, 51 | out_features=20), 52 | nn.Tanh(), 53 | nn.Dropout(cfg.drop_prob), 54 | nn.Linear(in_features=20, out_features=6), 55 | nn.Tanh(), 56 | ) 57 | bias = torch.from_numpy(np.array([1, 0, 0, 0, 1, 0])) 58 | 59 | nn.init.constant(self.fc[3].weight, 0) 60 | self.fc[3].bias.data.copy_(bias) 61 | 62 | def forward(self, img): 63 | ''' 64 | 65 | :param img: (b, c, h, w) 66 | :return: (b, c, h, w) 67 | ''' 68 | batch_size = img.size(0) 69 | 70 | theta = self.fc(img.view(batch_size, -1)).view(batch_size, 2, 3) 71 | 72 | grid = F.affine_grid(theta, torch.Size((batch_size, cfg.channel, cfg.height, cfg.width))) 73 | img_transform = F.grid_sample(img, grid) 74 | 75 | return img_transform 76 | -------------------------------------------------------------------------------- /py35_pytorch03_version/main.py: -------------------------------------------------------------------------------- 1 | import torch 2 | from torch import nn 3 | from torch.autograd import Variable 4 | import torchvision.utils as vutils 5 | from lib.data_loader import get_data_loader 6 | from lib.network import Network 7 | import config as cfg 8 | import logging 9 | import os 10 | 11 | 12 | def calc_acc(x, y): 13 | x = torch.max(x, dim=-1)[1] 14 | accuracy = sum(x == y) / x.size(0) 15 | return accuracy 16 | 17 | logging.getLogger().setLevel(logging.INFO) 18 | logging.info('Mode: %s' % cfg.mode) 19 | if not os.path.exists(cfg.model_dir): 20 | os.mkdir(cfg.model_dir) 21 | if not os.path.exists(cfg.transform_img_dir): 22 | os.mkdir(cfg.transform_img_dir) 23 | 24 | train_loader, test_loader = get_data_loader() 25 | train_batch_nb = len(train_loader) 26 | test_batch_nb = len(test_loader) 27 | 28 | print('Train batch_nb:%d' % train_batch_nb) 29 | print('Test batch_nb:%d' % test_batch_nb) 30 | 31 | net = Network(mode=cfg.mode) 32 | if torch.cuda.is_available(): 33 | net.cuda(cfg.cuda_num) 34 | 35 | opt = torch.optim.Adam(net.parameters(), lr=cfg.LR) 36 | loss_func = nn.CrossEntropyLoss() 37 | 38 | for epoch_idx in range(cfg.epoch): 39 | # ========================== Training Model ============================= 40 | net.train() 41 | for batch_idx, (train_img, train_target) in enumerate(train_loader): 42 | train_img = Variable(train_img) 43 | train_target = Variable(train_target) 44 | 45 | if torch.cuda.is_available(): 46 | train_img = train_img.cuda(cfg.cuda_num) 47 | train_target = train_target.cuda(cfg.cuda_num) 48 | 49 | _, predict = net(train_img) 50 | 51 | loss = loss_func(predict, train_target) 52 | net.zero_grad() 53 | loss.backward() 54 | opt.step() 55 | 56 | acc = calc_acc(predict.cpu().data, train_target.cpu().data) 57 | 58 | # if batch_idx % cfg.show_train_result_every_batch == 0: 59 | # logging.info('epoch[%d/%d] batch[%d/%d] loss:%.4f acc:%.4f' 60 | # % (epoch_idx, cfg.epoch, batch_idx, train_batch_nb, loss.data[0], acc)) 61 | 62 | # ========================== Testing Model ============================= 63 | if (epoch_idx + 1) % cfg.test_every_epoch == 0: 64 | net.eval() 65 | total_loss = 0 66 | total_acc = 0 67 | for batch_idx, (test_img, test_target) in enumerate(test_loader): 68 | batch_size = test_img.size(0) 69 | 70 | test_img = Variable(test_img, volatile=True) 71 | test_target = Variable(test_target, volatile=True) 72 | 73 | if torch.cuda.is_available(): 74 | test_img = test_img.cuda(cfg.cuda_num) 75 | test_target = test_target.cuda(cfg.cuda_num) 76 | 77 | transform_img, predict = net(test_img) 78 | 79 | loss = loss_func(predict, test_target) 80 | acc = calc_acc(predict.cpu().data, test_target.cpu().data) 81 | 82 | total_loss += loss 83 | total_acc += acc 84 | 85 | if cfg.mode == 'stn': 86 | img_list = [] 87 | for idx in range(batch_size): 88 | img_list.append(test_img[idx]) 89 | img_list.append(transform_img[idx]) 90 | output_img = torch.stack(img_list) 91 | 92 | vutils.save_image(output_img.data, os.path.join(cfg.transform_img_dir, '%d.png' % batch_idx), 93 | nrow=20) 94 | 95 | mean_loss = total_loss / test_batch_nb 96 | mean_acc = total_acc / test_batch_nb 97 | logging.info('========= Testing: epoch[%d/%d] loss:%.4f acc:%.4f' % (epoch_idx, cfg.epoch, mean_loss.data[0], mean_acc)) 98 | 99 | if (epoch_idx + 1) % cfg.save_model_every_epoch == 0: 100 | state_dict = net.state_dict() 101 | torch.save(state_dict, os.path.join(cfg.model_dir, cfg.model_name % cfg.mode)) 102 | -------------------------------------------------------------------------------- /py35_pytorch03_version/models/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/py35_pytorch03_version/models/.gitignore -------------------------------------------------------------------------------- /py35_pytorch03_version/stn.out: -------------------------------------------------------------------------------- 1 | INFO:root:Mode: stn 2 | INFO:root:========= Testing: epoch[0/200] loss:0.8925 acc:0.7314 3 | INFO:root:========= Testing: epoch[1/200] loss:0.5095 acc:0.8597 4 | INFO:root:========= Testing: epoch[2/200] loss:0.3937 acc:0.8884 5 | INFO:root:========= Testing: epoch[3/200] loss:0.3402 acc:0.9026 6 | INFO:root:========= Testing: epoch[4/200] loss:0.2885 acc:0.9093 7 | INFO:root:========= Testing: epoch[5/200] loss:0.2838 acc:0.9155 8 | INFO:root:========= Testing: epoch[6/200] loss:0.2368 acc:0.9284 9 | INFO:root:========= Testing: epoch[7/200] loss:0.2268 acc:0.9324 10 | INFO:root:========= Testing: epoch[8/200] loss:0.2149 acc:0.9328 11 | INFO:root:========= Testing: epoch[9/200] loss:0.2107 acc:0.9346 12 | INFO:root:========= Testing: epoch[10/200] loss:0.1977 acc:0.9399 13 | INFO:root:========= Testing: epoch[11/200] loss:0.2072 acc:0.9340 14 | INFO:root:========= Testing: epoch[12/200] loss:0.1898 acc:0.9389 15 | INFO:root:========= Testing: epoch[13/200] loss:0.1812 acc:0.9478 16 | INFO:root:========= Testing: epoch[14/200] loss:0.1699 acc:0.9479 17 | INFO:root:========= Testing: epoch[15/200] loss:0.1881 acc:0.9412 18 | INFO:root:========= Testing: epoch[16/200] loss:0.1818 acc:0.9396 19 | INFO:root:========= Testing: epoch[17/200] loss:0.1679 acc:0.9448 20 | INFO:root:========= Testing: epoch[18/200] loss:0.1562 acc:0.9540 21 | INFO:root:========= Testing: epoch[19/200] loss:0.1541 acc:0.9489 22 | INFO:root:========= Testing: epoch[20/200] loss:0.1523 acc:0.9535 23 | INFO:root:========= Testing: epoch[21/200] loss:0.1499 acc:0.9550 24 | INFO:root:========= Testing: epoch[22/200] loss:0.1464 acc:0.9557 25 | INFO:root:========= Testing: epoch[23/200] loss:0.1331 acc:0.9547 26 | INFO:root:========= Testing: epoch[24/200] loss:0.1457 acc:0.9510 27 | INFO:root:========= Testing: epoch[25/200] loss:0.1437 acc:0.9518 28 | INFO:root:========= Testing: epoch[26/200] loss:0.1374 acc:0.9539 29 | INFO:root:========= Testing: epoch[27/200] loss:0.1463 acc:0.9561 30 | INFO:root:========= Testing: epoch[28/200] loss:0.1423 acc:0.9557 31 | INFO:root:========= Testing: epoch[29/200] loss:0.1417 acc:0.9573 32 | INFO:root:========= Testing: epoch[30/200] loss:0.1263 acc:0.9574 33 | INFO:root:========= Testing: epoch[31/200] loss:0.1338 acc:0.9521 34 | INFO:root:========= Testing: epoch[32/200] loss:0.1327 acc:0.9586 35 | INFO:root:========= Testing: epoch[33/200] loss:0.1349 acc:0.9526 36 | INFO:root:========= Testing: epoch[34/200] loss:0.1379 acc:0.9601 37 | INFO:root:========= Testing: epoch[35/200] loss:0.1280 acc:0.9607 38 | INFO:root:========= Testing: epoch[36/200] loss:0.1348 acc:0.9556 39 | INFO:root:========= Testing: epoch[37/200] loss:0.1241 acc:0.9618 40 | INFO:root:========= Testing: epoch[38/200] loss:0.1398 acc:0.9539 41 | INFO:root:========= Testing: epoch[39/200] loss:0.1259 acc:0.9625 42 | INFO:root:========= Testing: epoch[40/200] loss:0.1224 acc:0.9581 43 | INFO:root:========= Testing: epoch[41/200] loss:0.1218 acc:0.9633 44 | INFO:root:========= Testing: epoch[42/200] loss:0.1212 acc:0.9630 45 | INFO:root:========= Testing: epoch[43/200] loss:0.1315 acc:0.9612 46 | INFO:root:========= Testing: epoch[44/200] loss:0.1265 acc:0.9569 47 | INFO:root:========= Testing: epoch[45/200] loss:0.1299 acc:0.9618 48 | INFO:root:========= Testing: epoch[46/200] loss:0.1298 acc:0.9591 49 | INFO:root:========= Testing: epoch[47/200] loss:0.1197 acc:0.9649 50 | INFO:root:========= Testing: epoch[48/200] loss:0.1294 acc:0.9623 51 | INFO:root:========= Testing: epoch[49/200] loss:0.1390 acc:0.9570 52 | INFO:root:========= Testing: epoch[50/200] loss:0.1229 acc:0.9660 53 | INFO:root:========= Testing: epoch[51/200] loss:0.1218 acc:0.9620 54 | INFO:root:========= Testing: epoch[52/200] loss:0.1181 acc:0.9617 55 | INFO:root:========= Testing: epoch[53/200] loss:0.1355 acc:0.9584 56 | INFO:root:========= Testing: epoch[54/200] loss:0.1252 acc:0.9600 57 | INFO:root:========= Testing: epoch[55/200] loss:0.1179 acc:0.9632 58 | INFO:root:========= Testing: epoch[56/200] loss:0.1140 acc:0.9647 59 | INFO:root:========= Testing: epoch[57/200] loss:0.1262 acc:0.9636 60 | INFO:root:========= Testing: epoch[58/200] loss:0.1073 acc:0.9672 61 | INFO:root:========= Testing: epoch[59/200] loss:0.1186 acc:0.9640 62 | INFO:root:========= Testing: epoch[60/200] loss:0.1161 acc:0.9654 63 | INFO:root:========= Testing: epoch[61/200] loss:0.1149 acc:0.9649 64 | INFO:root:========= Testing: epoch[62/200] loss:0.0963 acc:0.9704 65 | INFO:root:========= Testing: epoch[63/200] loss:0.1230 acc:0.9610 66 | INFO:root:========= Testing: epoch[64/200] loss:0.1238 acc:0.9630 67 | INFO:root:========= Testing: epoch[65/200] loss:0.1166 acc:0.9627 68 | INFO:root:========= Testing: epoch[66/200] loss:0.1052 acc:0.9666 69 | INFO:root:========= Testing: epoch[67/200] loss:0.1143 acc:0.9674 70 | INFO:root:========= Testing: epoch[68/200] loss:0.1174 acc:0.9630 71 | INFO:root:========= Testing: epoch[69/200] loss:0.1088 acc:0.9649 72 | INFO:root:========= Testing: epoch[70/200] loss:0.1209 acc:0.9674 73 | INFO:root:========= Testing: epoch[71/200] loss:0.1114 acc:0.9699 74 | INFO:root:========= Testing: epoch[72/200] loss:0.1244 acc:0.9660 75 | INFO:root:========= Testing: epoch[73/200] loss:0.1215 acc:0.9607 76 | INFO:root:========= Testing: epoch[74/200] loss:0.1192 acc:0.9659 77 | INFO:root:========= Testing: epoch[75/200] loss:0.1136 acc:0.9649 78 | INFO:root:========= Testing: epoch[76/200] loss:0.1097 acc:0.9683 79 | INFO:root:========= Testing: epoch[77/200] loss:0.1148 acc:0.9682 80 | INFO:root:========= Testing: epoch[78/200] loss:0.1240 acc:0.9646 81 | INFO:root:========= Testing: epoch[79/200] loss:0.1137 acc:0.9704 82 | INFO:root:========= Testing: epoch[80/200] loss:0.1150 acc:0.9671 83 | INFO:root:========= Testing: epoch[81/200] loss:0.1109 acc:0.9653 84 | INFO:root:========= Testing: epoch[82/200] loss:0.1080 acc:0.9682 85 | INFO:root:========= Testing: epoch[83/200] loss:0.1054 acc:0.9694 86 | INFO:root:========= Testing: epoch[84/200] loss:0.1166 acc:0.9662 87 | INFO:root:========= Testing: epoch[85/200] loss:0.1017 acc:0.9714 88 | INFO:root:========= Testing: epoch[86/200] loss:0.1308 acc:0.9646 89 | INFO:root:========= Testing: epoch[87/200] loss:0.1116 acc:0.9622 90 | INFO:root:========= Testing: epoch[88/200] loss:0.1151 acc:0.9677 91 | INFO:root:========= Testing: epoch[89/200] loss:0.1089 acc:0.9670 92 | INFO:root:========= Testing: epoch[90/200] loss:0.1214 acc:0.9650 93 | INFO:root:========= Testing: epoch[91/200] loss:0.1084 acc:0.9677 94 | INFO:root:========= Testing: epoch[92/200] loss:0.1088 acc:0.9682 95 | INFO:root:========= Testing: epoch[93/200] loss:0.1060 acc:0.9691 96 | INFO:root:========= Testing: epoch[94/200] loss:0.1089 acc:0.9691 97 | INFO:root:========= Testing: epoch[95/200] loss:0.1111 acc:0.9637 98 | INFO:root:========= Testing: epoch[96/200] loss:0.1074 acc:0.9667 99 | INFO:root:========= Testing: epoch[97/200] loss:0.1195 acc:0.9664 100 | INFO:root:========= Testing: epoch[98/200] loss:0.1213 acc:0.9669 101 | INFO:root:========= Testing: epoch[99/200] loss:0.0984 acc:0.9701 102 | INFO:root:========= Testing: epoch[100/200] loss:0.1175 acc:0.9632 103 | INFO:root:========= Testing: epoch[101/200] loss:0.1092 acc:0.9709 104 | INFO:root:========= Testing: epoch[102/200] loss:0.1133 acc:0.9639 105 | INFO:root:========= Testing: epoch[103/200] loss:0.0997 acc:0.9703 106 | INFO:root:========= Testing: epoch[104/200] loss:0.1016 acc:0.9729 107 | INFO:root:========= Testing: epoch[105/200] loss:0.1097 acc:0.9645 108 | INFO:root:========= Testing: epoch[106/200] loss:0.1047 acc:0.9711 109 | INFO:root:========= Testing: epoch[107/200] loss:0.1069 acc:0.9723 110 | INFO:root:========= Testing: epoch[108/200] loss:0.1105 acc:0.9703 111 | INFO:root:========= Testing: epoch[109/200] loss:0.1189 acc:0.9689 112 | INFO:root:========= Testing: epoch[110/200] loss:0.1164 acc:0.9686 113 | INFO:root:========= Testing: epoch[111/200] loss:0.1016 acc:0.9726 114 | INFO:root:========= Testing: epoch[112/200] loss:0.1078 acc:0.9679 115 | INFO:root:========= Testing: epoch[113/200] loss:0.1015 acc:0.9661 116 | INFO:root:========= Testing: epoch[114/200] loss:0.1122 acc:0.9682 117 | INFO:root:========= Testing: epoch[115/200] loss:0.1024 acc:0.9707 118 | INFO:root:========= Testing: epoch[116/200] loss:0.0997 acc:0.9696 119 | INFO:root:========= Testing: epoch[117/200] loss:0.1137 acc:0.9656 120 | INFO:root:========= Testing: epoch[118/200] loss:0.1034 acc:0.9684 121 | INFO:root:========= Testing: epoch[119/200] loss:0.1066 acc:0.9679 122 | INFO:root:========= Testing: epoch[120/200] loss:0.1089 acc:0.9669 123 | INFO:root:========= Testing: epoch[121/200] loss:0.0982 acc:0.9755 124 | INFO:root:========= Testing: epoch[122/200] loss:0.1133 acc:0.9659 125 | INFO:root:========= Testing: epoch[123/200] loss:0.0990 acc:0.9688 126 | INFO:root:========= Testing: epoch[124/200] loss:0.0929 acc:0.9729 127 | INFO:root:========= Testing: epoch[125/200] loss:0.0907 acc:0.9713 128 | INFO:root:========= Testing: epoch[126/200] loss:0.1017 acc:0.9684 129 | INFO:root:========= Testing: epoch[127/200] loss:0.0902 acc:0.9745 130 | INFO:root:========= Testing: epoch[128/200] loss:0.1060 acc:0.9671 131 | INFO:root:========= Testing: epoch[129/200] loss:0.1047 acc:0.9713 132 | INFO:root:========= Testing: epoch[130/200] loss:0.1101 acc:0.9709 133 | INFO:root:========= Testing: epoch[131/200] loss:0.0992 acc:0.9735 134 | INFO:root:========= Testing: epoch[132/200] loss:0.1221 acc:0.9638 135 | INFO:root:========= Testing: epoch[133/200] loss:0.0964 acc:0.9703 136 | INFO:root:========= Testing: epoch[134/200] loss:0.1012 acc:0.9721 137 | INFO:root:========= Testing: epoch[135/200] loss:0.1140 acc:0.9696 138 | INFO:root:========= Testing: epoch[136/200] loss:0.1129 acc:0.9716 139 | INFO:root:========= Testing: epoch[137/200] loss:0.1137 acc:0.9667 140 | INFO:root:========= Testing: epoch[138/200] loss:0.1108 acc:0.9674 141 | INFO:root:========= Testing: epoch[139/200] loss:0.0920 acc:0.9723 142 | INFO:root:========= Testing: epoch[140/200] loss:0.1038 acc:0.9693 143 | INFO:root:========= Testing: epoch[141/200] loss:0.1046 acc:0.9689 144 | INFO:root:========= Testing: epoch[142/200] loss:0.1028 acc:0.9738 145 | INFO:root:========= Testing: epoch[143/200] loss:0.1051 acc:0.9740 146 | INFO:root:========= Testing: epoch[144/200] loss:0.1044 acc:0.9691 147 | INFO:root:========= Testing: epoch[145/200] loss:0.1052 acc:0.9723 148 | INFO:root:========= Testing: epoch[146/200] loss:0.1103 acc:0.9709 149 | INFO:root:========= Testing: epoch[147/200] loss:0.1009 acc:0.9728 150 | INFO:root:========= Testing: epoch[148/200] loss:0.1131 acc:0.9693 151 | INFO:root:========= Testing: epoch[149/200] loss:0.1087 acc:0.9688 152 | INFO:root:========= Testing: epoch[150/200] loss:0.1042 acc:0.9688 153 | INFO:root:========= Testing: epoch[151/200] loss:0.0955 acc:0.9760 154 | INFO:root:========= Testing: epoch[152/200] loss:0.0838 acc:0.9757 155 | INFO:root:========= Testing: epoch[153/200] loss:0.0932 acc:0.9730 156 | INFO:root:========= Testing: epoch[154/200] loss:0.0995 acc:0.9711 157 | INFO:root:========= Testing: epoch[155/200] loss:0.0931 acc:0.9737 158 | INFO:root:========= Testing: epoch[156/200] loss:0.0910 acc:0.9711 159 | INFO:root:========= Testing: epoch[157/200] loss:0.1078 acc:0.9706 160 | INFO:root:========= Testing: epoch[158/200] loss:0.0972 acc:0.9732 161 | INFO:root:========= Testing: epoch[159/200] loss:0.0914 acc:0.9740 162 | INFO:root:========= Testing: epoch[160/200] loss:0.0921 acc:0.9740 163 | INFO:root:========= Testing: epoch[161/200] loss:0.0925 acc:0.9750 164 | INFO:root:========= Testing: epoch[162/200] loss:0.0967 acc:0.9700 165 | INFO:root:========= Testing: epoch[163/200] loss:0.0988 acc:0.9705 166 | INFO:root:========= Testing: epoch[164/200] loss:0.1072 acc:0.9726 167 | INFO:root:========= Testing: epoch[165/200] loss:0.1136 acc:0.9713 168 | INFO:root:========= Testing: epoch[166/200] loss:0.1080 acc:0.9703 169 | INFO:root:========= Testing: epoch[167/200] loss:0.1031 acc:0.9737 170 | INFO:root:========= Testing: epoch[168/200] loss:0.0976 acc:0.9775 171 | INFO:root:========= Testing: epoch[169/200] loss:0.0829 acc:0.9787 172 | INFO:root:========= Testing: epoch[170/200] loss:0.1034 acc:0.9745 173 | INFO:root:========= Testing: epoch[171/200] loss:0.1113 acc:0.9686 174 | INFO:root:========= Testing: epoch[172/200] loss:0.0887 acc:0.9779 175 | INFO:root:========= Testing: epoch[173/200] loss:0.0948 acc:0.9748 176 | INFO:root:========= Testing: epoch[174/200] loss:0.0950 acc:0.9716 177 | INFO:root:========= Testing: epoch[175/200] loss:0.0944 acc:0.9737 178 | INFO:root:========= Testing: epoch[176/200] loss:0.0914 acc:0.9684 179 | INFO:root:========= Testing: epoch[177/200] loss:0.1009 acc:0.9752 180 | INFO:root:========= Testing: epoch[178/200] loss:0.0908 acc:0.9731 181 | INFO:root:========= Testing: epoch[179/200] loss:0.0907 acc:0.9728 182 | INFO:root:========= Testing: epoch[180/200] loss:0.0838 acc:0.9747 183 | INFO:root:========= Testing: epoch[181/200] loss:0.0929 acc:0.9755 184 | INFO:root:========= Testing: epoch[182/200] loss:0.1050 acc:0.9748 185 | INFO:root:========= Testing: epoch[183/200] loss:0.1002 acc:0.9723 186 | INFO:root:========= Testing: epoch[184/200] loss:0.1002 acc:0.9713 187 | INFO:root:========= Testing: epoch[185/200] loss:0.1040 acc:0.9693 188 | INFO:root:========= Testing: epoch[186/200] loss:0.0997 acc:0.9677 189 | INFO:root:========= Testing: epoch[187/200] loss:0.0922 acc:0.9750 190 | INFO:root:========= Testing: epoch[188/200] loss:0.0980 acc:0.9713 191 | INFO:root:========= Testing: epoch[189/200] loss:0.0967 acc:0.9730 192 | INFO:root:========= Testing: epoch[190/200] loss:0.1061 acc:0.9732 193 | INFO:root:========= Testing: epoch[191/200] loss:0.1069 acc:0.9723 194 | INFO:root:========= Testing: epoch[192/200] loss:0.0802 acc:0.9774 195 | INFO:root:========= Testing: epoch[193/200] loss:0.0986 acc:0.9723 196 | INFO:root:========= Testing: epoch[194/200] loss:0.0912 acc:0.9743 197 | INFO:root:========= Testing: epoch[195/200] loss:0.0899 acc:0.9743 198 | INFO:root:========= Testing: epoch[196/200] loss:0.0889 acc:0.9745 199 | INFO:root:========= Testing: epoch[197/200] loss:0.0920 acc:0.9703 200 | INFO:root:========= Testing: epoch[198/200] loss:0.0871 acc:0.9765 201 | INFO:root:========= Testing: epoch[199/200] loss:0.0900 acc:0.9748 202 | Training torch.Size([10000, 1, 40, 40]) torch.Size([10000]) 203 | Testing torch.Size([2000, 1, 40, 40]) torch.Size([2000]) 204 | Train batch_nb:157 205 | Test batch_nb:16 206 | -------------------------------------------------------------------------------- /py35_pytorch03_version/transform_img/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/py35_pytorch03_version/transform_img/0.png -------------------------------------------------------------------------------- /py35_pytorch03_version/transform_img/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/py35_pytorch03_version/transform_img/1.png -------------------------------------------------------------------------------- /py35_pytorch03_version/transform_img/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/py35_pytorch03_version/transform_img/10.png -------------------------------------------------------------------------------- /py35_pytorch03_version/transform_img/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/py35_pytorch03_version/transform_img/11.png -------------------------------------------------------------------------------- /py35_pytorch03_version/transform_img/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/py35_pytorch03_version/transform_img/12.png -------------------------------------------------------------------------------- /py35_pytorch03_version/transform_img/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/py35_pytorch03_version/transform_img/13.png -------------------------------------------------------------------------------- /py35_pytorch03_version/transform_img/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/py35_pytorch03_version/transform_img/14.png -------------------------------------------------------------------------------- /py35_pytorch03_version/transform_img/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/py35_pytorch03_version/transform_img/15.png -------------------------------------------------------------------------------- /py35_pytorch03_version/transform_img/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/py35_pytorch03_version/transform_img/2.png -------------------------------------------------------------------------------- /py35_pytorch03_version/transform_img/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/py35_pytorch03_version/transform_img/3.png -------------------------------------------------------------------------------- /py35_pytorch03_version/transform_img/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/py35_pytorch03_version/transform_img/4.png -------------------------------------------------------------------------------- /py35_pytorch03_version/transform_img/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/py35_pytorch03_version/transform_img/5.png -------------------------------------------------------------------------------- /py35_pytorch03_version/transform_img/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/py35_pytorch03_version/transform_img/6.png -------------------------------------------------------------------------------- /py35_pytorch03_version/transform_img/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/py35_pytorch03_version/transform_img/7.png -------------------------------------------------------------------------------- /py35_pytorch03_version/transform_img/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/py35_pytorch03_version/transform_img/8.png -------------------------------------------------------------------------------- /py35_pytorch03_version/transform_img/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/py35_pytorch03_version/transform_img/9.png -------------------------------------------------------------------------------- /transform_img/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/transform_img/0.png -------------------------------------------------------------------------------- /transform_img/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/transform_img/1.png -------------------------------------------------------------------------------- /transform_img/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/transform_img/10.png -------------------------------------------------------------------------------- /transform_img/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/transform_img/11.png -------------------------------------------------------------------------------- /transform_img/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/transform_img/12.png -------------------------------------------------------------------------------- /transform_img/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/transform_img/13.png -------------------------------------------------------------------------------- /transform_img/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/transform_img/14.png -------------------------------------------------------------------------------- /transform_img/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/transform_img/15.png -------------------------------------------------------------------------------- /transform_img/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/transform_img/2.png -------------------------------------------------------------------------------- /transform_img/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/transform_img/3.png -------------------------------------------------------------------------------- /transform_img/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/transform_img/4.png -------------------------------------------------------------------------------- /transform_img/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/transform_img/5.png -------------------------------------------------------------------------------- /transform_img/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/transform_img/6.png -------------------------------------------------------------------------------- /transform_img/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/transform_img/7.png -------------------------------------------------------------------------------- /transform_img/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/transform_img/8.png -------------------------------------------------------------------------------- /transform_img/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexHex7/Spatial-Transformer-Networks_pytorch/546ab6cc1afe50d68e0851be0b38641edf9fb911/transform_img/9.png --------------------------------------------------------------------------------