如何通过一个通道使用AlexNet

时间:2019-01-01 22:57:48

标签: neural-network computer-vision pytorch torchvision

我是pytorch的新手,并且AlexNet中的频道有问题。 我将其用于“ gta san andreas自动驾驶汽车”项目,我从具有一个通道的黑白图像中收集了数据集,并尝试使用以下脚本来训练AlexNet:

from AlexNetPytorch import*
import torchvision
import torchvision.transforms as transforms
import torch.optim as optim
import torch.utils.data
import numpy as np
import torch
from IPython.core.debugger import set_trace

AlexNet = AlexNet()

criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(AlexNet.parameters(), lr=0.001, momentum=0.9)

all_data = np.load('training_data.npy')
inputs= all_data[:,0]
labels= all_data[:,1]
inputs_tensors = torch.stack([torch.Tensor(i) for i in inputs])
labels_tensors = torch.stack([torch.Tensor(i) for i in labels])

data_set = torch.utils.data.TensorDataset(inputs_tensors,labels_tensors)
data_loader = torch.utils.data.DataLoader(data_set, batch_size=3,shuffle=True, num_workers=2)




if __name__ == '__main__':
 for epoch in range(8):
  runing_loss = 0.0
  for i,data in enumerate(data_loader , 0):
     inputs= data[0]
     inputs = torch.FloatTensor(inputs)
     labels= data[1]
     labels = torch.FloatTensor(labels)
     optimizer.zero_grad()
     # set_trace()
     inputs = torch.unsqueeze(inputs, 1)
     outputs = AlexNet(inputs)
     loss = criterion(outputs , labels)
     loss.backward()
     optimizer.step()

     runing_loss +=loss.item()
     if i % 2000 == 1999:    # print every 2000 mini-batches
            print('[%d, %5d] loss: %.3f' %
                  (epoch + 1, i + 1, running_loss / 2000))
            running_loss = 0.0
 print('finished')

我正在通过链接使用AlexNet: https://github.com/pytorch/vision/blob/master/torchvision/models/alexnet.py

但从更改了第18行:

nn.Conv2d(3, 64, kernel_size=11, stride=4, padding=2)

收件人:

nn.Conv2d(1, 64, kernel_size=11, stride=4, padding=2)

因为我在训练图像中仅使用一个通道,但出现此错误:

 File "training_script.py", line 44, in <module>
    outputs = AlexNet(inputs)
  File "C:\Users\Mukhtar\Anaconda3\lib\site-packages\torch\nn\modules\module.py", line 477, in __call__
    result = self.forward(*input, **kwargs)
  File "C:\Users\Mukhtar\Documents\AI_projects\gta\AlexNetPytorch.py", line 34, in forward
    x = self.features(x)
  File "C:\Users\Mukhtar\Anaconda3\lib\site-packages\torch\nn\modules\module.py", line 477, in __call__
    result = self.forward(*input, **kwargs)
  File "C:\Users\Mukhtar\Anaconda3\lib\site-packages\torch\nn\modules\container.py", line 91, in forward
    input = module(input)
  File "C:\Users\Mukhtar\Anaconda3\lib\site-packages\torch\nn\modules\module.py", line 477, in __call__
    result = self.forward(*input, **kwargs)
  File "C:\Users\Mukhtar\Anaconda3\lib\site-packages\torch\nn\modules\pooling.py", line 142, in forward
    self.return_indices)
  File "C:\Users\Mukhtar\Anaconda3\lib\site-packages\torch\nn\functional.py", line 396, in max_pool2d
    ret = torch._C._nn.max_pool2d_with_indices(input, kernel_size, stride, padding, dilation, ceil_mode)
RuntimeError: Given input size: (256x1x1). Calculated output size: (256x0x0). Output size is too small at c:\programdata\miniconda3\conda-bld\pytorch-cpu_1532499824793\work\aten\src\thnn\generic/SpatialDilatedMaxPooling.c:67

我不知道这是什么问题,以这种方式更改通道大小是否不对,如果不对,您可以带我进入一个可以使用一个通道的神经网络,因为我说我是新手在pytorch中,我不想自己写nn。

2 个答案:

答案 0 :(得分:1)

您的错误与使用灰度图像而不是RGB没有关系。您的错误与输入的 spatial 尺寸有关:通过网络“转发”输入图像时,其图像(在特征空间中)的大小变为零-这是您看到的错误。您可以使用this nice guide查看作为内核大小,步幅和填充的函数的每一层(转换/池化)输出大小发生了什么。
Alexnet希望其输入图像为224 x 224像素-确保输入的大小相同。

您忽略的其他事项:

  • 您正在使用Alexnet体系结构,但是您正在将其初始化为随机权重,而不是使用预先训练的权重(在imagenet上训练)。要获得受训的 alexnet副本,您需要像这样实例化网络

    AlexNet = alexnet(pretrained=True)
    
  • 一旦决定使用预先训练的网络,就无法将其第一层从3个输入通道更改为3个(训练后的重量根本无法容纳)。最简单的解决方法是,只需将单个通道重复三遍,即可使输入图像“彩色”。有关更多信息,请参见repeat()

答案 1 :(得分:0)

问题出在我输入的大小,当我应该给它一个(224x224)时,我给了它(32x32)-我是AlexNet的新手,所以我不知道它采用的是那个大小-。 我将图像重塑为(224x224),现在正在训练CNN。