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

时间:2016-05-20 20:51:39

标签: python python-3.x tensorflow

我正在尝试创建和培训网络,以识别图像中的区域。我已将我的网络基于deep learning MNIST tutorial,但是,我已经遗漏了一个完全连接的图层(暂时)。

我的网络(维度反映了我培训的输入图像为128 x 128像素):

wConv1 = self.weightVariable([5, 5, 1, 32])
bConv1 = self.biasVariable([32])

x = tf.placeholder(tf.float32, [None, 16384])
yPrime = tf.placeholder(tf.float32, [None, 16384])
xImage = tf.reshape(self.x, [-1, 128, 128, 1])

#Convolutional Layer 1
hConv1 = tf.nn.relu(conv2d(xImage, wConv1) + bConv1)
hPool1 = maxPool(hConv1, 2)

# Convolutional Layer 2
wConv2 = weightVariable([5, 5, 32, 64])
bConv2 = biasVariable([64])

hConv2 = tf.nn.relu(conv2d(hPool1, wConv2) + bConv2)
hPool2 = maxPool(hConv2, 2)

# Fully Connected Layer
wFc1 = weightVariable([32 * 32 * 64, 16384])
bFc1 = biasVariable([16384])

hPool2Flat = tf.reshape(hPool2, [-1, 32 * 32 * 64])
hFc1 = tf.nn.relu(tf.matmul(hPool2Flat, wFc1) + bFc1)

# Dropout layer
keepProb = tf.placeholder(tf.float32)
hFc1Drop = tf.nn.dropout(hFc1, keepProb)

# Readout layer
y = tf.nn.softmax(tf.matmul(hPool2Flat, wFc1) + bFc1)

# Training
crossEntropy = tf.reduce_mean(-tf.reduce_sum(yPrime * tf.log(y + 1e-10), reduction_indices=[1]))
trainStep = tf.train.AdamOptimizer(learningRate).minimize(crossEntropy)

# Evaluation
p = tf.placeholder(tf.float32, [None, 16384])
q = tf.placeholder(tf.float32, [None, 16384])

correctPrediction = tf.equal(p, q)
accuracy = tf.reduce_mean(tf.cast(correctPrediction, tf.float32))

saver = tf.train.Saver(tf.trainable_variables())

# Additional functions used:
def weightVariable(self, shape, name):
    initial = tf.truncated_normal(shape, stddev=0.1, name=name)
    return tf.Variable(initial)

def biasVariable(self, shape, name):
    initial = tf.constant(0.1, shape=shape, name=name)
    return tf.Variable(initial)

def conv2d(self, x, W):
    return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')

def maxPool(self, x, poolSize):
    return tf.nn.max_pool(x, ksize=[1, poolSize, poolSize, 1], strides=[1, poolSize, poolSize, 1], padding='SAME')

# Saves the current state of the network to disk
def saveNetwork(self, step=None):
    folder = os.path.dirname(self.saverPath)
        if not os.path.isdir(folder):
            os.mkdir(folder)

        if step is None:
            self.saver.save(self.sess, self.saverPath, write_meta_graph=False)
        else:
            self.saver.save(self.sess, self.saverPath, global_step=step, write_meta_graph=False)

我能够很好地初始化和训练网络;我已经运行10000次迭代,监控进度,并验证输出图像是否符合我的预期。我的问题是我无法在训练结束时或在训练期间的检查站保存模型。当执行保存图形的调用时,python脚本会挂起并在几分钟后退出代码139,根据我的理解,这与内存不足或尝试访问不可用的内存有关。

我还创建了一个单层网络(基于MNIST tutorial),可以很好地训练。我可以在检查点和培训结束后保存图表。

我做了一个粗略的计算,图形变量应该耗尽大约4 GB的内存,虽然我知道TensorFlow消耗的内存比预期的多得多。我正在运行Ubuntu 16.04,而PC有64 GB的RAM。在训练和保存期间,该过程在消耗24 GB内存(根据资源监视器)时达到峰值,该内存仍远低于可用量。我也使用Ubuntu 14.04复制了这个。

我尝试过较小的批量大小,希望减少内存占用,甚至每步只需4张图像。它仍然无法保存检查点。

我还是TensorFlow的新手,所以我不确定下一步该去哪看,可以使用一些建议。正如您所看到的,我已将保护程序设置为仅保存训练变量,希望这会减少它尝试保存的文件的大小(这样做会减少我简单网络的图形文件的大小)从4 GB到2 GB)。是不是我试图将太大的文件保存到磁盘(硬盘空间不应该是一个问题,它保存的驱动器是2 TB的硬盘)?在尝试写入磁盘时,Python无法处理内存中的大文件吗?我甚至在正确的轨道上认为这是一个内存问题,因为Python正在退出代码139?

1 个答案:

答案 0 :(得分:4)

看起来您的流程因分段错误而崩溃。 tf.train.Saver.save()方法调用一些C ++代码,将所有变量序列化为文件。此序列化格式对最大张量具有2GB限制(因为它将每个变量序列化为协议缓冲区,其最大记录大小为2GB)。您的体重变量wFc1的大小为4GB。我怀疑失败发生在this line附近;它以这种方式崩溃的事实是bug

一种可能的解决方案是对大变量进行分片。例如:

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 sampled loss functions - 它们支持分片权重 - 效率更高。