0
모양 배열 (28 * 28)을 0으로 패딩하려고합니다. 이 배열은 PIL 라이브러리를 사용하여 이미지를 배열로 변환 한 결과입니다. OpenCL을 사용하여 커널을 작성했습니다. 이 프로그램은 무작위 numpy 배열에 대해서는 정상적으로 작동하지만 이미지에서 변환 된 배열에서는 제대로 작동하지 않습니다. 그러나, 이미지는 어레이로 적절하게 변환되고, 즉, 원하는 픽셀 값을 출력한다. 문제가 커널 내부의 데이터 유형과 비슷한 상황에서 발생했습니다 (float를 double로 변경해야 함). 나는이 코드 조각을 실행할 때opencl - 패딩이 다른 출력을 생성합니다.
import numpy
from PIL import Image
from numpy import array
import pyopencl as cl
def pad(x, order):
kernelsource = """
__kernel void pad(
__global double* A,
__global double* B,
const unsigned int M)
{
int i = get_global_id(0);
int j = get_global_id(1);
if((i<M) && (j<M))
{
if((j == 0) || (j == M-1) || (i == 0) || (i == M-1))
{
B[i*M + j] = 0;
}else{
B[i*M + j] = A[(i-1)*(M-2) + j-1];
}
}
}
"""
context = cl.create_some_context()
queue = cl.CommandQueue(context)
program = cl.Program(context, kernelsource).build()
out_order = order + 2
h_a = x
d_a = cl.Buffer(context, cl.mem_flags.READ_ONLY | cl.mem_flags.COPY_HOST_PTR, hostbuf=h_a)
h_b = numpy.empty((out_order,out_order))
d_b = cl.Buffer(context, cl.mem_flags.WRITE_ONLY, h_b.nbytes)
pad = program.pad
pad.set_scalar_arg_dtypes([None, None, numpy.uint32])
pad(queue, h_b.shape, None, d_a, d_b, out_order)
queue.finish()
cl.enqueue_copy(queue, h_b, d_b)
return h_b
:이를 실행하는 동안,
[[ 0. 0. 0. 0. 0. ]
[ 0. 0.75495661 0.58017939 0.61390089 0. ]
[ 0. 0.33017635 0.98233609 0.77542593 0. ]
[ 0. 0.94607981 0.6020772 0.14673336 0. ]
[ 0. 0. 0. 0. 0. ]]
:하지만
arr = numpy.random.rand(3,3)
print pad(arr,3)
을 내가 올바른 결과를 얻을
image = Image.open('1.jpg')
data = array(image)
print pad(data,data.shape[0])
내가 얻을 this :
[[ 0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000
0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000
0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000
0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000
0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000
0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000
0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000
0.00000000e+000 0.00000000e+000]
[ 0.00000000e+000 -4.73788662e+226 -5.14319684e+303 -1.27732501e+294
-1.27733779e+294 -1.27701620e+294 -8.36396791e+298 nan
-1.96381395e+289 -1.68533731e+308 nan 3.62029008e-217
nan -1.79768197e+308 nan 5.97554844e-311
-7.58630869e+298 2.78134240e-309 2.17953307e-289 nan
7.74667808e-304 nan 3.19854370e-308 nan
5.77663315e-275 7.29111854e-304 8.34430283e-309 1.09916879e-311
-7.22416349e+221 0.00000000e+000]
...
...
[ 0.00000000e+000 5.43230923e-311 7.38794055e-310 5.43230922e-312
6.51877107e-311 8.47440239e-310 5.43230922e-312 1.08646185e-310
9.56086424e-310 5.43230922e-312 1.19510803e-310 0.00000000e+000
0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000
0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000
6.36598737e-314 1.58101007e-322 0.00000000e+000 3.16202013e-322
2.47032823e-322 0.00000000e+000 4.94065646e-324 0.00000000e+000
6.36598738e-314 0.00000000e+000]
[ 0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000
0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000
0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000
0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000
0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000
0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000
0.00000000e+000 0.00000000e+000 0.00000000e+000 0.00000000e+000
0.00000000e+000 0.00000000e+000]]
무엇이 잘못 되었나요? 데이터 유형에 문제가 있습니까?