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]