首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我无法使我的数据集适应VGG-net,导致大小不匹配。

我无法使我的数据集适应VGG-net,导致大小不匹配。
EN

Stack Overflow用户
提问于 2019-01-06 08:45:26
回答 1查看 210关注 0票数 0

我试图在我的脚本中实现经过预先训练的VGG网,以便在RGB 256 256中识别数据集中的面孔,但我得到了一个“大小不匹配,m1: 1 x 2622,m2: 4096 x 2”,即使我调整图像大小,它也不工作,因为您可以看到我的代码与resnet和alexnet一起工作。

我试过用插值函数调整图像大小,但是大小不匹配仍然存在。

代码语言:javascript
复制
def training(model_conv, learning_rate, wd, net):

criterion = nn.CrossEntropyLoss(weight= torch.FloatTensor([1,1]))
optimizer = torch.optim.Adam(model_conv.fc.parameters(),         lr=learning_rate, weight_decay = wd)
total_step = len(train_loader)
loss_list = []
acc_list = []
print("Inizio il training")

for epoch in range(num_epochs):
    for i, (im, labels) in enumerate(train_loader):  

        images = torch.nn.functional.interpolate(im, 224, mode = 'bilinear')
        outputs = model_conv(images)
        loss = criterion(outputs, labels)
        loss_list.append(loss.item())
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        if (i + 1) % 100 == 0:
            print('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}'
                  .format(epoch + 1, num_epochs, i + 1, total_step, loss.item()))
torch.save(model_conv, 'TrainedModel.pt')
return images, labels

def main():

net = "vgg"
learning_rate = 10e-6
wd = 10e-4

if net == "vgg":
    print("Hai selezionato VGG")
    model_conv = VGG_FACE.vgg_face
    data = torch.load("VGG_FACE.pth")
    model_conv.load_state_dict(data) 

    model_conv.fc = nn.Linear(4096, 2)
    model_conv[-1] = model_conv.fc

if __name__ == '__main__':
main()

例如,这是另一段代码,在这段代码中,我正确地使用了VGG和一些随机图像。

代码语言:javascript
复制
def test():
N=5
net = VGG_FACE.vgg_face
data = torch.load("VGG_FACE.pth")
net.load_state_dict(data)
net.eval()
names = open("names.txt").read().split()

with torch.no_grad():
    mean = np.array([93.5940, 104.7624, 129.1863])
    images = scipy.misc.imread("cooper2.jpg", mode="RGB")
    images = scipy.misc.imresize(images, [224, 224])
    images = images.astype(np.float32)
    images -= mean[np.newaxis, np.newaxis, :]
    images = np.transpose(images, (2, 0, 1))
    images = images[np.newaxis, ...]
    images = torch.tensor(images, dtype=torch.float32)


    y = net(images)
    y = torch.nn.functional.softmax(y, 1)
    rank = torch.topk(y[0, :], N)
    for i in range(N):
        index = rank[1][i].item()
        score = rank[0][i].item()
        print("{}) {} ({:.2f})".format(i + 1, names[index], score))
    print()


numero_classi = 2
net[-1] = torch.nn.Linear(4096, numero_classi)


if __name__ == "__main__":
test()

我所犯的错误是

代码语言:javascript
复制
  File "/Users/danieleligato/PycharmProjects/parametral/VGGTEST.py", line 53, in training
outputs = model_conv(images)
RuntimeError: size mismatch, m1: [4 x 2622], m2: [4096 x 2] at /Users/soumith/code/builder/wheel/pytorch-src/aten/src/TH/generic/THTensorMath.cpp:2070

--这是我使用的的VGG网

代码语言:javascript
复制
class LambdaBase(nn.Sequential):
def __init__(self, fn, *args):
    super(LambdaBase, self).__init__(*args)
    self.lambda_func = fn

def forward_prepare(self, input):
    output = []
    for module in self._modules.values():
        output.append(module(input))
    return output if output else input

class Lambda(LambdaBase):
def forward(self, input):
    return self.lambda_func(self.forward_prepare(input))

class LambdaMap(LambdaBase):
def forward(self, input):
    return map(self.lambda_func,self.forward_prepare(input))

class LambdaReduce(LambdaBase):
def forward(self, input):
    return reduce(self.lambda_func,self.forward_prepare(input))


vgg_face = nn.Sequential( # Sequential,
nn.Conv2d(3,64,(3, 3),(1, 1),(1, 1)),
nn.ReLU(),
nn.Conv2d(64,64,(3, 3),(1, 1),(1, 1)),
nn.ReLU(),
nn.MaxPool2d((2, 2),(2, 2),(0, 0),ceil_mode=True),
nn.Conv2d(64,128,(3, 3),(1, 1),(1, 1)),
nn.ReLU(),
nn.Conv2d(128,128,(3, 3),(1, 1),(1, 1)),
nn.ReLU(),
nn.MaxPool2d((2, 2),(2, 2),(0, 0),ceil_mode=True),
nn.Conv2d(128,256,(3, 3),(1, 1),(1, 1)),
nn.ReLU(),
nn.Conv2d(256,256,(3, 3),(1, 1),(1, 1)),
nn.ReLU(),
nn.Conv2d(256,256,(3, 3),(1, 1),(1, 1)),
nn.ReLU(),
nn.MaxPool2d((2, 2),(2, 2),(0, 0),ceil_mode=True),
nn.Conv2d(256,512,(3, 3),(1, 1),(1, 1)),
nn.ReLU(),
nn.Conv2d(512,512,(3, 3),(1, 1),(1, 1)),
nn.ReLU(),
nn.Conv2d(512,512,(3, 3),(1, 1),(1, 1)),
nn.ReLU(),
nn.MaxPool2d((2, 2),(2, 2),(0, 0),ceil_mode=True),
nn.Conv2d(512,512,(3, 3),(1, 1),(1, 1)),
nn.ReLU(),
nn.Conv2d(512,512,(3, 3),(1, 1),(1, 1)),
nn.ReLU(),
nn.Conv2d(512,512,(3, 3),(1, 1),(1, 1)),
nn.ReLU(),
nn.MaxPool2d((2, 2),(2, 2),(0, 0),ceil_mode=True),
Lambda(lambda x: x.view(x.size(0),-1)), # View,
nn.Sequential(Lambda(lambda x: x.view(1,-1) if 1==len(x.size()) else x ),nn.Linear(25088,4096)), # Linear,
nn.ReLU(),
nn.Dropout(0.5),
nn.Sequential(Lambda(lambda x: x.view(1,-1) if 1==len(x.size()) else x ),nn.Linear(4096,4096)), # Linear,
nn.ReLU(),
nn.Dropout(0.5),
nn.Sequential(Lambda(lambda x: x.view(1,-1) if 1==len(x.size()) else x ),nn.Linear(4096,2622)), # Linear,
)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-06 10:05:37

错误来自于这一行:

代码语言:javascript
复制
model_conv.fc = nn.Linear(4096, 2)

改为:

代码语言:javascript
复制
model_conv.fc = nn.Linear(2622, 2)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54059953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档