关于使用 PyTorch 编程 cnn 的问题

问题描述

我对 cnn 编程还很陌生,所以我有点迷茫。我正在尝试执行这部分代码,他们要求我实现一个完全连接的网络来对数字进行分类。它应该包含 1 个具有 20 个单元的隐藏层。我应该在隐藏层上使用 ReLU 激活函数。

class Network(nn.Module):
    def __init__(self):
        super(Network,self).__init__()
        self.fc1 = ... 
        
        self.fc2 = nn.Sequential(
            nn.Linear(500,10),nn.Softmax(dim = 1)
            )
        
    def forward(self,x):
        x = x.view(x.size(0),-1)
        x = self.fc1(x)
        x = self.fc2(x)
        return x

点是要填充的部分,我想到了这一行:

self.fc1 = nn.Linear(20,500)

但我不知道它是否正确。有人可以帮我吗?而且我完全不明白 Softmax 的功能是做什么的……所以如果有人知道的话。 非常感谢!!

钯。这是加载数据的代码:

batch_size = 64
trainset = datasets.MNIST('./data',train=True,download=True,transform=transforms.ToTensor())
train_loader = DataLoader(trainset,batch_size=batch_size,shuffle=True,num_workers=1)
testset = datasets.MNIST('./data',train=False,transform=transforms.ToTensor())
test_loader = DataLoader(testset,shuffle=False,num_workers=1)

解决方法

从模型给出的代码可以看出,隐藏层有500个单元。所以我假设你的意思是输入 20 个单位。有了这个假设,代码必须是:

self.fc1 = nn.Sequential(
    nn.Linear(20,500),nn.ReLU()
    )

进入问题的下一部分,鉴于您正在使用 MNIST 数据集并且您拥有 softmax 函数,我假设您正在尝试预测图像中存在的数量。 您的神经网络在每一层执行各种乘法和加法运算,最后,您在输出层得到 10 个数字。现在,您必须理解这 10 个数字才能决定图像中给出的 10 个数字中的哪一个。

一种方法是选择具有最大值的单位。例如,如果第 10 个单位在所有单位中具有最大值,则我们得出结论该数字为“9”。如果第 2 个单位具有最大值,则我们得出结论,该数字为“1”。

这很好,但更好的方法是将每个单位的值转换为图像中包含相应数字的概率,然后我们选择概率最高的数字。这具有一定的数学优势,有助于我们定义更好的损失函数。

Softmax 帮助我们将值转换为概率。在应用 softmax 时,所有值都在 (0,1) 范围内,并且它们总和为 1。

如果您对深度学习及其背后的数学感兴趣,我建议您查看 Andrew NG 的深度学习课程。

,

您没有提及数据的形状,因此我将假设 datasets.MNIST 返回的预期形状。

数据形状:torch.Size([64,1,28,28])

class Network(nn.Module):
    def __init__(self):
        super(Network,self).__init__()
        self.fc1 = nn.Sequential(
            nn.Linear(1*28*28,20),nn.ReLU())
        
        self.fc2 = nn.Sequential(
            nn.Linear(500,10),nn.Softmax(dim = 1))
        
    def forward(self,x):
        x = x.view(x.size(0),-1)
        x = self.fc1(x)
        x = self.fc2(x)
        return x

nn.Linear 的第一个参数是输入特征的大小,第二个参数是单位数

对于 self.fc1,输入特征的大小是除批量大小之外的数据形状的乘积,即 1 * 28 * 28。根据您的帖子,第二个参数应该是 20(20 个单位)。

self.fc1 的输出(也是 self.fc2 的输入)的形状将是 (batch size,20)

对于self.fc2,输入特征的大小将为20,而单位数(也是位数)为10

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...