2017-11-06 8 views
0

私は形状の配列(28 * 28)をゼロで埋めようとしています。この配列は、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]] 

何が問題になりましたか?データ型に問題がありますか?

答えて

1

前述のとおり、データ型は一致しませんでした。したがって、入力配列はdoubleのdtypeに変換する必要がありました。 コード:

image = Image.open('1.jpg') 

data = array(image,dtype="double") 

print pad(data,data.shape[0]) 
関連する問題