前提・実現したいこと
深層学習フレームワークCaffeを用いて2クラス分類を行っています。アルゴリズムはGoogLeNetです。
学習の結果、test_accuracyは約0.89となりました。
その後、pythonスクリプトで画像分類を行ったところ、全て同じクラスに分類されてしまいます。
テストに用いたデータ、訓練にもテストにも用いていないデータを使用した場合も結果は同様です。
以下に画像分類に使用した、pythonスクリプトと10個の画像に対する出力結果を載せます。
ご回答よろしくお願いします。
classify.py
python
1#!/usr/bin/env python 2#_*_ coding: utf-8 _*_ 3 4import numpy as np 5import scipy as sp 6import sys 7 8import caffe 9from PIL import Image 10 11argvs = sys.argv 12argc = len(argvs) 13 14IMAGE_FILE = argvs[1] 15 16caffe.set_mode_gpu() 17 18model_def = 'deploy.prototxt' # deploy.prototxtを指定 19model_weights = 'snapshot/bvlc_googlenet_iter_720000.caffemodel' # 学習で生成されたモデル(連番の最後)を指定 20net = caffe.Net(model_def, model_weights, caffe.TEST) # 変数netにcaffe.Netを生成 21 22# transformerを生成 23transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape}) 24transformer.set_raw_scale('data', 255) 25transformer.set_transpose('data', (2, 0, 1)) 26transformer.set_channel_swap('data',(2,1,0)) 27 28net.blobs['data'].reshape(1, 3, 224, 224) # 学習のバッチサイズ, チャネル数, 縦, 横の順で 29 30#for cl in range(0, 2): # clはクラスの連番 31# print('\nprint class: ' + str(cl)) 32# for n in range(0, 2): 33 34# (cl)_(n).pngの画像をロード 35image = caffe.io.load_image(IMAGE_FILE) 36 37# データの整形 38transformed_image = transformer.preprocess('data', image) 39net.blobs['data'].data[...] = transformed_image 40output = net.forward() 41output_prob = output['prob'][0] 42 43 44 45print('predicted class is ', output_prob) 46
出力結果
全て2つ目のクラスに分類されてしまっています。
('predicted class is ', array([0.0457759, 0.9542241], dtype=float32)) ('predicted class is ', array([0.01303386, 0.98696613], dtype=float32)) ('predicted class is ', array([0.07630268, 0.9236973 ], dtype=float32)) ('predicted class is ', array([0.01624789, 0.98375213], dtype=float32)) ('predicted class is ', array([0.14536919, 0.85463077], dtype=float32)) ('predicted class is ', array([0.04405485, 0.95594513], dtype=float32)) ('predicted class is ', array([0.09450724, 0.9054927 ], dtype=float32)) ('predicted class is ', array([0.01997812, 0.9800219 ], dtype=float32)) ('predicted class is ', array([0.01074958, 0.9892504 ], dtype=float32)) ('predicted class is ', array([0.06119116, 0.93880886], dtype=float32))
試したこと
学習時と分類時に使用したレイヤー名の一致は確認しました。
あなたの回答
tips
プレビュー