如何解决通过Pytorch转换EMNIST数据时出错
我正在尝试使用Pytorch训练模型来预测EMNIST。 编辑:-这是针对问题的colab notebook的链接。
class Net(nn.Module):
def __init__(self):
super(Net,self).__init__()
self.conv1 = nn.Conv2d(28,64,(5,5),padding=2)
self.conv1_bn = nn.BatchNorm2d(64)
self.conv2 = nn.Conv2d(64,128,2,padding=2)
self.fc1 = nn.Linear(2048,1024)
self.dropout = nn.Dropout(0.3)
self.fc2 = nn.Linear(1024,512)
self.bn = nn.BatchNorm1d(1)
self.fc3 = nn.Linear(512,128)
self.fc4 = nn.Linear(128,47)
def forward(self,x):
x = F.relu(self.conv1(x))
x = F.max_pool2d(x,2)
x = self.conv1_bn(x)
x = F.relu(self.conv2(x))
x = F.max_pool2d(x,2)
x = x.view(-1,2048)
x = F.relu(self.fc1(x))
x = self.dropout(x)
x = self.fc2(x)
x = x.view(-1,1,512)
x = self.bn(x)
x = x.view(-1,512)
x = self.fc3(x)
x = self.fc4(x)
return F.log_softmax(x,dim=1)
return x
每当训练模型时,都会出现如下所示的错误。
<ipython-input-11-07c68cf1cac2> in forward(self,x)
24 def forward(self,x):
25 x = F.relu(self.conv1(x))
---> 26 x = F.max_pool2d(x,2)
27 x = self.conv1_bn(x)
RuntimeError: Given input size: (64x28x1). Calculated output size: (64x14x0). Output size is too small
我试图搜索解决方案,发现我应该先转换数据。所以我尝试通过最常见的建议对其进行转换:-
transform_valid = transforms.Compose(
[
transforms.ToTensor(),])
但是我又收到了下面提到的错误。也许问题出在转换部分。
/opt/conda/lib/python3.7/site-packages/torchvision/datasets/mnist.py:469: UserWarning: The given NumPy array is not writeable,and PyTorch does not support non-writeable tensors. This means you can write to the underlying (supposedly non-writeable) NumPy array using the tensor. You may want to copy the array to protect its data or make it writeable before converting it to a tensor. This type of warning will be suppressed for the rest of this program. (Triggered internally at /opt/conda/conda-bld/pytorch_1595629403081/work/torch/csrc/utils/tensor_numpy.cpp:141.)
return torch.from_numpy(parsed.astype(m[2],copy=False)).view(*s)
我想通过使用“ ndarray.setflags(write = None,align = None,uic = None)”使该特定的numpy数组可写,但是我无法弄清楚应该从哪里以及哪种类型的数组使可写,因为我使用->直接加载数据集 “ datasets.EMNIST(root,split =” balanced“,train = False,download = True,transform = transform_valid)”
解决方法
欢迎使用Stackoverflow!
您的问题与toTensor
转换无关,由于在maxpool
中输入张量的维数而产生此错误:该错误明确表明您正在尝试最大张量张量其中一个维度为1(64,28,1),因此它将输出一个维度为0(64,14,0)的张量,这没有任何意义。
您需要检查在模型中输入的张量的尺寸。它们绝对太小了。也许您在某个地方的view
犯了一个错误(没有minimal reproducible example很难说)。
如果我能猜测的话,一开始您的张量大小为28x28x1
(典型的MNIST),然后将其放入一个convolution,它期望一个暗淡的张量BxCxWxH
(batch_size,channels,width,height),例如(B,1,28,28),但您混淆了输入通道({{1})的宽度(28)
我相信您希望第一层为nn.Conv2d(->28<-,64,(5,5),padding=2)
,并且需要调整张量的大小以使其形状为nn.Conv2d(1,padding=2)
(B的值取决于您),然后再将其赋予网络。
边注:关于可写numpy数组的警告是完全不相关的,仅表示pytorch可能会覆盖numpy数组的“不可写”数据。如果您不关心此numpy数组是否被修改,则可以忽略该警告。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。