tensorflow GPU崩溃为0批量大小CUDNN_STATUS_BAD_PARAM

时间:2017-11-30 05:09:06

标签: tensorflow deep-learning gpu tensorflow-gpu

此问题似乎已存在很长时间,许多用户都面临着这个问题。

stream_executor / cuda / cuda_dnn.cc:444]无法转换BatchDescriptor {count:0 feature_map_count:64 spatial:7 264 value_min:0.000000 value_max:0.000000 layout:BatchDepthYX} t o cudnn张量描述符:CUDNN_STATUS_BAD_PARAM

这条消息是如此神秘,以至于我不知道我的代码中发生了什么,但是,我的代码在CPU张量流上运行良好。

我听说我们可以使用tf.cond解决这个问题,但我是tensorflow-gpu的新手,那么有人可以帮助我吗?我的代码使用Keras并使用生成器作为输入,这是为了避免任何内存不足的问题。生成器由一个True循环构建,按一些批量大小吐出数据。

def resnet_model(bin_multiple):
    #input and reshape
    inputs = Input(shape=input_shape)
    reshape = Reshape(input_shape_channels)(inputs)
    #normal convnet layer (have to do one initially to get 64 channels)
    conv = Conv2D(64,(1,bin_multiple*note_range),padding="same",activation='relu')(reshape)
    pool = MaxPooling2D(pool_size=(1,2))(conv)
    for i in range(int(np.log2(bin_multiple))-1):
        print( i)
        #residual block
        bn = BatchNormalization()(pool)
        re = Activation('relu')(bn)
        freq_range = int((bin_multiple/(2**(i+1)))*note_range)
        print(freq_range)
        conv = Conv2D(64,(1,freq_range),padding="same",activation='relu')(re)
        #add and downsample
        ad = add([pool,conv])
        pool = MaxPooling2D(pool_size=(1,2))(ad)
    flattened = Flatten()(pool)
    fc = Dense(1024, activation='relu')(flattened)
    do = Dropout(0.5)(fc)
    fc = Dense(512, activation='relu')(do)
    do = Dropout(0.5)(fc)
    outputs = Dense(note_range, activation='sigmoid')(do)
    model = Model(inputs=inputs, outputs=outputs)
    return model

model = resnet_model(bin_multiple)
init_lr = float(args['init_lr'])
    model.compile(loss='binary_crossentropy',
              optimizer=SGD(lr=init_lr,momentum=0.9), metrics=['accuracy', 'mae', 'categorical_accuracy'])
model.summary()
history = model.fit_generator(trainGen.next(),trainGen.steps(), epochs=epochs,     
verbose=1,validation_data=valGen.next(),validation_steps=valGen.steps(),callbacks=callbacks, workers=8, use_multiprocessing=True)

1 个答案:

答案 0 :(得分:3)

问题是当您为收到的0批量大小建模时。对我来说,我有错误,因为我有1000个例子,我在多个GPus(2 GPU)上运行它,批量大小等于32。在我的图表中,我将批量大小分成小批量大小,因此每个GPU占16个例子。在步骤31(31 * 32),我将完成992个示例,因此只剩下8个示例,它将转到GPU 1,GPU2将以零批量大小结束,这就是我收到上述错误的原因。

仍无法解决问题,仍在寻找合适的解决方案。 我希望这可以帮助您发现在代码中您收到零批量大小。