chainerの画像認識 Classifier.predictorの値とは
Chainerを使ってひらがな73文字を畳み込みニューラルネットワークで画像から学習させ、モデルを保存しました。その学習させたモデルをserializers.load_npzで読み込み、手書き画像を入力し認識させ、上位5個を割合と一緒に結果として表示させるコードを書いています。
目標としている表示結果(例)
tegaki_na.pngの識別結果
な:60%
た:25%
は:10%
あ:4%
を:1%
しかし、その割合として利用しようとしていたpredictorのdataから得られる行列(要素73個)は正の値から負の値まであるため、そのまま割合としては使えないことがわかりました(すべてを足しても1や100になることはありませんでした)。
公式のChainer.Links.Classifierの項目を読んでもpredictorの出力の形までは説明が書いておらず、手詰まりになっためここで質問させていただきました。
以下ソースコードです。ここではpredictorの中の実際の値をそのまま出力するようになっています(これをパーセントにしたい)
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
実行するときのコード(作業ディレクトリにカレントを移動している前提)
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]))
結果
tegaki_na.pngの識別結果
な:42.3303
た:30.025
は:26.0882
あ:25.0445
を:19.8176