ResNetのSliceについて

531 views
Skip to first unread message

Yushi Matsu

unread,
Nov 8, 2017, 9:40:34 AM11/8/17
to Neural Network Console Users (JP)
デフォルトで用意されているResNet-50を
3クラス分類に改造し、推論のみpythonで実装方法に取り組んでいます。
その際、Slice層でエラーとなり、処理が止ってしまいます。
どのようにすれば、エラーを回避して推論ができるかご教示いただけないでしょうか。
またそもそもSliceは何をしているのでしょうか。マニュアルに載っておらず、
理解できておりません。

●Neural Network Console上では、画像の学習、推論は問題無く実行できます。
 Runtimeのネットワークのみpythonコードを吐き出し、
 推論のみを別プログラムで実装する予定です。
 を参考に推論は実行できました。

以下エラーメッセージ

line 18, in network

     h = F.slice(x, (0,16,16), (3,240,240))

   File "<slice>", line 3, in slice

   File "C:\Program Files\Anaconda3\envs\nnabla\lib\site-packages\nnabla\function_bases.py", line 1715, in slice

     return F.Slice(ctx, start, stop, step)(x, n_outputs=n_outputs, auto_forward=get_auto_forward(), outputs=outputs)

   File "nnabla\function.pyx", line 269, in nnabla.function.Function.__call__ (C:\Users\0000102095\builds\0e31b680\1\nnabla\nnabla-builder\nnabla\python\src\nnabla\function.cpp:6161)

   File "nnabla\function.pyx", line 250, in nnabla.function.Function._cg_call (C:\Users\0000102095\builds\0e31b680\1\nnabla\nnabla-builder\nnabla\python\src\nnabla\function.cpp:5824)

RuntimeError: value error in nbla::Slice<float>::setup_impl

C:\Users\0000102095\builds\0e31b680\1\nnabla\nnabla-builder\nnabla\src\nbla\function\slice.cpp:40

Failed `step_[0].size() == start_[0].size()`: size of step and start must be same. Step size: 4 != start size: 3.

小林由幸

unread,
Nov 10, 2017, 5:33:16 AM11/10/17
to Neural Network Console Users (JP)
現状のNeural Network Consoleから出力されるPythonコードにはSliceレイヤーの引数にBatchSize分の引数が含まれていないことが原因と思われます。

h = F.slice(x, (0,16,16), (3,240,240))
の箇所を
h = F.slice(x, (0,0,16,16), (x.shape[0],3,240,240))
とすることで正しい動作が期待できます。

Yushi Matsu

unread,
Nov 12, 2017, 8:46:29 PM11/12/17
to Neural Network Console Users (JP)
小林様

ご教示誠にありがとうございます。
下記の内容で、Sliceのエラーはクリアしました。

しかし、下記のエラーが解消されず、まだ推論ができておりません。

  h = PF.mean_subtraction(h, 1, not test)

AttributeError: module 'nnabla.parametric_functions' has no attribute 'mean_subtraction'


このエラーについても回避方法をご教示いただけないでしょうか。


2017年11月8日水曜日 23時40分34秒 UTC+9 Yushi Matsu:

小林由幸

unread,
Nov 13, 2017, 10:04:51 PM11/13/17
to Neural Network Console Users (JP)
mean_subtractionについてはparametric_functionの実装がありませんので、
以下のコードをお試しください。

from nnabla.parameter import get_parameter_or_create, get_parameter
...
    with nn.parameter_scope('MeanSubtraction'):
        # h = PF.mean_subtraction(h, 1, not test)
        mean = get_parameter("mean_subtraction/mean")
        h = h - mean


mean_subtractionは、入力から平均値を引く関数です。
上記コードにより、パラメータとして保存されている平均値をデータから直接引きます。

Yushi Matsu

unread,
Nov 15, 2017, 11:17:26 PM11/15/17
to Neural Network Console Users (JP)

ご教示いただいた方法で実施してみましたが、

下記エラーとなります。まだバージョンアップ後のソースでは試していませんが、

- の型のエラーについてご教示いただけないでしょうか。


Traceback (most recent call last):

   File "C:\Users\infowave\Desktop\_test_03.py", line 324, in <module>

     y = network(x,t)

   File "C:\Users\infowave\Desktop\_test_03.py", line 25, in network

     h = h - mean

   File "nnabla\_variable.pyx", line 552, in nnabla._variable.Variable.__sub__ (C:\GitLab-Runner\builds\f7c9f5a8\0\nnabla\nnabla-builder\nnabla\python\src\nnabla\_variable.cpp:7134)

   File "nnabla\_arithmetic_ops.pyx", line 79, in nnabla._arithmetic_ops.sub (C:\GitLab-Runner\builds\f7c9f5a8\0\nnabla\nnabla-builder\nnabla\python\src\nnabla\_arithmetic_ops.cpp:1419)

TypeError: bad operand type for unary -: 'NoneType'


2017年11月14日火曜日 12時04分51秒 UTC+9 小林由幸:

小林由幸

unread,
Nov 16, 2017, 7:42:23 AM11/16/17
to Neural Network Console Users (JP)

mean = get_parameter("mean_subtraction/mean")

が成功していないのが原因のようです。
お使いのNeural Network Librariesがparameter_scopeのネストに対応していない可能性がありますので
以下のコードをお試しいただけますでしょうか。


    with nn.parameter_scope('MeanSubtraction'):
        # h = PF.mean_subtraction(h, 1, not test)
        with nn.parameter_scope('mean_subtraction'):
            mean = get_parameter('mean')

Yushi Matsu

unread,
Nov 17, 2017, 2:54:29 AM11/17/17
to Neural Network Console Users (JP)
何度も申し訳ありません。
やはりエラーが出て推論ができない状況です。
Pythonの知識が乏しいのが問題ですが、回避方法を教えていただけないでしょうか。 

y = network(x,t)
  File "C:\Users\Ams-200\Documents\test\Lenet_20171116.py", line 27, in network
    h = h - mean
  File "C:\Users\Ams-200\Anaconda3\envs\nnabla\lib\site-packages\nnabla\variable.py", line 91, in __sub__
    return F.add_scalar(self, -other)
TypeError: bad operand type for unary -: 'NoneType'

2017年11月16日木曜日 21時42分23秒 UTC+9 小林由幸:

yusuke inayoshi

unread,
Nov 27, 2017, 7:43:54 AM11/27/17
to Neural Network Console Users (JP)
横からの質問で申し訳ございません、私も同じ現象となっております。
nnablaを「pip install nnabla -U」で最新にしましたが、同じエラーとなります。

>お使いのNeural Network Librariesがparameter_scopeのネストに対応していない可能性がありますので

とございますが、nnablaのバージョンやその他で違いがあるのでしょうか。
「parameter_scope」に対応したnnablaがございましたら、教えていただけますと嬉しいです。


2017年11月16日木曜日 21時42分23秒 UTC+9 小林由幸:

小林由幸

unread,
Nov 30, 2017, 10:35:39 PM11/30/17
to Neural Network Console Users (JP)
依然get_parameterを読んだ時点で、meanが正しく取得できていないようです。
パラメータのLoad後に、

print(nn.get_parameters(grad_only=False))


とし、表示された(読み込まれた)パラメータ一覧の中に
MeanSubtraction/mean_subtraction/meanが含まれていることをご確認ください。

以下は01_logistic_regressionの先頭にMeanSubtractionを挿入した場合の推論実行コードです。

import nnabla as nn
import nnabla.functions as F
import nnabla.parametric_functions as PF

from nnabla.parameter import get_parameter

def network(x, test=False):
    # Input -> 1,28,28
    # MeanSubtraction
    with nn.parameter_scope('MeanSubtraction'):

        with nn.parameter_scope('mean_subtraction'):
            mean = get_parameter('mean')
        print(mean)
        h = x - F.reshape(mean, ((1,) + mean.shape))
    # Affine -> 1
    with nn.parameter_scope('Affine'):
        h = PF.affine(h, (1,))
    # Sigmoid
    h = F.sigmoid(h)
    return h

nn.load_parameters('{your training result path}/parameters.h5')

print(nn.get_parameters(grad_only=False))

x = nn.Variable((1, 1, 28, 28))
y = network(x)

# x.d = (input image)
y.forward()

print(y.d)

Reply all
Reply to author
Forward
0 new messages