此问题似乎已存在很长时间,许多用户都面临着这个问题。
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)
答案 0 :(得分:3)
问题是当您为收到的0批量大小建模时。对我来说,我有错误,因为我有1000个例子,我在多个GPus(2 GPU)上运行它,批量大小等于32。在我的图表中,我将批量大小分成小批量大小,因此每个GPU占16个例子。在步骤31(31 * 32),我将完成992个示例,因此只剩下8个示例,它将转到GPU 1,GPU2将以零批量大小结束,这就是我收到上述错误的原因。
仍无法解决问题,仍在寻找合适的解决方案。 我希望这可以帮助您发现在代码中您收到零批量大小。