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
Tensorflow ResourceExhausterRor:Keras中分配张量时的OOM_Tensorflow_Keras - Fatal编程技术网

Tensorflow ResourceExhausterRor:Keras中分配张量时的OOM

Tensorflow ResourceExhausterRor:Keras中分配张量时的OOM,tensorflow,keras,Tensorflow,Keras,我正在使用tf.keras培训一个模型,总结如下: Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= conv2d

我正在使用tf.keras培训一个模型,总结如下:

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 28, 28, 20)        520       
_________________________________________________________________
flatten (Flatten)            (None, 15680)             0         
_________________________________________________________________
dense (Dense)                (None, 5)                 78405     
=================================================================
Total params: 78,925
Trainable params: 78,925
Non-trainable params: 0
_________________________________________________________________ 
我正在使用调用fit方法

model.fit(X列,y列,批量大小=32,每历元步长=125,历元=5,使用多处理=True)

式中,X_列是形状为[900000,32,32,1]的张量流变量

我遇到以下错误:

Resource exhausted: OOM when allocating tensor with shape[900000,28,28,20] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc
     [[{{node conv2d_1/Conv2D}}]]
Hint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.

     [[metrics_2/acc/Identity/_53]]
Hint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.

  (1) Resource exhausted: OOM when allocating tensor with shape[900000,28,28,20] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc
     [[{{node conv2d_1/Conv2D}}]]
Hint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.

0 successful operations.
0 derived errors ignored.
我无法理解为什么当批量大小为32时,它会分配一个形状为[900000,28,28,20]的张量。我期待着[32,28,28,20]


完整代码:

IMAGE_SIZE = 32
BATCH_SIZE = 32

conv1_layer = keras.layers.Conv2D(input_shape=(IMAGE_SIZE, IMAGE_SIZE, 1), filters=20, kernel_size=[5, 5], activation='relu')
f = keras.layers.Flatten()
output_layer = keras.layers.Dense(units=5, activation='softmax')

model = keras.models.Sequential(layers=[conv1_layer, f, output_layer])
model.compile(optimizer='sgd', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(X_train, y_train, batch_size=BATCH_SIZE, steps_per_epoch=int(X_train.shape[0])//BATCH_SIZE, epochs=5, use_multiprocessing=True)

问题最有可能出现在
use_multiprocessing=True
,它期望输入作为生成器对象(请参阅)-因此,如果馈送
X_train
数组不会立即产生错误,它可能将其视为一个生成器,通过在轴0上迭代并一次性馈送所有900000个样本-从而产生错误。尝试
使用\u multiprocessing=False
,或使用


另外,
steps\u per\u epoch
可能是一个额外的来源-从
fit
中省略它们-然后,在传入之前评估
tf.Variable
输入,因为
fit
不会自动处理。

问题最有可能出现在
use\u multiprocessing=True
,它期望输入作为生成器对象(请参阅)-因此,如果馈送
X_列
数组不会立即产生错误,它可能会将其视为一个生成器,通过迭代轴0并一次性馈送所有900000个样本-因此会产生错误。尝试
使用\u multiprocessing=False
,或使用


另外,
steps\u per\u epoch
可能是一个额外的来源-从
fit
中省略它们-然后,在传入之前评估
tf.Variable
输入,因为
fit
不会自动处理这些输入。

我建议您编写自己的训练数据生成器或
keras.utils.Sequence
。直接输入整个训练数据不是一个好主意,尤其是当数据集非常大时。此外,
use\u multiprocessing
参数仅用于生成器或keras.utils.Sequence输入,如中所述

以下代码改编自

将numpy导入为np
进口干酪
类数据生成器(keras.utils.Sequence):
“为Keras生成数据”
def uuu init uuuu(self,list_id,labels,batch_size=32,dim=(32,32),n_channels=1,n_classes=10,shuffle=True):
“初始化”
self.dim=dim
self.batch\u size=批次大小
self.labels=标签
self.list\u id=list\u id
self.n_通道=n_通道
self.n_类=n_类
self.shuffle=洗牌
self.on_epoch_end()
定义(自我):
'表示每个历元的批数'
返回整数(np.floor(len(self.list\u id)/self.batch\u size))
定义uu获取项目uu(自身,索引):
“生成一批数据”
#生成批处理的索引
索引=自索引[索引*自批大小:(索引+1)*自批大小]
#查找ID列表
list_id_temp=[索引中k的self.list_id[k]
#生成数据
十、 y=自生成\u数据(列表\u id\u temp)
返回X,y
终端上的def(自身):
'在每个历元后更新索引'
self.index=np.arange(len(self.list_id))
如果self.shuffle==True:
np.random.shuffle(自索引)
定义数据生成(自身、列表ID和临时):
“生成包含批量大小样本的数据”#X:(n个样本,*dim,n个通道)
#初始化
X=np.空((self.batch\u size、*self.dim、self.n\u通道))
y=np.empty((自身批处理大小),dtype=int)
#生成数据
对于枚举中的i,ID(列表ID临时):
#储存样品
X[i,]=np.load('data/'+ID+'.npy'))
#商店类
y[i]=self.labels[ID]
返回X,keras.utils.to_categorical(y,num_classes=self.n_classes)
params={'dim':(32,32),
“批次大小”:32,
“n_类”:5,
'n_channels':1,
“洗牌”:True}
列车数据路径=#(字符串列表)['0302'、'0325'、'3103'、…]“data/0302.npy”是存储“0302”图像的路径。
列车标签=#(整数列表)[1,0,4,…]对应900000幅图像的标签。
#发电机
列车生成=数据生成器(列车数据路径、列车标签,**参数)
型号:安装发电机(发电机=发电机组,
纪元=5,
使用_multiprocessing=True,
工人(2名)

我建议您编写自己的培训数据生成器或
keras.utils.Sequence
。直接输入整个训练数据不是一个好主意,尤其是当数据集非常大时。此外,
use\u multiprocessing
参数仅用于生成器或keras.utils.Sequence输入,如中所述

以下代码改编自

将numpy导入为np
进口干酪
类数据生成器(keras.utils.Sequence):
“为Keras生成数据”
def uuu init uuuu(self,list_id,labels,batch_size=32,dim=(32,32),n_channels=1,n_classes=10,shuffle=True):
“初始化”
self.dim=dim
self.batch\u size=批次大小
self.labels=标签
self.list\u id=list\u id
self.n_通道=n_通道
self.n_类=n_类
self.shuffle=洗牌
self.on_epoch_end()
定义(自我):
'表示每个历元的批次数'
返回整数(np.floor(len(self.list\u id)/self.batch\u size))
定义uu获取项目uu(自身,索引):
“生成一批数据”
#生成批处理的索引
索引=自索引[索引*自批大小:(索引+1)*自批大小]
#查找ID列表
list_id_temp=[索引中k的self.list_id[k]
#生成数据
十、 y=自身数据生成