2017-03-22 2 views
0

Chainer、なぜ私のモデルは画像の**配列**を期待していますか?私は非常に単純な、おもちゃ、チェイナモデルを書いた

class Upscale(chainer.Chain): 
def __init__(self): 
    super(Upscale, self).__init__(
     d1=L.Deconvolution2D(3, 40, 4, stride=2), 
     c1=L.Convolution2D(40, 3, 4) 
     ) 


def __call__(self, x, test=False): 
    h = self.c1(self.d1(x)) 
    return h 

私はそれを呼び出すことができ、動作しているようです。しかし、私はそれを呼び出す必要があります。参考のため

model = Upscale() 
... 
xp = cuda.cupy 
... 
image = xp.zeros((1, 3, 768, 1024), dtype=xp.float32) 
image[0] = load_image("foo.jpg", xp) 
... 
y = model(image[0:1]) 

、load_imageは次のとおりです。

def load_image(path, xp): 
image = Image.open(path).convert('RGB') 
return xp.asarray(image, dtype=xp.float32).transpose(2, 0, 1) 

字型の配列(1、3、768、1024)ではなく、配列を受け入れる私のモデル( 3,768,1024)。私はなぜかこれは表示されません。あるいは、単一の画像を受け入れるチェーンモデルを作成する方法が役立ちます。私が得るエラーは:

Traceback (most recent call last): 
    File "upscale.py", line 92, in <module> 
    main() 
    File "upscale.py", line 68, in main 
    y0 = model(image, test=True) 
    File "upscale.py", line 21, in __call__ 
    h = self.c1(self.d1(x)) 
    File "/usr/local/lib/python2.7/dist-packages/chainer/links/connection/deconvolution_2d.py", line 116, in __call__ 
    deterministic=self.deterministic) 
    File "/usr/local/lib/python2.7/dist-packages/chainer/functions/connection/deconvolution_2d.py", line 332, in deconvolution_2d 
    return func(x, W, b) 
    File "/usr/local/lib/python2.7/dist-packages/chainer/function.py", line 189, in __call__ 
    self._check_data_type_forward(in_data) 
    File "/usr/local/lib/python2.7/dist-packages/chainer/function.py", line 273, in _check_data_type_forward 
    self.check_type_forward(in_type) 
    File "/usr/local/lib/python2.7/dist-packages/chainer/functions/connection/deconvolution_2d.py", line 50, in check_type_forward 
    x_type.shape[1] == w_type.shape[0] 
    File "/usr/local/lib/python2.7/dist-packages/chainer/utils/type_check.py", line 487, in expect 
    expr.expect() 
    File "/usr/local/lib/python2.7/dist-packages/chainer/utils/type_check.py", line 449, in expect 
    '{0} {1} {2}'.format(left, self.inv, right)) 
chainer.utils.type_check.InvalidType: 
Invalid operation is performed in: Deconvolution2DFunction (Forward) 

Expect: in_types[0].ndim == 4 
Actual: 3 != 4 
+0

あなたは多分私はおそらく十分に正確ではなかったあなたのイメージ –

答えて

0

私の環境では、次のコードが正しく動作することを確認しました。 print(image.shape)、print(image [0] .shape)、print(image [0:]。shape)の結果を教えてください。 また、私はあなたのチェンジャーのバージョンを知りたいです。

import cupy 
from PIL import Image 
import chainer.links as L 
import chainer 


def load_image(path): 
    image = Image.open(path).convert('RGB') 
    return cupy.asarray(image, dtype=cupy.float32).transpose(2, 0, 1) 

image = cupy.zeros((1, 3, 768, 1024), dtype=cupy.float32) 
image[0] = load_image("foo.png") 
print(image[0].shape) # (3, 768, 1024) 
print(image.shape) # (1, 3, 768, 1024) 
print(image[0:1].shape) # (1, 3, 768, 1024) 

class Upscale(chainer.Chain): 
    def __init__(self): 
     super(Upscale, self).__init__(
      d1=L.Deconvolution2D(3, 40, 4, stride=2), 
      c1=L.Convolution2D(40, 3, 4) 
     ) 


    def __call__(self, x, test=False): 
     h = self.c1(self.d1(x)) 
     return h 

model = Upscale() 
model.to_gpu() 
y = model(image[0:1]) # work 
+0

に余分な次元を追加することができます。しかし、私の質問は:あなたのサンプルでは、​​どうしてですか? y =モデル(画像[0]) は機能しますか? Chainerは、画像が行う配列を必要とするようです。 – Jeffrey

+0

チェーン機能とレイヤーのほとんどは、入力配列の最初の次元がミニバッチの次元でなければなりません。デコンボリューション層の入力配列の形状は(N、c、h、w)でなければなりません。 N =ミニバッチサイズ、c =チャンネルサイズ、h =画像の高さ、w =画像の幅。 1枚の画像を入力したい場合は、1枚の画像を含むミニバッチを作成してください。 – fukatani

+0

オクラホマは、ミニバッチを受け取り、余分なディメンションはミニバッチです。けっこうだ。 – Jeffrey

関連する問題