分配张量时如何解决ResourceExhaustedError: OOM的问题?
ResourceExhaustedError(回溯见上文):使用形状分配张量时OOM[10000,32,28,28]
我包含了几乎所有的代码
learning_rate = 0.0001
epochs = 10
batch_size = 50
# declare the training data placeholders
# input x - for 28 x 28 pixels = 784 - this is the flattened image data that is drawn from
# mnist.train.nextbatch()
x = tf.placeholder(tf.float32, [None, 784])
# dynamically reshape the input
x_shaped = tf.reshape(x, [-1, 28, 28, 1])
# now declare the output data placeholder - 10 digits
y = tf.placeholder(tf.float32, [None, 10])
def create_new_conv_layer(input_data, num_input_channels, num_filters, filter_shape, pool_shape, name):
# setup the filter input shape for tf.nn.conv_2d
conv_filt_shape = [filter_shape[0], filter_shape[1], num_input_channels,
num_filters]
# initialise weights and bias for the filter
weights = tf.Variable(tf.truncated_normal(conv_filt_shape, stddev=0.03),
name=name+'_W')
bias = tf.Variable(tf.truncated_normal([num_filters]), name=name+'_b')
# setup the convolutional layer operation
out_layer = tf.nn.conv2d(input_data, weights, [1, 1, 1, 1], padding='SAME')
# add the bias
out_layer += bias
# apply a ReLU non-linear activation
out_layer = tf.nn.relu(out_layer)
# now perform max pooling
ksize = [1, 2, 2, 1]
strides = [1, 2, 2, 1]
out_layer = tf.nn.max_pool(out_layer, ksize=ksize, strides=strides,
padding='SAME')
return out_layer
# create some convolutional layers
layer1 = create_new_conv_layer(x_shaped, 1, 32, [5, 5], [2, 2], name='layer1')
layer2 = create_new_conv_layer(layer1, 32, 64, [5, 5], [2, 2], name='layer2')
flattened = tf.reshape(layer2, [-1, 7 * 7 * 64])
# setup some weights and bias values for this layer, then activate with ReLU
wd1 = tf.Variable(tf.truncated_normal([7 * 7 * 64, 1000], stddev=0.03), name='wd1')
bd1 = tf.Variable(tf.truncated_normal([1000], stddev=0.01), name='bd1')
dense_layer1 = tf.matmul(flattened, wd1) + bd1
dense_layer1 = tf.nn.relu(dense_layer1)
# another layer with softmax activations
wd2 = tf.Variable(tf.truncated_normal([1000, 10], stddev=0.03), name='wd2')
bd2 = tf.Variable(tf.truncated_normal([10], stddev=0.01), name='bd2')
dense_layer2 = tf.matmul(dense_layer1, wd2) + bd2
y_ = tf.nn.softmax(dense_layer2)
cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=dense_layer2, labels=y))
# add an optimiser
optimiser = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cross_entropy)
# define an accuracy assessment operation
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
# setup the initialisation operator
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
# initialise the variables
sess.run(init_op)
total_batch = int(len(mnist.train.labels) / batch_size)
for epoch in range(epochs):
avg_cost = 0
for i in range(total_batch):
batch_x, batch_y = mnist.train.next_batch(batch_size=batch_size)
_, c = sess.run([optimiser, cross_entropy], feed_dict={x:
batch_x,
y: batch_y})
avg_cost += c / total_batch
test_acc = sess.run(accuracy,feed_dict={x: mnist.test.images, y:
mnist.test.labels})
print("Epoch:", (epoch + 1), "cost =", "{:.3f}".format(avg_cost), "
test accuracy: {:.3f}".format(test_acc))
print("\nTraining complete!")
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y:
mnist.test.labels}))
错误中引用的行是:create\u new\u conv\u layer-function
快跑。。在训练循环中
下面列出了我从调试器输出复制的更多错误(有更多行,但我认为这些是主要错误,其他错误是由此引起的…)
tensorflow.python.framework.errors_impl。ResourceExhaustedError: OOM当分配张量与形状[10000,32,28,28][[节点: Conv2D=Conv2D[T=DT_FLOAT,data_format="NHWC",填充="SAME",步幅=[1,1,1],use_cudnn_on_gpu=true,_device="/作业:localhost/replica: 0/任务: 0/gpu: 0"](重塑,layer1_W/读取)]]
我第二次运行它时出现了以下错误我同时拥有cpu和GPU,如下面的输出所示,我可以理解与cpu问题相关的一些错误可能是因为我的tensorflow没有编译以使用这些功能,我在windows 10上安装了cuda 8和cudnn 6、python 3.5、tensorflow 1.3.0。
2017-10-03 03:53:58.944371: W C:\tf_jenkins\home\workspace\rel-win\M\Windows-gpu\PY\35\tenorflow\core\Platform\cpu_feature_guard.cc:45]TensorFlow库没有编译成使用AVX指令,但这些指令在您的机器上可用,可以加快CPU计算速度。2017-10-03 03:53:58.945563: W C:\tf_jenkins\home\workspace\rel-win\M\Windows-gpu\PY\35\tenorflow\core\Platform\cpu_feature_guard.cc:45]TensorFlow库没有编译成使用AVX2指令,但这些指令在您的机器上可用,可以加快CPU计算速度。2017-10-03 03:53:59.230761: I C:\tf_jenkins\home\workspace\rere-win\M\windows-gpu\PY\35\tenorflow\core\common_runtime\gpu\gpu_device.cc:955]找到设备0与属性:名称:Quadro K620主要:5次要:0 MemyClock速率(GHz)1.124 pciBusID0000:01:00.0总内存: 2.00GiB免费内存: 1.66GiB2017-10-03 03:53:59.231109: I C:\tf_jenkins\home\workspace\rel-win\M\windows-gpu\PY\35\tenorflow\core\common_runtime\gpu\gpu_device.cc:976]DMA:0 2017-10-03 03:53:59.231229: I C:\tf_jenkins\home\workspace\rel-win\M\Windows-gpu\PY\35\tensorflow\core\common_runtime\gpu\gpu_device.cc:986] 0: Y2017-10-03 03:53:59.231363: I C:\tf_jenkins\home\workspace\rel-win\M\Windows-gpu\PY\35\tensorflow\core\common_runtime\gpu\gpu_device.cc:1045]正在创建TensorFlow设备(/gpu: 0)-
进程因内存不足(OOM)而失败,因为您一次推送了整个测试集进行评估(请参见此问题)。很容易看出,10000*32*28*28*4
几乎是1Gb,而您的GPU总共只有1.66Gb可用,而且大部分已经被网络本身占用。
解决方案是不仅为训练,而且为测试提供神经网络批次。结果精度将是所有批次的平均值。而且,你不需要在每个时代之后都这样做:你真的对所有中间网络的测试结果感兴趣吗?
您的第二条错误消息很可能是由于以前的故障造成的,因为CUDNN驱动程序似乎不再工作。我建议重新启动你的机器。
我制作了自己的AlexNet实现,其中少了一个完全连接的层,用于对102类花卉进行分类。我的培训集由11000个图像组成,而验证和培训集各有3000个图像。我以HDF5格式编写了这三个数据集,并将它们存储在磁盘上。我重新加载了它们,并尝试使用8和75个纪元的批次通过网络传递图像。但是,出现了内存错误 我已经尝试将批量大小减少到8,并将尺寸减少到400x400(原来是500x500),但没有用 te
问题内容: 我想在中复制以下代码。例如,我想为所有先前具有值的张量索引分配a 。 如果我在其中编写类似的代码,则会出现以下错误。 方括号中的条件应为。 有没有一种方法可以实现这种“条件赋值”(因为缺少更好的名称)? 问题答案: TensorFlow API中提供了几种比较运算符。 但是,在直接操纵张量时,没有什么等效于简洁的NumPy语法。你必须要使用个人的,和运营商执行相同的操作。 您的NumP
我正在使用tflite进行语义分割。我有一个经过训练的模型,可以从背景中分割对象,这个模型是在深度实验室上训练的。 我已经使用下面的代码将这个模型(冻结的推理图)转换为tflite格式: 模型在Android上加载,但是当我尝试运行推理时,它会给我这个错误: 原因:java.lang.IllegalStateException:内部错误:准备张量分配时出现意外失败:third_party/tens
问题内容: 我在共享计算资源的环境中工作,即,我们有几台服务器计算机,每台服务器计算机都配备了一些Nvidia Titan X GPU。 对于中小型模型,Titan X的12 GB通常足以让2-3个人在同一GPU上同时进行训练。如果模型足够小,以至于单个模型无法充分利用GPU的所有计算单元,那么与运行另一个训练过程相比,这实际上可以提高速度。即使在同时访问GPU确实减慢了单个训练时间的情况下,具有
非常类似于这个问题,如何在TensorFlow中找到第一个匹配元素的索引 我试着解决这个问题,但不同的是,val不是一个单一的数字,而是一个张量 所以例子 我知道我可以使用一个while循环,但这看起来很混乱。我可以尝试一个映射函数,但是有更优雅的吗?
问题内容: 我的印象是,尽管语法有所不同,但下面的函数a和b在逻辑上是等效的。但是,它们不是,我也不了解它们之间的区别。 在我看来,他们俩都在分配: x对变量z的值, y的值对应于变量x,并且 x + y的值等于变量y。 有人能帮助消除我对多变量分配以及函数a和函数b之间的逻辑差异的误解吗? 问题答案: 分配可以认为是“原子”操作。也就是说,认为在所有操作完成之前,“ 左侧”的所有值都是“冻结”的