Neural network 我能';我不明白为什么张量的大小不';我不能和皮托克比赛 一些背景:

Neural network 我能';我不明白为什么张量的大小不';我不能和皮托克比赛 一些背景:,neural-network,computer-vision,pytorch,conv-neural-network,artificial-intelligence,Neural Network,Computer Vision,Pytorch,Conv Neural Network,Artificial Intelligence,在过去的几个月里,我一直在学习人工智能和人工智能,最后我在学习神经网络。伟大的问题是,当我遵循教程时,一切似乎都正常,但当我尝试自己实现NN时,我总是面临与张量大小相关的问题 我似乎找到了其他问题的答案(),但他们面临的正是这篇文章的问题。我不是在寻找一个代码只是复制和粘贴。我想了解我为什么要面对这个问题,如何处理和避免它 错误消息: /home/devops/aic/venv/lib/python3.8/site packages/torch/nn/modules/loss.py:528:Us

在过去的几个月里,我一直在学习人工智能和人工智能,最后我在学习神经网络。伟大的问题是,当我遵循教程时,一切似乎都正常,但当我尝试自己实现NN时,我总是面临与张量大小相关的问题

我似乎找到了其他问题的答案(),但他们面临的正是这篇文章的问题。我不是在寻找一个代码只是复制和粘贴。我想了解我为什么要面对这个问题,如何处理和避免它

错误消息: /home/devops/aic/venv/lib/python3.8/site packages/torch/nn/modules/loss.py:528:UserWarning:使用与输入大小(torch.size([16,2])不同的目标大小(torch.size([9,2])。这可能会由于广播而导致错误的结果。请确保尺寸相同

返回F.mse_损失(输入、目标、减少=自我减少)

回溯(最近一次呼叫最后一次):

文件“nn_conv.py”,第195行,在

loss = loss_function(outputs, targets)
文件“/home/devops/aic/venv/lib/python3.8/site packages/torch/nn/modules/module.py”,第889行,在调用impl中

result = self.forward(*input, **kwargs)
文件“/home/devops/aic/venv/lib/python3.8/site packages/torch/nn/modules/loss.py”,第528行,向前

return F.mse_loss(input, target, reduction=self.reduction)
文件“/home/devops/aic/venv/lib/python3.8/site packages/torch/nn/functional.py”,第2928行,单位为mse_

expanded_input, expanded_target = torch.broadcast_tensors(input, target)
文件“/home/devops/aic/venv/lib/python3.8/site packages/torch/functional.py”,第74行,广播张量

return _VF.broadcast_tensors(tensors)  # type: ignore
RuntimeError:张量a(9)的大小必须与张量b(16)在非单态维度0的大小相匹配

这是我的代码:
导入操作系统
进口cv2
将numpy作为np导入
从TQM导入TQM
将matplotlib.pyplot作为plt导入
进口火炬
导入torch.nn作为nn
导入torch.nn.功能为F
将torch.optim导入为optim
类DogsVSCats():
IMG_尺寸=50
猫='PetImages/Cat'
狗='小魔术师/狗'
标签={猫:0,狗:1}
培训数据=[]
猫的数量=0
狗的数量=0
def make_training_数据(自身):
对于self.LABELS.keys()中的标签:
对于tqdm(os.listdir(标签))中的f:
尝试:
path=os.path.join(标签,f)
#将图像转换为灰度
img=cv2.imread(路径)
如果img不是无:
高度、宽度=img.形状[:2]
如果宽度>高度:
高度=圆形((高度*自身尺寸)/宽度)
宽度=self.IMG\u尺寸
右=0
底部=自身尺寸-高度
其他:
宽度=圆形((宽度*自身尺寸)/高度)
高度=self.IMG\u尺寸
右=self.IMG\u尺寸-宽度
底部=0
img=cv2.cvt颜色(img,cv2.COLOR\u bgr2灰色)
img=cv2.CVT颜色(img,cv2.COLOR_GRAY2BGR)
img=cv2。调整大小(img,(宽度,高度))
img=cv2.copyMakeBorder(img,
top=0,
底部=底部,
左=0,
右=右,
borderType=cv2.BORDER(常数)
#将图像标签的一个热向量添加到self.training_数据中
self.training_data.append([np.array(img),np.eye(len(self.LABELS))[self.LABELS[label]]))
如果标签==self.CATS:
self.cats_count+=1
elif标签==self.DOGS:
self.dogs_count+=1
除cv2.1外,错误为e:
通过
np.random.shuffle(自训练数据)
np.save(“小图像/训练数据.npy”,自我训练数据)
打印(“猫:”,self.Cats\u count)
打印(“狗:”,self.Dogs\u count)
training_data=np.load('PetImages/training_data.npy',allow_pickle=True)
plt.imsave('PetImages/trained_example.png',training_data[1][0])
类RunningMetrics():
定义初始化(自):
自和=0
自计数=0
定义呼叫(自我):
返回自和/浮动(自计数)
def更新(自身、val、大小):
自身._sum+=val
自身数量+=大小
类别网络(nn.模块):
定义初始化(self,num通道,conv内核大小=3,跨步=1,填充=1,最大池内核大小=2):
超级(网络,自我)。\uuuu初始化
self.\u num\u channels=num\u channels
self.\u max\u pool\u kernel\u size=max\u pool\u kernel\u size
self.conv1=nn.Conv2d(1,self.\u num\u通道,conv\u内核大小,步长,填充)
self.conv2=nn.Conv2d(self.\u num\u通道,self.\u num\u通道*2,conv\u内核大小,步幅,填充)
self.conv3=nn.Conv2d(self.\u num\u channels*2、self.\u num\u channels*4、conv\u内核大小、步幅、填充)
#计算第一次输入
self.fc1=nn.Linear(self.\u num\u channels*4*8*8,self.\u num\u channels*8)
self.fc2=nn.线性(self.\u num\u通道*8,2)
def前进(自身,x):
#康
x=自转换1(x)
x=F.relu(F.max\u pool2d(x,self.\u max\u pool\u kernel\u size))
x=自我调节2(x)
x=F.relu(F.max\u pool2d(x,self.\u max\u pool\u kernel\u size))
x=自转换3(x)
x=F.relu(F.max\u pool2d(x,self.\u max\u pool\u kernel\u size))
#压扁
x=x.view(-1,自通道数*4*8*8)
#完全连接
x=自身.fc1(x)
x=F.relu(x)
x=自身.fc2(x)
#返回F.log\u softmax(x,dim=1)
返回F.softmax(x,dim=1)
def保存_模型(路径):
火炬。保存(保存,路径)
def加载_模型(路径):
self=火炬装载(路径)
running_acc.update(torch.sum(preds == targets).float(),