拉緹娜 2023-07-18 09:01 采纳率: 50%
浏览 9

无法创建卷积算子或使用GPU运算?

最近在飞浆学习目标检测,教程先教了个检测黑白边界的案例。

w = np.array([1, 0, -1], dtype='float32')
w = w.reshape([1, 1, 1, 3])
img = np.ones([50,50], dtype='float32')
img[:, 30:] = 0.
x = img.reshape([1,1,50,50])
x = paddle.to_tensor(x)

这段代码先创建了一个二维数组,每行前30个数为1,后20个数为0,到这里都没问题。

img

但是在创建卷积算子并且开始做运算之后就报错,只输出了一段关于GPU和CUDA版本的信息

# 创建卷积算子,设置输入和输出通道数,卷积核大小,通过参数属性weight_attr用w初始化参数权重
conv = Conv2D(in_channels=1, out_channels=1, kernel_size=[1, 3],
       weight_attr=paddle.ParamAttr(
          initializer=Assign(value=w)))
y = conv(x)
out = y.numpy()
f = plt.subplot(121)
f.set_title('input image', fontsize=15)
plt.imshow(img, cmap='gray')
f = plt.subplot(122)
f.set_title('output featuremap', fontsize=15)plt.imshow(out.squeeze(), cmap='gray')
plt.show()
print(conv.weight)
print(conv.bias)

img

以下是完整代码

import matplotlib.pyplot as plt
import numpy as np
import paddle
from paddle.nn import Conv2D
from paddle.nn.initializer import Assign

# 假设白色区域像素值为1,黑色区域像素值为0。
# 创建初始化权重参数w,当且仅当卷积核处于黑白交界线上时,卷积计算的结果不为0,以此找出黑白交线
w = np.array([1, 0, -1], dtype='float32')
# 将权重参数调整成维度为[cout, cin, kh, kw]的卷积核形式
# 四个参数意思分别为输出图片的通道数,输入图片的通道数,卷积核的宽度,卷积核的长度
# 这里表示w被重塑为四维数组,其中一二三维度大小为1,四维度大小为3,w=[[[[ 1.  0. -1.]]]]
w = w.reshape([1, 1, 1, 3])
# 创建输入图片,图片左边的像素点取值为1,右边的像素点取值为0
img = np.ones([50,50], dtype='float32')
# 选取所有行的,第30列以及之后的元素,设置为0
img[:, 30:] = 0.
# 将图片形状调整为[N, C, H, W]的形式,N表示输入图片数量,C表示一张图片的通道数,HW表示图片的形状
x = img.reshape([1,1,50,50])
print(x)
# 将numpy.ndarray转化成paddle中的tensor,数据形式不变但支持在GPU上运行
x = paddle.to_tensor(x)

# 创建卷积算子,设置输入和输出通道数,卷积核大小,通过参数属性weight_attr用w初始化参数权重
conv = Conv2D(in_channels=1, out_channels=1, kernel_size=[1, 3],
       weight_attr=paddle.ParamAttr(
          initializer=Assign(value=w)))

# 使用卷积算子作用在输入图片上
y = conv(x)
# 将输出tensor转化为numpy.ndarray
out = y.numpy()
# print(out)
f = plt.subplot(121)
f.set_title('input image', fontsize=15)
plt.imshow(img, cmap='gray')
f = plt.subplot(122)
f.set_title('output featuremap', fontsize=15)
# 卷积算子Conv2D输出数据形状为[N, C, H, W]形式
# 此处N, C=1,输出数据形状为[1, 1, H, W],是4维数组
# 但是画图函数plt.imshow画灰度图时,只接受2维数组
# 通过numpy.squeeze函数将大小为1的维度消除
plt.imshow(out.squeeze(), cmap='gray')
plt.show()
# 查看卷积层的权重参数名字和数值
print(conv.weight)
# 参看卷积层的偏置参数名字和数值
print(conv.bias)
  • 写回答

2条回答 默认 最新

  • Py小郑 Python领域潜力新星 2023-07-18 09:23
    关注

    这个问题可能是由于PaddlePaddle环境设置或者版本不一致导致的。首先,你需要确认以下几点:

    1. PaddlePaddle的版本是否正确:在PaddlePaddle 2.0以后的版本中,paddle.nn.Conv2D是可用的。你可以通过print(paddle.__version__)来检查你的PaddlePaddle版本。

    2. CUDA和cuDNN的版本是否和PaddlePaddle支持的版本一致:PaddlePaddle需要依赖于CUDA和cuDNN来运行,不同版本的PaddlePaddle对应的CUDA和cuDNN版本是不同的。你可以参考PaddlePaddle的官方安装指南来确认你的CUDA和cuDNN的版本。

    3. 设备是否支持:确保你的设备支持CUDA,并且确保你已经正确安装了NVIDIA驱动。

    另外,你可以尝试在创建paddle.to_tensor(x)时指定设备,如下:

    x = paddle.to_tensor(x, place=paddle.CPUPlace())
    

    这样就可以在CPU上运行你的代码,而不需要依赖于GPU或CUDA。如果你的代码在CPU上运行正常,但是在GPU上运行失败,那么问题可能就出在GPU或CUDA上。

    最后,你也可以试着将你的代码或者错误信息完整地复制并发表到PaddlePaddle的GitHub issues或者论坛中,那里有很多专业的开发者可以帮助你。

    评论

报告相同问题?

问题事件

  • 创建了问题 7月18日

悬赏问题

  • ¥17 pro*C预编译“闪回查询”报错SCN不能识别
  • ¥15 微信会员卡接入微信支付商户号收款
  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向