首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cudnn: CUDNN_SOFTMAX_FAST输出NaN当CUDNN_SOFTMAX_ACCURATE工作正常时

cudnn: CUDNN_SOFTMAX_FAST输出NaN当CUDNN_SOFTMAX_ACCURATE工作正常时
EN

Stack Overflow用户
提问于 2016-12-24 10:43:39
回答 1查看 415关注 0票数 0

使用cudnnSoftmaxForward的某些浮点值将在设置CUDNN_SOFTMAX_FAST而不是CUDNN_SOFTMAX_ACCURATE时产生CUDNN_SOFTMAX_FAST输出。有人知道为什么会这样吗?这是图书馆里的臭虫吗?

代码语言:javascript
复制
cudnnHandle_t lib;
cudnnCreate(&lib);
int count = 10;
size_t size = count * sizeof(float);

float examples[] = {
    95.094505f,
    -600.288879f,
    85.621284f,
    72.220154f,
    70.099487f,
    43.734470f,
    69.538422f,
    69.705490f,
    20.752966f,
    81.020088f
};

float* cexamples;
cudaMalloc(&cexamples, size);
cudaMemcpy(cexamples, examples, size, cudaMemcpyKind::cudaMemcpyHostToDevice);

cudnnTensorDescriptor_t tExamples;
cudnnCreateTensorDescriptor(&tExamples);
cudnnSetTensor4dDescriptor(tExamples, cudnnTensorFormat_t::CUDNN_TENSOR_NCHW, cudnnDataType_t::CUDNN_DATA_FLOAT, 1, count, 1, 1);

float one = 1;
float zero = 0;

cudnnSoftmaxForward(lib, cudnnSoftmaxAlgorithm_t::CUDNN_SOFTMAX_FAST, cudnnSoftmaxMode_t::CUDNN_SOFTMAX_MODE_INSTANCE, &one, tExamples, cexamples, &zero, tExamples, cexamples);

cudaMemcpy(examples, cexamples, size, cudaMemcpyKind::cudaMemcpyDeviceToHost);
for (size_t i = 0; i < count; i++)
{
    printf("\n");
    printf("%f  ", examples[i]);
}

下面是使用CUDNN_SOFTMAX_FAST的结果:

下面是使用CUDNN_SOFTMAX_ACCURATE的结果:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-04 13:45:39

我猜您的问题是由溢出引起的,即您(进程中的某个地方)的值变得太大,不可能成为float

CUDNN_SOFTMAX_FAST只是运行,而不检查是否发生溢出。另一方面,CUDNN_SOFTMAX_ACCURATE避免了它(使用减法)。

CUDNN在溢出时返回NaN (请注意,“standart”C可能不会像这样)。

我能建议的是:

  • 使用较小的值(为什么不使用归一化 )
  • 尝试使用更大的类型(看上去很幼稚,但也许可以)
  • 只需设置CUDNN_SOFTMAX_ACCURATE

希望这能有所帮助

pltrdy

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41312549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档