CaptainEven / RepNet-MDNet-VehicleReID

Implementing RepNet(a two-stream multitask learning network) to do vehicle Re-identification, vehicle search(or vehicle match) with PyTorch 可用于车辆细粒度识别,车辆再识别,车辆匹配,车辆检索,RepNet/MDNet的一种PyTorch实现

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

accuracy =0

Mebigger opened this issue · comments

您好,请问在训练到iteration=100时,accuracy=0是正常现象吗,loss在39到40之间
用的函数是train(resume=None)
感谢您的回复

commented

@Mebigger 训练过程需要初始化权重,通过ImageNet训练好的vgg16模型权重初始化,使用我刚上传的InitRepNet.py训练就没问题了。

@CaptainEven
非常感谢您的回复,
您的意思是把train函数中的net=RepNet 改成 net=InitRepNet 吗,如果是的话,我改完之后accuary还是0(我已经导入了vgg16网络和预训练的权重)。

commented

@Mebigger 检查数据和标签是否正确,是否是按照ProcessVehicleID.py处理的数据?

@CaptainEven 对的,标签先经过了ProcessVehicleID.py的处理,print了vgg.state_dict(),确认权重模型没问题

commented

@Mebigger 贴训练的中间输出看看

@CaptainEven
C:\Softwares\python.exe C:/WYX-Py_projects/Veichle_ReID/Program/RepNet-VehicleReID-master/RepNet.py
=> out_ids: 10086, out_attribs: 257
=> in dim: 1000, out dim: 10086
=> in dim: 1024, out dim: 10086
=> Mix difference network:
InitRepNet(
(conv1_1): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv1_2): ReLU(inplace)
(conv1_3): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv1_4): ReLU(inplace)
(conv1_5): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
(conv1): Sequential(
(0): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU(inplace)
(2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(3): ReLU(inplace)
(4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(conv2_1): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2_2): ReLU(inplace)
(conv2_3): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2_4): ReLU(inplace)
(conv2_5): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
(conv2): Sequential(
(0): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU(inplace)
(2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(3): ReLU(inplace)
(4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(conv3_1): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv3_2): ReLU(inplace)
(conv3_3): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv3_4): ReLU(inplace)
(conv3_5): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv3_6): ReLU(inplace)
(conv3_7): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
(conv3): Sequential(
(0): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU(inplace)
(2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(3): ReLU(inplace)
(4): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(5): ReLU(inplace)
(6): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(conv4_1_1): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv4_1_2): ReLU(inplace)
(conv4_1_3): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv4_1_4): ReLU(inplace)
(conv4_1_5): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv4_1_6): ReLU(inplace)
(conv4_1_7): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
(conv4_1): Sequential(
(0): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU(inplace)
(2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(3): ReLU(inplace)
(4): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(5): ReLU(inplace)
(6): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(conv4_2_1): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv4_2_2): ReLU(inplace)
(conv4_2_3): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv4_2_4): ReLU(inplace)
(conv4_2_5): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv4_2_6): ReLU(inplace)
(conv4_2_7): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
(conv4_2): Sequential(
(0): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU(inplace)
(2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(3): ReLU(inplace)
(4): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(5): ReLU(inplace)
(6): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(conv5_1_1): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv5_1_2): ReLU(inplace)
(conv5_1_3): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv5_1_4): ReLU(inplace)
(conv5_1_5): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv5_1_6): ReLU(inplace)
(conv5_1_7): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
(conv5_1): Sequential(
(0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU(inplace)
(2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(3): ReLU(inplace)
(4): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(5): ReLU(inplace)
(6): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(conv5_2_1): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv5_2_2): ReLU(inplace)
(conv5_2_3): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv5_2_4): ReLU(inplace)
(conv5_2_5): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv5_2_6): ReLU(inplace)
(conv5_2_7): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
(conv5_2): Sequential(
(0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU(inplace)
(2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(3): ReLU(inplace)
(4): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(5): ReLU(inplace)
(6): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(FC6_1_1): Linear(in_features=25088, out_features=4096, bias=True)
(FC6_1_2): ReLU(inplace)
(FC6_1_3): Dropout(p=0.5)
(FC6_1_4): Linear(in_features=4096, out_features=4096, bias=True)
(FC6_1_5): ReLU(inplace)
(FC6_1_6): Dropout(p=0.5)
(FC6_1): Sequential(
(0): Linear(in_features=25088, out_features=4096, bias=True)
(1): ReLU(inplace)
(2): Dropout(p=0.5)
(3): Linear(in_features=4096, out_features=4096, bias=True)
(4): ReLU(inplace)
(5): Dropout(p=0.5)
)
(FC6_2_1): Linear(in_features=25088, out_features=4096, bias=True)
(FC6_2_2): ReLU(inplace)
(FC6_2_3): Dropout(p=0.5)
(FC6_2_4): Linear(in_features=4096, out_features=4096, bias=True)
(FC6_2_5): ReLU(inplace)
(FC6_2_6): Dropout(p=0.5)
(FC6_2): Sequential(
(0): Linear(in_features=25088, out_features=4096, bias=True)
(1): ReLU(inplace)
(2): Dropout(p=0.5)
(3): Linear(in_features=4096, out_features=4096, bias=True)
(4): ReLU(inplace)
(5): Dropout(p=0.5)
)
(FC7_1): Linear(in_features=4096, out_features=1000, bias=True)
(FC7_2): Linear(in_features=4096, out_features=1000, bias=True)
(FC_8): Linear(in_features=2000, out_features=1024, bias=True)
(attrib_classifier): Linear(in_features=1000, out_features=257, bias=True)
(arc_fc_br2): ArcFC()
(arc_fc_br3): ArcFC()
(shared_layers): Sequential(
(0): Sequential(
(0): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU(inplace)
(2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(3): ReLU(inplace)
(4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(1): Sequential(
(0): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU(inplace)
(2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(3): ReLU(inplace)
(4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(2): Sequential(
(0): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU(inplace)
(2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(3): ReLU(inplace)
(4): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(5): ReLU(inplace)
(6): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
)
(branch_1_feats): Sequential(
(0): Sequential(
(0): Sequential(
(0): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU(inplace)
(2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(3): ReLU(inplace)
(4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(1): Sequential(
(0): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU(inplace)
(2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(3): ReLU(inplace)
(4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(2): Sequential(
(0): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU(inplace)
(2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(3): ReLU(inplace)
(4): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(5): ReLU(inplace)
(6): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
)
(1): Sequential(
(0): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU(inplace)
(2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(3): ReLU(inplace)
(4): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(5): ReLU(inplace)
(6): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(2): Sequential(
(0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU(inplace)
(2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(3): ReLU(inplace)
(4): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(5): ReLU(inplace)
(6): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
)
(branch_1_fc): Sequential(
(0): Sequential(
(0): Linear(in_features=25088, out_features=4096, bias=True)
(1): ReLU(inplace)
(2): Dropout(p=0.5)
(3): Linear(in_features=4096, out_features=4096, bias=True)
(4): ReLU(inplace)
(5): Dropout(p=0.5)
)
(1): Linear(in_features=4096, out_features=1000, bias=True)
)
(branch_1): Sequential(
(0): Sequential(
(0): Sequential(
(0): Sequential(
(0): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU(inplace)
(2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(3): ReLU(inplace)
(4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(1): Sequential(
(0): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU(inplace)
(2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(3): ReLU(inplace)
(4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(2): Sequential(
(0): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU(inplace)
(2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(3): ReLU(inplace)
(4): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(5): ReLU(inplace)
(6): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
)
(1): Sequential(
(0): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU(inplace)
(2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(3): ReLU(inplace)
(4): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(5): ReLU(inplace)
(6): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(2): Sequential(
(0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU(inplace)
(2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(3): ReLU(inplace)
(4): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(5): ReLU(inplace)
(6): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
)
(1): Sequential(
(0): Sequential(
(0): Linear(in_features=25088, out_features=4096, bias=True)
(1): ReLU(inplace)
(2): Dropout(p=0.5)
(3): Linear(in_features=4096, out_features=4096, bias=True)
(4): ReLU(inplace)
(5): Dropout(p=0.5)
)
(1): Linear(in_features=4096, out_features=1000, bias=True)
)
)
(branch_2_feats): Sequential(
(0): Sequential(
(0): Sequential(
(0): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU(inplace)
(2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(3): ReLU(inplace)
(4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(1): Sequential(
(0): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU(inplace)
(2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(3): ReLU(inplace)
(4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(2): Sequential(
(0): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU(inplace)
(2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(3): ReLU(inplace)
(4): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(5): ReLU(inplace)
(6): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
)
(1): Sequential(
(0): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU(inplace)
(2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(3): ReLU(inplace)
(4): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(5): ReLU(inplace)
(6): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(2): Sequential(
(0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU(inplace)
(2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(3): ReLU(inplace)
(4): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(5): ReLU(inplace)
(6): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
)
(branch_2_fc): Sequential(
(0): Sequential(
(0): Linear(in_features=25088, out_features=4096, bias=True)
(1): ReLU(inplace)
(2): Dropout(p=0.5)
(3): Linear(in_features=4096, out_features=4096, bias=True)
(4): ReLU(inplace)
(5): Dropout(p=0.5)
)
(1): Linear(in_features=4096, out_features=1000, bias=True)
)
(branch_2): Sequential(
(0): Sequential(
(0): Sequential(
(0): Sequential(
(0): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU(inplace)
(2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(3): ReLU(inplace)
(4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(1): Sequential(
(0): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU(inplace)
(2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(3): ReLU(inplace)
(4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(2): Sequential(
(0): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU(inplace)
(2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(3): ReLU(inplace)
(4): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(5): ReLU(inplace)
(6): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
)
(1): Sequential(
(0): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU(inplace)
(2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(3): ReLU(inplace)
(4): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(5): ReLU(inplace)
(6): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(2): Sequential(
(0): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU(inplace)
(2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(3): ReLU(inplace)
(4): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(5): ReLU(inplace)
(6): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
)
(1): Sequential(
(0): Sequential(
(0): Linear(in_features=25088, out_features=4096, bias=True)
(1): ReLU(inplace)
(2): Dropout(p=0.5)
(3): Linear(in_features=4096, out_features=4096, bias=True)
(4): ReLU(inplace)
(5): Dropout(p=0.5)
)
(1): Linear(in_features=4096, out_features=1000, bias=True)
)
)
)
=> total 75063 samples loaded in train mode
=> total 3894 samples loaded in test mode
=> optimize all layers.

Training...
=> Epoch Train loss Train acc Test acc
=> epoch 1 iter 0/4692, total_iter 0 | loss 40.965 | accuracy 0.000%

commented

@Mebigger 时间有点久,你先训练几个epoch看看,iter100,accuracy为0很正常,我自己这边也检查一下

@CaptainEven
好的,再次感谢
tips:我需要把InitRepNet.py中的
feats=vgg_oirg.model.features._modules
classifier=vgg_oirg.model.classifier._modules中的.model删掉才可以训练

commented

@Mebigger 刚刚重新上传了RepNet.py和InitRepNet.py,现在应该没有errrors了

@CaptainEven 已经全部改成您的文件了,目前,accuracy还是0,我继续训练试试,再次感谢您的回复

commented

多训练几个epoch应该就慢慢收敛了
progress

commented

@Mebigger from scratch训练我自己没尝试过,我估计也能慢慢收敛

@CaptainEven
好的,
您的机器太快了,我的1080ti,不知道要训练到什么时候,
但是我发现gpu的利用率并不是很高,cpu的利用率反而非常高

commented

@Mebigger 细粒度分类是比较难训练的,比如人脸识别....只能让及其慢慢跑了,不行的话,尝试把LR调高点...

commented

@Mebigger 不知道什么原因,我的gpu利用率是100%...
gpu

commented

@Mebigger 训练几个epoch之后开始慢慢往收敛走了...

=> epoch 4 iter 1293/4689, total_iter 15360 | loss 19.908 | accuracy 25.000%
=> epoch 4 iter 1303/4689, total_iter 15370 | loss 20.616 | accuracy 12.500%
=> epoch 4 iter 1313/4689, total_iter 15380 | loss 20.296 | accuracy 18.750%
=> epoch 4 iter 1323/4689, total_iter 15390 | loss 25.566 | accuracy 0.000%
=> epoch 4 iter 1333/4689, total_iter 15400 | loss 21.102 | accuracy 6.250%
=> epoch 4 iter 1343/4689, total_iter 15410 | loss 23.225 | accuracy 6.250%
=> epoch 4 iter 1353/4689, total_iter 15420 | loss 23.098 | accuracy 6.250%
=> epoch 4 iter 1363/4689, total_iter 15430 | loss 20.185 | accuracy 12.500%
=> epoch 4 iter 1373/4689, total_iter 15440 | loss 21.110 | accuracy 12.500%
=> epoch 4 iter 1383/4689, total_iter 15450 | loss 21.762 | accuracy 6.250%
=> epoch 4 iter 1393/4689, total_iter 15460 | loss 22.846 | accuracy 6.250%
=> epoch 4 iter 1403/4689, total_iter 15470 | loss 20.441 | accuracy 6.250%
=> epoch 4 iter 1413/4689, total_iter 15480 | loss 19.164 | accuracy 12.500%
=> epoch 4 iter 1423/4689, total_iter 15490 | loss 19.489 | accuracy 6.250%
=> epoch 4 iter 1433/4689, total_iter 15500 | loss 22.107 | accuracy 6.250%
=> epoch 4 iter 1443/4689, total_iter 15510 | loss 21.369 | accuracy 18.750%

@CaptainEven
终于跑起来了,我的得改成batchsize=8,内存不够用
之前GPU利用率为0是并没有用gpu,最后找到原因是----os.environ['CUDA_VISIBLE_DEVICES'] = '1'这个地方的“1”,我需要改成“0”,因为我只有一个gpu
下边是网友的解释:
os.environ[“CUDA_DEVICE_ORDER”] = “PCI_BUS_ID” # 按照PCI_BUS_ID顺序从0开始排列GPU设备 
os.environ[“CUDA_VISIBLE_DEVICES”] = “0” #设置当前使用的GPU设备仅为0号设备  设备名称为'/gpu:0'
我觉得和device = torch.device('cuda: 0' if torch.cuda.is_available() else 'cpu')这句话也有关。

非常感谢您的耐心指导以及回复

commented

@Mebigger 对的,因为我这里有8块GPU,通常0号GPU专门用来测试,并不用来训练,所以不是0

@CaptainEven
您好,现在训练的有点过拟合,train达到99.99%,test只有49左右,请问您有什么小技巧吗,我正尝试该参数呢,您的CarReID_data是自己创建的数据集吗,对应的pair_set_car.txt内容是什么格式的呢?

commented

@Mebigger 过拟合是因为相对于模型容量大小,训练数据量偏少,但是不影响车辆比对,在进行比对时只需要提取特征向量,计算夹角余弦,跟设定阈值比对即可:
car_match
,pair_set_car.txt是VehicleID中留作test的数据(可以参考我刚上传的dataset.py中process_car和gen_test_pairs函数的处理),格式:每一行一条数据,包括,两张图片的路径和标签(0 or 1,1表示是同一个对象)

这个是我用train训练的结果:

figure_1
figure_1-1
下边这是用train_mc训练的结果:
figure_1-4
figure_1-5
为什么加上FocalLoss之后效果反而到不好了呢?

commented

@Mebigger Foclaloss主要针对正负样本不均衡的情况,特别像object detection中负样本远远大于正样本的情况,至于在分类中这种样本不均衡的情况要小得多,所以FocalLoss是否变现更好是不一定的,跟数据集本身的特点有关。

@CaptainEven
您好,您说的arc loss 是arcFace Loss吗?
image
为什么在train函数中计算veicle_id的时候使用Foclaloss,而不是arc loss呢?

commented

@Mebigger 无论Arc loss还是Focal loss都是基于Softmax loss(或CrossEntropy loss)的改进,本质上仍是Softmax loss,从上面的公式也可看出来,无非是对输入到最后Softmax的向量元素权重有不同。所以,Arc loss和Focal loss可同时使用。当然你可以在最后一层经过Arc loss计算之后直接送入CrossEntropy loss.

@CaptainEven
再次感谢您快速的回答;
对的,您说的非常好,又对两个loss有了进一步的认识,显然我没有理解到两个loss的本质。
另外,branch==5时,应该是RepNet的结构吧,为什么只在test的时候用呢,因为我发现上边的图片ID预测的并不是很准确。

commented

@Mebigger branch==5时提取最终的1024维特征向量,test准确率较低的根本原因在于训练数据的不足,导致过拟合。如果要test准确率达到train差不多的水平,估计需要至少10W数量级的训练数据。

@CaptainEven 你好,请问你的的训练集有多少张图片,我现在的数据集现在有30万张,有20多万张是我自己的数据,这批数据只有车辆ID的标签,但是因该对模型训练应该有帮助,现在已经训练了14个epoch,现在训练准确率93%,测试准确率只有33%(我的图片尺寸被改成了160,最后的特征向量也改成了256)

@CaptainEven @Mebigger 你好,请教一下,train和train_mc的主要区别是什么呢?

@Mebigger 你好,请问你那个结果展示图是博主给的测试脚本吗?我也是想显示以下测试图片的品牌,谢谢