PyTorch训练脚本无警告无错误地突然停止
我正在尝试在PyTorch中运行一个训练脚本,这个模型使用了3D卷积神经网络(3dCNN)和长短期记忆网络(LSTM),但是它在处理第一个或第二个批次时就突然停止了。这个脚本之前是为仅使用3DCNN编写的。
这可能是什么原因呢?
没有任何错误或警告信息。我检查了所有可能导致程序退出的语句,但都没有发现问题。我还调整了批次大小,以防内存不足。
训练在第一个批次完成了,但在第二个批次时模型似乎没有返回任何输出,这导致脚本突然停止。有什么方法可以找出导致这个问题的原因吗?
这是我正在尝试训练的模型架构:
def __init__(self, num_classes):
super(ConvLSTM, self).__init__()
self.conv_layer1 = self._make_conv_layer(3, 64, (1, 2, 2), (1, 2, 2))
self.conv_layer2 = self._make_conv_layer(64, 128, (2, 2, 2), (2, 2, 2))
self.conv_layer3 = self._make_conv_layer(128, 256, (2, 2, 2), (2, 2, 2))
self.conv_layer4 = self._make_conv_layer(256, 256, (2, 2, 2), (2, 2, 2))
self.lstm = nn.LSTM(input_size=256, hidden_size=512, num_layers=1, batch_first=True)
self.fc5 = nn.Linear(512, 512)
self.fc5_act = nn.ELU()
self.fc6 = nn.Linear(512, num_classes)
def _make_conv_layer(self, in_c, out_c, pool_size, stride):
conv_layer = nn.Sequential(
nn.Conv3d(in_c, out_c, kernel_size=3, stride=1, padding=1),
nn.BatchNorm3d(out_c),
nn.ELU(),
nn.MaxPool3d(pool_size, stride=stride, padding=0)
)
return conv_layer
def forward(self, x):
# print(f"input {x.size()}")
x = self.conv_layer1(x)
x = self.conv_layer2(x)
x = self.conv_layer3(x)
x = self.conv_layer4(x)
x = x.permute(0, 2, 1, 3, 4).contiguous()
batch_size, seq_len, input_size, height, width = x.size()
x = x.view(batch_size, seq_len, -1)
lstm_out, _ = self.lstm(x)
lstm_out = lstm_out[:, -1, :]
x = self.fc5(lstm_out)
x = self.fc5_act(x)
x = self.fc6(x)
return x
1 个回答
-1
我猜可能是你的内存不够用了。有时候,操作系统会设置成在内存快用完的时候自动结束一些占用内存比较多的程序,这种情况下,终端可能不会显示错误信息(不过这样的信息会记录在系统日志里)。
需要注意的是,批处理大小会影响GPU的内存使用,但不一定会影响CPU的内存使用。另外,内存使用量可能会随着时间的推移而增加,因为需要在数据加载程序之间复制更多的数据。
我调试的第一步会是查找相关的系统日志,或者在程序运行时监控内存使用情况(比如用htop
之类的工具)。