【问题标题】:why function .view(batch_size,-1) gives the same outputs?为什么函数 .view(batch_size,-1) 给出相同的输出?
【发布时间】:2021-03-23 08:08:00
【问题描述】:

我是神经网络的大一学生,我已经建立了一个vgg16网络。但是在每批中,所有输入都导致相同的输出。所以我检查了每一层的输出,最后发现x=x.view(batch_size ,-1) 给出相同的输出!我不知道为什么会发生这种情况。这是我的代码的一部分:

class VGG16(torch.nn.Module):
    def __init__(self):
        super(VGG16, self).__init__()
        self.conv1 = torch.nn.Conv2d(3, 64, padding=1, kernel_size=3)              #kernel
        self.conv2 = torch.nn.Conv2d(64, 64, padding=1, kernel_size=3)
        self.conv3 = torch.nn.Conv2d(64, 128, padding=1, kernel_size=3)
        self.conv4 = torch.nn.Conv2d(128, 128, padding=1, kernel_size=3)
        self.conv5 = torch.nn.Conv2d(128, 256, padding=1, kernel_size=3)
        self.conv6 = torch.nn.Conv2d(256, 256, padding=1, kernel_size=3)
        self.conv7 = torch.nn.Conv2d(256, 256, padding=1, kernel_size=3)
        self.conv8 = torch.nn.Conv2d(256, 512, padding=1 ,kernel_size=3)
        self.conv9 = torch.nn.Conv2d(512, 512, padding=1, kernel_size=3)
        self.conv10 = torch.nn.Conv2d(512, 512, padding=1, kernel_size=3)
        self.conv11 = torch.nn.Conv2d(512, 512, padding=1, kernel_size=3)
        self.conv12 = torch.nn.Conv2d(512, 512, padding=1, kernel_size=3)
        self.conv13 = torch.nn.Conv2d(512, 512, padding=1, kernel_size=3)
        self.pooling = torch.nn.MaxPool2d(2)                                        #pool
        self.fc1 = torch.nn.Linear(25088, 4096)                                     # 7 * 7 * 512 = 25088
        self.fc2 = torch.nn.Linear(4096, 4096)
        self.fc3 = torch.nn.Linear(4096, 2)

    def forward(self,x):
        batch_size = x.size(0)
        x = F.relu(self.conv1(x))                                                #layer1
        x = self.pooling(F.relu(self.conv2(x)))                                  #layer2
        x = F.relu(self.conv3(x))                                                #layer3
        x = self.pooling(F.relu(self.conv4(x)))                                  #layer4
        x = F.relu(self.conv5(x))                                                #layer5
        x = F.relu(self.conv6(x))                                                #layer6
        x = self.pooling(F.relu(self.conv7(x)))                                  #layer7
        x = F.relu(self.conv8(x))                                                #layer8
        x = F.relu(self.conv9(x))                                                #layer9
        x = self.pooling(F.relu(self.conv10(x)))                                 #layer10
        x = F.relu(self.conv11(x))                                               #layer11
        x = F.relu(self.conv12(x))                                               #layer12
        x = self.pooling(F.relu(self.conv13(x)))                                 #layer13
        x = x.view(batch_size,-1)                                                #flatten
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

这是训练部分:

def train(epoch):
running_loss = 0.0
for batch_idx, data in enumerate(train_loader,0):
    inputs, true_labels = data
    optimizer.zero_grad()                        #clear the optimizer to avoid accumulating of grad
    #forward
    outputs = model(inputs)
    loss = criterion(outputs, true_labels)
    #backward
    loss.backward()
    #update
    optimizer.step()
    running_loss += loss.item()

    #output the train result every 10 loop
    if (batch_idx + 1) % 10 == 0:
        print('[%d %5d] loss: %.3f' %(epoch + 1, batch_idx + 1, running_loss/10 ))
        running_loss = 0.0

这是 layer13 的输出(前视图):enter image description here

这是 x.view 的输出:enter image description here

我在网上搜索了很长时间。但是没有用。有什么想法吗? 提前致谢。

【问题讨论】:

  • 为此请发布您的训练代码...不是模型...(模型很好)
  • 我已经发布了我的训练代码和一些输出
  • 嘿兄弟,它是正确的......!它只是改变你的尺寸......从 4D 到 2D......(即展平)

标签: machine-learning pytorch conv-neural-network vgg-net


【解决方案1】:

view() 方法的使用

import torch
torch.tensor([[1,2,3],[4,5,6]]).view(3,2)
#tensor([[1, 2],
        [3, 4],
        [5, 6]])

因此张量值没有变化..它只会改变它的shape

【讨论】:

    猜你喜欢
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 2016-03-14
    • 2022-11-14
    相关资源
    最近更新 更多