

Chainerを使ってひらがな73文字を畳み込みニューラルネットワークで画像から学習させ、モデルを保存しました。その学習させたモデルをserializers.load_npzで読み込み、手書き画像を入力し認識させ、上位5個を割合と一緒に結果として表示させるコードを書いています。

目標としている表示結果（例）

[code]

    tegaki_na.pngの識別結果
    　な：60%
    　た：25%
    　は：10%
    　あ：4%
    　を：1%
    
[/code]

しかし、その割合として利用しようとしていたpredictorのdataから得られる行列（要素73個）は正の値から負の値まであるため、そのまま割合としては使えないことがわかりました（すべてを足しても1や100になることはありませんでした）。  
公式のChainer.Links.Classifierの項目を読んでもpredictorの出力の形までは説明が書いておらず、手詰まりになっためここで質問させていただきました。

以下ソースコードです。ここではpredictorの中の実際の値をそのまま出力するようになっています（これをパーセントにしたい）

[code]

    import numpy as np
    import cv2
    import chainer
    import chainer.links as L
    from chainer import Variable
    #畳み込みのモデルはconvolution_model.pyとして保存してある
    import convolution_model as CNN
    
    label = ['あ', 'い', 'う', 'え', 'お',
             'か', 'が', 'き', 'ぎ', 'く', 'ぐ', 'け', 'げ', 'こ', 'ご',
             'さ', 'ざ', 'し', 'じ', 'す', 'ず', 'せ', 'ぜ', 'そ', 'ぞ',
             'た', 'だ', 'ち', 'ぢ', 'つ', 'づ', 'て', 'で', 'と', 'ど',
             'な', 'に', 'ぬ', 'ね', 'の',
             'は', 'ば', 'ぱ', 'ひ', 'び', 'ぴ', 'ふ', 'ぶ', 'ぷ', 'へ', 'べ', 'ぺ', 'ほ', 'ぼ', 'ぽ',
             'ま', 'み', 'む', 'め', 'も',
             'や', 'ゆ', 'よ',
             'ら', 'り', 'る', 'れ', 'ろ', 'わ', 'ゐ', 'ゑ', 'を', 'ん']
    
    #画像サイズは48x48である前提
    model = L.Classifier(CNN.Model())
    chainer.serializers.load_npz('nihongo.model', model)
    
    def loadimg(image):
        img_ = cv2.imread(image, 0) #グレースケールとして読み込み
    
        height, width = img_.shape[:2]
        if height!=48 or width!=48: #縦または横の長さが48pxではない場合
            img_ = cv2.resize(img_,(48,48)) #48x48にリサイズ
    
        img_ = img_.astype(np.float32)/255
        temp=[]
        temp2=[]
        temp.append(img_)
        temp2.append(temp)
        img_ = np.array(temp2)
        return img_
    
    def score(image):
        img = loadimg(image)
    
        result = model.predictor(Variable(img))
        result = result.data[0] #それぞれの文字である確率？
    
        a_label = np.argsort(result)
        a_ratio = np.sort(result)
    
        a_label = a_label[-1::-1]
        a_ratio = a_ratio[-1::-1]
        return a_label, a_ratio
    
[/code]

実行するときのコード（作業ディレクトリにカレントを移動している前提）

[code]

    IMGName='test_ga.png'
    AL,AR = score(IMGName)
    
    print(IMGName,'の結果')
    for i in range(73):
        ans_l=AL[i]
        print(str(label[ans_l]),':',str(AR[i]))
    
[/code]

結果

[code]

    tegaki_na.pngの識別結果
    　な：42.3303
    　た：30.025
    　は：26.0882
    　あ：25.0445
    　を：19.8176
    
[/code]


CC BY-SA 3.0
2017-11-22T06:51:34.520
39757
2018-10-02T02:00:00.643
25555
question
python chainer
chainerの画像認識 Classifier.predictorの値とは


<http://docs.chainer.org/en/stable/reference/generated/chainer.links.Classifier.html#chainer-
links-classifier>  
<https://github.com/chainer/chainer/blob/v3.1.0/chainer/links/model/classifier.py#L71>

`L.Classifier`の初期化子に与えた第1引数が`predictor`属性に格納されますから、質問のソースで言うと`model =
L.Classifier(CNN.Model())`の`CNN.Model()`の部分ですね。  
`convolution_model.py`の中の`Model`で、あなたが定義した値が出ているだけですよ。

（言葉を換えると、`L.Classifier`はあなたが定義した識別モデルを渡されているだけ、ということです）


CC BY-SA 3.0
2017-11-22T09:49:16.540
39764
2017-11-22T10:11:32.253
2017-11-22T10:11:32.253
12274
12274
39757
answer