Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python “如何修复”;ResourceExhausterRor:分配张量时的OOM“;_Python_Tensorflow_Machine Learning_Keras_Deep Learning - Fatal编程技术网

Python “如何修复”;ResourceExhausterRor:分配张量时的OOM“;

Python “如何修复”;ResourceExhausterRor:分配张量时的OOM“;,python,tensorflow,machine-learning,keras,deep-learning,Python,Tensorflow,Machine Learning,Keras,Deep Learning,我想做一个多输入的模型。所以,我尝试建立一个这样的模型 # define two sets of inputs inputA = Input(shape=(32,64,1)) inputB = Input(shape=(32,1024)) # CNN x = layers.Conv2D(32, kernel_size = (3, 3), activation = 'relu')(inputA) x = layers.Conv2D(32, (3,3), activation='relu')(x

我想做一个多输入的模型。所以,我尝试建立一个这样的模型

# define two sets of inputs
inputA = Input(shape=(32,64,1))
inputB = Input(shape=(32,1024))
 
# CNN
x = layers.Conv2D(32, kernel_size = (3, 3), activation = 'relu')(inputA)
x = layers.Conv2D(32, (3,3), activation='relu')(x)
x = layers.MaxPooling2D(pool_size=(2,2))(x)
x = layers.Dropout(0.2)(x)
x = layers.Flatten()(x)
x = layers.Dense(500, activation = 'relu')(x)
x = layers.Dropout(0.5)(x)
x = layers.Dense(500, activation='relu')(x)
x = Model(inputs=inputA, outputs=x)
 
# DNN
y = layers.Flatten()(inputB)
y = Dense(64, activation="relu")(y)
y = Dense(250, activation="relu")(y)
y = Dense(500, activation="relu")(y)
y = Model(inputs=inputB, outputs=y)
 
# Combine the output of the two models
combined = concatenate([x.output, y.output])
 

# combined outputs
z = Dense(300, activation="relu")(combined)
z = Dense(100, activation="relu")(combined)
z = Dense(1, activation="softmax")(combined)

model = Model(inputs=[x.input, y.input], outputs=z)

model.summary()

opt = Adam(lr=1e-3, decay=1e-3 / 200)
model.compile(loss = 'sparse_categorical_crossentropy', optimizer = opt,
    metrics = ['accuracy'])
以及总结 : _

但是,当我尝试训练这个模型时

history = model.fit([trainimage, train_product_embd],train_label,
    validation_data=([validimage,valid_product_embd],valid_label), epochs=10, 
    steps_per_epoch=100, validation_steps=10)
问题发生了。。。。 :

ResourceExhaustedError回溯(最近的调用
最后)在()
---->1历史=模型拟合([列车图像、列车产品、列车标签、,
验证数据=([validimage,valid\u product\u embd],valid\u label),
历元=10,每历元步数=100,验证步数=10)
4帧
/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/client/session.py
在(self,args,kwargs)1470 ret=
tf_session.tf_SessionRunCallable(self._session._session,1471
赛尔夫.\u手柄,args,
->1472如果运行元数据:1474,则运行元数据(ptr)1473
proto_data=tf_session.tf_GetBuffer(运行元数据ptr)
ResourceExhaustedError:发现2个根错误。(0)资源
耗尽:当分配形状为[800000,32,30,62]的张量和
键入float on/job:localhost/replica:0/task:0/device:GPU:0 by
分配器GPU_0_bfc[{{node conv2d_1/卷积}]]提示:如果
要在OOM发生时查看分配的张量列表,请添加
报告当前运行选项的时差分配
分配信息。
[[metrics/acc/Mean_1/_185]]提示:如果您想查看
发生OOM时分配的张量,添加
报告当前运行选项的时差分配
分配信息。
(1) 资源耗尽:在使用
形状[800000,32,30,62]和类型浮动
/作业:本地主机/副本:0/任务:0/设备:GPU:0由分配器GPU\U 0\U bfc执行
[{{node conv2d_1/convolution}}]]提示:如果要查看
发生OOM时分配的张量,添加
报告当前运行选项的时差分配
分配信息。
0成功的操作。忽略0个派生错误。

感谢阅读并希望帮助我:)

来自
[800000,32,30,62]
您的模型似乎将所有数据放在了一个批次中

尝试指定的批量大小,如

history = model.fit([trainimage, train_product_embd],train_label, validation_data=([validimage,valid_product_embd],valid_label), epochs=10, steps_per_epoch=100, validation_steps=10, batch_size=32)
如果仍为OOM,则尝试减小批处理大小。

OOM表示“内存不足”。您的GPU内存不足,因此无法为此张量分配内存。您可以做以下几件事:

  • 减少
    密集
    Conv2D
    层中的过滤器数量
  • 使用较小的
    批量大小
    (或每一个历元增加
    步数
    验证步数
  • 使用灰度图像(您可以使用)
  • 减少层数
  • 在卷积层之后使用
    MaxPooling2D
  • 减小图像的大小(您可以使用它)
  • 使用较小的
    float
    精度进行输入,即
    np.float32
  • 如果使用的是预先训练好的模型,请冻结第一层(如)
关于此错误,有更多有用的信息:

OOM when allocating tensor with shape[800000,32,30,62]

这是一个奇怪的形状。如果您正在处理图像,通常应该有3个或1个通道。最重要的是,您似乎正在同时传递整个数据集;你应该分批通过。

我也一样


您可以尝试使用某种形式的转移学习来减少可训练的参数——尝试冻结最初的几层,并使用较小的批量

OP Specified
steps\u per\u epoch=100
,因此我认为情况并非如此<代码>批量大小应自动设置为每个历元的
样本大小/步数
。我先尝试了“批量大小”。但是,出现了一个错误:“ValueError:如果您的数据是以符号张量的形式出现的,那么您应该指定
steps\u per\u epoch
参数(而不是
batch\u size
参数,因为符号张量预期会生成成批的输入数据)。”顺便说一句,谢谢你的意见:)有点奇怪,我(在把cpu换成gpu版本后)仅仅通过按顺序添加图层,甚至没有一个合适的或任何东西,就得到了同样的错误。形状[1730564096]和类型浮动。当你甚至不传递批次时,得到分配错误是正常的吗?是的,因为神经网络只是一个巨大的浮点值矩阵,就像输入批次一样。
OOM when allocating tensor with shape[800000,32,30,62]