【发布时间】:2018-07-10 17:35:48
【问题描述】:
我在pytorch中写了以下两个NN用于图像分割: 较小的:
class ConvNetV0(nn.Module):
def __init__(self):
super(ConvNetV0, self).__init__()
self.conv1 = nn.Conv2d(3, 30, 4, padding=2)
self.conv2 = nn.Conv2d(30, 50, 16, padding=7, bias=True)
self.conv3 = nn.Conv2d(50, 20, 2, stride=2)
self.conv4 = nn.Conv2d(20, 2, 2, stride=2)
def forward(self, x):
x = self.conv1(x)
x = F.relu(x)
x = self.conv2(x)
x = F.relu(x)
x = self.conv3(x)
x = F.relu(x)
y = self.conv4(x)
return y
较大的:
class ConvNetV1(nn.Module):
def __init__(self):
super(ConvNetV1, self).__init__()
self.conv0 = nn.Conv2d(3, 50, 4, padding=1, stride=2)
self.conv_r1 = nn.Conv2d(50, 40, 15, padding=7, bias=True)
self.conv_r2 = nn.Conv2d(40, 25, 3, padding=1)
self.conv_r3 = nn.Conv2d(25, 25, 2, stride=2)
# self.conv_r3 = nn.MaxPool2d(2, stride=2)
self.conv_b1 = nn.Conv2d(50, 15, 4, padding=1, stride=2)
self.conv1 = nn.Conv2d(40, 2, 1)
def forward(self, x):
x = self.conv0(x)
x = F.relu(x)
x1 = self.conv_r1(x)
x1 = F.relu(x1)
x1 = self.conv_r2(x1)
x1 = F.relu(x1)
x1 = self.conv_r3(x1)
x2 = self.conv_b1(x)
y = torch.cat([x1, x2], dim=1)
y = self.conv1(y)
return y
但是,在 mini-batch size = 8 的训练期间。较小的网络需要 2 秒才能完成一次迭代,而较大的网络只需 0.3 秒即可完成。
我还观察到两个网络之间的参数比约为 5:6。然而,在训练过程中,较小的网络只需要 1GB VRAM,而较大的网络需要 3GB。因为我的 1050ti 有 4GB VRAM。我想以内存换取速度。知道我该怎么做吗?
【问题讨论】:
-
你能提供完整的可运行代码吗?如果不仔细看,很难说为什么会发生这种情况。我不需要数据,但我需要知道它们具有哪种形状才能构建合成数据集。另外,训练循环中还有哪些其他操作?
-
docs.google.com/document/d/… 数据只是 256*256 rgb 图像,而标签是 64*64 softmax 标签,只有两个类别。 random_iterator 是我自己创建的一个采样器,用于从数据张量中采样数据。
标签: performance deep-learning conv-neural-network pytorch