TensorFlow-无法保存检查点:Python退出代码139

TensorFlow-无法保存检查点:Python退出代码139,python,python-3.x,tensorflow,Python,Python 3.x,Tensorflow,我正在尝试创建和训练一个用于识别图像中区域的网络。我的网络是基于的,然而,我遗漏了一个完全连接的层(目前) 我的网络(尺寸反映我正在训练128 x 128像素的输入图像): 我能够很好地初始化和训练网络;我已经运行了10000次迭代,监控了进度,并验证了输出图像与我期望的一致。我的问题是,无论是在培训结束时还是在培训期间的检查点,我都无法保存模型。当执行保存图形的调用时,python脚本挂起,几分钟后退出,代码为139,据我所知,这与内存不足或试图访问不可用的内存有关 我还创建了一个单层网络(基

我正在尝试创建和训练一个用于识别图像中区域的网络。我的网络是基于的,然而,我遗漏了一个完全连接的层(目前)

我的网络(尺寸反映我正在训练128 x 128像素的输入图像):

我能够很好地初始化和训练网络;我已经运行了10000次迭代,监控了进度,并验证了输出图像与我期望的一致。我的问题是,无论是在培训结束时还是在培训期间的检查点,我都无法保存模型。当执行保存图形的调用时,python脚本挂起,几分钟后退出,代码为139,据我所知,这与内存不足或试图访问不可用的内存有关

我还创建了一个单层网络(基于),可以很好地进行训练。我能够在检查点和培训完成后保存图形

我已经做了一个粗略的计算,图形变量应该会占用大约4GB的内存,尽管我知道TensorFlow确实消耗了比预期更多的内存。我运行的是Ubuntu 16.04,这台电脑有64GB的内存。在训练和保存过程中,进程的峰值是消耗24 GB内存(根据资源监视器),这仍然远远低于可用内存量。我也用Ubuntu 14.04复制了这个

我尝试过更小的批量大小,希望减少内存占用,甚至降低到每一步只有4个图像。它仍然无法保存检查点


我对TensorFlow还是相当陌生的,所以我不确定下一步该去哪里,我需要一些建议。如您所见,我已将saver设置为仅保存训练变量,希望能够减少它试图保存的文件的大小(这样做将我的简单网络的图形文件大小从4GB减少到2GB)。是不是我试图将太大的文件保存到磁盘(硬盘空间不应该是问题,它保存到的驱动器是2 TB硬盘)?在试图写入磁盘时,Python是否无法处理内存中如此大的文件?我是否认为这是一个内存问题,因为Python正在以代码139退出?

看起来您的进程因分段错误而崩溃。该方法调用一些将所有变量序列化到文件的C++代码。此序列化格式的最大张量限制为2GB(因为它将每个变量序列化到协议缓冲区中,该缓冲区的最大记录大小为2GB)。您的重量变量wFc1的大小为4GB。我怀疑失败正在发生;它以这种方式崩溃的事实是一个错误

一个可能的解决方案是分割大变量。例如:

wFc1_0 = weight_variable([32 * 32 * 64, 4096])
wFc1_1 = weight_variable([32 * 32 * 64, 4096])
wFc1_2 = weight_variable([32 * 32 * 64, 4096])
wFc1_3 = weight_variable([32 * 32 * 64, 4096])

# ...

# Readout layer
y = tf.nn.softmax(
    tf.concat(1, [tf.matmul(hPool2Flat, wFc1_0),
                  tf.matmul(hPool2Flat, wFc1_1),
                  tf.matmul(hPool2Flat, wFc1_2),
                  tf.matmul(hPool2Flat, wFc1_3),
                 ]) + bFc1)

这可能不是最有效的切分,因此在这里进行实验是值得的。由于您有大量的类,您可能会发现一些TensorFlow类,它们支持更有效的分片权重。

看起来您的进程因分段错误而崩溃。该方法调用一些将所有变量序列化到文件的C++代码。此序列化格式的最大张量限制为2GB(因为它将每个变量序列化到协议缓冲区中,该缓冲区的最大记录大小为2GB)。您的重量变量wFc1的大小为4GB。我怀疑失败正在发生;它以这种方式崩溃的事实是一个错误

一个可能的解决方案是分割大变量。例如:

wFc1_0 = weight_variable([32 * 32 * 64, 4096])
wFc1_1 = weight_variable([32 * 32 * 64, 4096])
wFc1_2 = weight_variable([32 * 32 * 64, 4096])
wFc1_3 = weight_variable([32 * 32 * 64, 4096])

# ...

# Readout layer
y = tf.nn.softmax(
    tf.concat(1, [tf.matmul(hPool2Flat, wFc1_0),
                  tf.matmul(hPool2Flat, wFc1_1),
                  tf.matmul(hPool2Flat, wFc1_2),
                  tf.matmul(hPool2Flat, wFc1_3),
                 ]) + bFc1)

这可能不是最有效的切分,因此在这里进行实验是值得的。由于您有大量的类,您可能会发现TensorFlow中的一些支持切分权重的类更有效。

您能否分享
self.weightVariable()
/
self.biasVariable()
/
weightVariable()
/
biasVariable()
方法的实现?@mrry-Yup,我编辑了原始帖子,加入了创建网络时使用的功能。它们也是根据深度学习教程改编的。好的,这些没有什么可疑之处。图序列化失败的最可能原因是图中存储了一些大常量(通常来自隐式转换的numpy数组)。这可能吗?您正在调用什么保存方法,完整的错误消息是什么?@mrry我在原始post中添加了一个类函数,用于在检查点和培训步骤结束时保存网络。当调用它时,每次都没有错误消息。脚本挂起几分钟,然后python控制台打印出“Process finished with exit code 139”。培训包含在错误和异常处理程序中,但这些处理程序都不会被触发。我将研究可以隐式转换的numpy数组。关于我应该注意的问题有什么建议吗?你能分享一下你的
self.weightVariable()
/
self.biasVariable()
/
weightVariable()
/
biasVariable()
方法的实现吗?@mry是的,我已经编辑了原始帖子,其中包含了创建网络时使用的函数。它们也是根据深度学习教程改编的。好的,这些没有什么可疑之处。图序列化失败的最可能原因是图中存储了一些大常量(通常来自隐式转换的numpy数组)。这可能吗?您正在调用什么保存方法,完整的错误消息是什么?@mrry我在原始post中添加了一个类函数,用于在检查点和培训步骤结束时保存网络。当调用它时,每次都没有错误消息。脚本挂起几分钟,然后python控制台打印出“Process finished with exit code 139”。培训包含在错误和异常处理程序中,但这些处理程序都不会被触发。