我尝试实现 vggnet,但它没有得到很好的训练
I try to implement vggnet, but it does not be trained well
我是 CNN 的新人。
我尝试训练 vggnet。
class 净值(nn.Module) :
def __init__(self) :
super(Net, self).__init__()
self.conv = nn.Sequential (
#1
#####
nn.Conv2d(3,64,3, padding=1), nn.ReLU(inplace=True),
nn.Conv2d(64,64,3, padding=1),nn.ReLU(inplace=True),
nn.MaxPool2d(2,2),
#2
#####
nn.Conv2d(64,128,3, padding=1), nn.ReLU(inplace=True),
nn.Conv2d(128,128,3, padding=1),nn.ReLU(inplace=True),
nn.MaxPool2d(2,2),
#####
#3
#####
nn.Conv2d(128,256,3, padding=1),nn.ReLU(inplace=True),
nn.Conv2d(256,256,3, padding=1),nn.ReLU(inplace=True),
nn.Conv2d(256,256,3, padding=1),nn.ReLU(inplace=True),
nn.MaxPool2d(2,2),
#4
#####
nn.Conv2d(256,512,3, padding=1), nn.ReLU(inplace=True),
nn.Conv2d(512,512,3, padding=1),nn.ReLU(inplace=True),
nn.Conv2d(512,512,3, padding=1), nn.ReLU(inplace=True),
nn.MaxPool2d(2,2),
#5
#####
nn.Conv2d(512,512,3, padding=1),nn.ReLU(inplace=True),
nn.Conv2d(512,512,3, padding=1),nn.ReLU(inplace=True),
nn.Conv2d(512,512,3, padding=1),nn.ReLU(inplace=True),
nn.MaxPool2d(2,2),
#####
)
self.fc = nn.Sequential(
nn.Linear(512 * 7 * 7, 4096), nn.ReLU(inplace=True), nn.Dropout(0.5),
nn.Linear(4096, 4096), nn.ReLU(inplace=True), nn.Dropout(0.5),
nn.Linear(4096, 1000)
)
def forward(self, x):
# diffrent depending on the model
x = self.conv(x)
# change dimension
x = torch.flatten(x, 1)
# same
x = self.fc(x)
return x
但亏损在6.9077附近
epoch 0 之后,它很少改变。
即使我将权重衰减更改为 0(不使用 L2 归一化),损失也会略有变化。
我的优化器和调度器是
优化器 = torch.optim.SGD(net.parameters(), lr=0.1, weight_decay=5e-4)
调度器=lr_scheduler.ReduceLROnPlateau(优化器,因子=0.1,耐心=2,模式='min')
这是什么问题。
有时,它打印字节但只得到 0。
warnings.warn(海峡(味精))
这与我的问题有关?
您的损失值 6.9077
等于 -log(1/1000)
,这基本上意味着您的网络从所有可能的 1000 个 类.
中产生随机输出
从头开始训练 VGG 网络有点棘手,尤其是在不包含批归一化层的情况下。
尝试将学习率降低到 0.01,并为您的 SGD 增加动力。
添加更多输入增强(例如,翻转颜色抖动等)。
我是 CNN 的新人。 我尝试训练 vggnet。
class 净值(nn.Module) :
def __init__(self) :
super(Net, self).__init__()
self.conv = nn.Sequential (
#1
#####
nn.Conv2d(3,64,3, padding=1), nn.ReLU(inplace=True),
nn.Conv2d(64,64,3, padding=1),nn.ReLU(inplace=True),
nn.MaxPool2d(2,2),
#2
#####
nn.Conv2d(64,128,3, padding=1), nn.ReLU(inplace=True),
nn.Conv2d(128,128,3, padding=1),nn.ReLU(inplace=True),
nn.MaxPool2d(2,2),
#####
#3
#####
nn.Conv2d(128,256,3, padding=1),nn.ReLU(inplace=True),
nn.Conv2d(256,256,3, padding=1),nn.ReLU(inplace=True),
nn.Conv2d(256,256,3, padding=1),nn.ReLU(inplace=True),
nn.MaxPool2d(2,2),
#4
#####
nn.Conv2d(256,512,3, padding=1), nn.ReLU(inplace=True),
nn.Conv2d(512,512,3, padding=1),nn.ReLU(inplace=True),
nn.Conv2d(512,512,3, padding=1), nn.ReLU(inplace=True),
nn.MaxPool2d(2,2),
#5
#####
nn.Conv2d(512,512,3, padding=1),nn.ReLU(inplace=True),
nn.Conv2d(512,512,3, padding=1),nn.ReLU(inplace=True),
nn.Conv2d(512,512,3, padding=1),nn.ReLU(inplace=True),
nn.MaxPool2d(2,2),
#####
)
self.fc = nn.Sequential(
nn.Linear(512 * 7 * 7, 4096), nn.ReLU(inplace=True), nn.Dropout(0.5),
nn.Linear(4096, 4096), nn.ReLU(inplace=True), nn.Dropout(0.5),
nn.Linear(4096, 1000)
)
def forward(self, x):
# diffrent depending on the model
x = self.conv(x)
# change dimension
x = torch.flatten(x, 1)
# same
x = self.fc(x)
return x
但亏损在6.9077附近
epoch 0 之后,它很少改变。
即使我将权重衰减更改为 0(不使用 L2 归一化),损失也会略有变化。
我的优化器和调度器是
优化器 = torch.optim.SGD(net.parameters(), lr=0.1, weight_decay=5e-4)
调度器=lr_scheduler.ReduceLROnPlateau(优化器,因子=0.1,耐心=2,模式='min')
这是什么问题。 有时,它打印字节但只得到 0。 warnings.warn(海峡(味精)) 这与我的问题有关?
您的损失值 6.9077
等于 -log(1/1000)
,这基本上意味着您的网络从所有可能的 1000 个 类.
从头开始训练 VGG 网络有点棘手,尤其是在不包含批归一化层的情况下。
尝试将学习率降低到 0.01,并为您的 SGD 增加动力。
添加更多输入增强(例如,翻转颜色抖动等)。