当前位置: 首页 > 知识库问答 >
问题:

tf.train.write_graph使用所有内存并导致MemoryError

微生新翰
2023-03-14

我试图以文本格式将简单的MNIST模型图导出到proto缓冲区文件。

实际上,我使用的是tf.keras模块,但后来我决定切换,因为在keras序列模型中很难为输入和输出张量重命名/指定名称。

这是我的代码:

import tensorflow as tf
import numpy as np

(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()

y_train = tf.keras.utils.to_categorical(y_train, 10)
y_test = tf.keras.utils.to_categorical(y_test, 10)

x_test = np.reshape(x_test, (-1, 784))/255
x_train = np.reshape(x_train, (-1, 784))/255

X = tf.placeholder(dtype=tf.float32, shape=[None, 784])
Y = tf.placeholder(dtype=tf.float32, shape=[None, 10])

h1 = tf.get_variable('h1',shape=[784, 16])
b1 = tf.zeros(shape=[16])

h2 = tf.get_variable('h2', shape=[16,10])
b2 = tf.zeros(shape=[10])

l1 = tf.nn.relu(tf.matmul(X, h1) + b1)
logits = tf.matmul(l1, h2) + b2

# l1 = tf.layers.dense(inputs=X, units=16, activation=tf.nn.relu)
# logits = tf.layers.dense(inputs=l1, units=10, activation=tf.nn.softmax)

loss = tf.losses.softmax_cross_entropy(onehot_labels=Y, logits=logits)
optimizer = tf.train.AdamOptimizer(learning_rate=0.01).minimize(loss)
accuracy = tf.reduce_mean(tf.cast(tf.equal(tf.argmax(logits, -1), tf.argmax(Y, -1)), tf.float32))

data_pipeline = tf.data.Dataset.from_tensor_slices((x_train, y_train))
iter = data_pipeline.shuffle(1000).repeat().batch(1024).make_one_shot_iterator()
next_item = iter.get_next()

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(5):
        for i2 in range(1000):
            x, y = sess.run(next_item)
            if i2 % 100 == 0:
                lss = sess.run(loss, feed_dict={X: x, Y: y})
                print('Loss at {} => {} is {}'.format(i, i2, lss))
                sess.run(optimizer, feed_dict={X: x, Y: y})
    print('Final Accuracy : ', sess.run(accuracy, feed_dict={X: x_train, Y: y_train}))
    # tf.train.write_graph(sess.graph, './', 'temp.pbtxt')
    # This line here is causing the Memory Error

系统信息和图书馆信息

  • 操作系统:Ubuntu 18.04 LTS

更多信息

正如我前面提到的,当我使用keras时,我可以很容易地按顺序导出keras,并且能够使用从后端获得的会话编写model.pbtxt。模型的大小和配置与此代码相同。

使用tensorflow 1.4,即使使用4GB内存,我也能够轻松导出和保存这些模型。既然我有8个,为什么会抛出MemoryError?对于确切的日志很抱歉,它只显示了一次,现在每次我运行此代码时,我的系统都会崩溃,因为它耗尽了所有内存

此外,当我运行代码时,我会得到一个警告:

2018-05-16 21:42:08.844531: W tenstorflow/core/框架/allocator.cc:101] 376320000的分配超过了系统内存的10%。

问题

<罢工> 我如何解决这个问题,是什么原因导致的?

我删除了tf.data.Dataset,并进行了正常的numpy修改,一切正常。我仍然想知道,为什么不使用tf.data.Dataset来解决这个问题?这是否会向较大的图形添加额外的节点?我们应该只在大数据和大机器上进行培训时使用这些管道吗?


共有1个答案

邴俊达
2023-03-14

尝试将批量大小设置为较低的值,这样可以解决问题。

举个例子

iter = data_pipeline.shuffle(1000).repeat().batch(256).make_one_shot_iterator()
 类似资料:
  • 我试图使用ScanQuery和iterator迭代所有缓存实体(而不是立即将它们从分布式缓存拉到本地客户机): 但是上面的代码失败了,消耗了所有可用的内存。同时,当我试图从缓存中获取迭代器时,它工作得很好: 文件声明: QueryCursor表示查询结果集,并允许透明的逐页迭代。每当用户开始迭代上一个页面时,它将自动在后台请求下一个页面。 那么为什么用ScanQuery在缓存上迭代时ignite本

  • 我想首先说,这是我第一次必须处理性能,因为这是我第一次开发一个android应用程序。 该应用程序是一个源代码编辑器,在这里你可以打开文件,修改它们,并将它们保存回来。该应用程序由4个部分组成: 导航器视图:包含打开文件的ListView和打开文件夹的TreeView。 代码视图容器:它保存包含实际代码的视图。 代码容器:这是一个小视图,包含一个文本视图和一个自定义EditText(由我扩展Edi

  • 在Activity中使用Thread导致的内存泄漏 原文链接 : Activitys, Threads, & Memory Leaks 原文作者 : AlexLockwood 译文出自 : 开发技术前线 www.devtf.cn 译者 : chaossss 校对者: yinna317 状态 : 完成 注:这篇博文涉及的源码可以在 GitHub 上面下载哦 做 Android 开发最常遇到的问题就是

  • 我尝试在我的程序中使用G1GC。该程序可在各种内存大小的机器上使用:1Gb内存的VPS(最小)、8Gb内存的桌面、32Gb内存的DS(最大)。我注意到G1GC没有保留更多的内存,即使有很多可用内存(例如,G1GC在我的机器上保留的内存不超过3Gb,总共8Gb/4Gb可用) 另外,我想要一个通用的解决方案。我无法为每种类型的机器创建单独的版本或单独的运行脚本。

  • 问题内容: 首先,我对JNA和Java如何直接本机内存分配的理解充其量只是内在的,因此,我试图描述我对正在发生的事情的理解。除了回应以外的任何更正都会很棒。 我正在运行一个使用JNA混合Java和C本机代码的应用程序,并且遇到了一个可重现的问题,Java垃圾收集器无法释放对直接本机内存分配的引用,导致C堆内存不足。 我很肯定我的C应用程序不是分配问题的根源,因为我将A传递到我的C代码中,修改了缓冲

  • 问题内容: 我使用io.Copy()复制文件,大约700Mb,但这会导致内存不足 错误信息如下: 我为buf分配了足够的内存,这导致bodyWriter.CreateFormFile()中的内存不足 问题答案: 这是因为您正在“复制”到,这是内存中的缓冲区,从而迫使Go尝试分配与整个文件一样大的内存块。 根据您的使用情况,您似乎正在尝试通过HTTP流式传输文件?在这种情况下,请勿将传递给,而是直接