覚え書きブログ

Pythonによる機械学習4(ニューラルネット応用 4/4)

<< Pythonによるデータ解析4(ニューラルネット応用 3/4)

Pythonによる機械学習4(ニューラルネット応用 4/4)の目次】

画像分類ニューラルネットワークの学習と評価

以下のように、neuralNetwork.py(または、neuralNetwork_template.py)を変更して、MNISTデータを用いてニューラルネットワークを学習します。
【変更前の人工データを用いた学習】

        # 1) 人工データの生成(難しい場合)
        myData = data.artificial(300,150,mean1=[1,2],mean2=[-2,-1],mean3=[4,-2],mean3multi=[-2,4],cov=[[1,0],[0,1]])

        # 2) 3階層のニューラルネットワークモデルの作成
        classifier = neuralNetwork(myData.xTrain, myData.tTrain,hDim=20)

        # 3) 学習前の事後確率と学習データの描画
        myData.plotClassifier(classifier,"train",prefix="posterior_NN_before")

        # 4) モデルの学習
        Nite = 1000  # 更新回数

        # 7) 学習した事後確率と学習データの描画
        myData.plotClassifier(classifier,"train",prefix="posterior_NN_after")
        myData.plotClassifier(classifier,"test",prefix="posterior_NN_after_test")

【変更後のMNISTを用いた学習】

        # 1) 人工データの生成(難しい場合)
        #myData = data.artificial(300,150,mean1=[1,2],mean2=[-2,-1],mean3=[4,-2],mean3multi=[-2,4],cov=[[1,0],[0,1]])

        # 1) MNISTのデータ
        myData = data.MNIST()

        # 2) 3階層のニューラルネットワークモデルの作成
        classifier = neuralNetwork(myData.xTrain, myData.tTrain,hDim=100, batchSize=500)

        # 3) 学習前の事後確率と学習データの描画
        #myData.plotClassifier(classifier,"train",prefix="posterior_NN_before")

        # 4) モデルの学習
        Nite = 300  # 更新回数

        # 7) 学習した事後確率と学習データの描画
        #myData.plotClassifier(classifier,"train",prefix="posterior_NN_after")
        #myData.plotClassifier(classifier,"test",prefix="posterior_NN_after_test")

中間層のノード数が1,5,10,50,100,200,300,500,800と異なるニューラルネットワークを学習して、評価データを用いて正解率をプロットし比較します。
f:id:hirotaka_hachiya:20171206134503p:plain
中間層のノード数が50以上のニューラルネットワークは約95%の高い正解率を得ることが出来ていることがわかります。

画像分類の結果の可視化

正解率のプロットだけでは、実際にどれくらい画像分類ができているのかが直感的にはわかりません。そこで、ニューラルネットワークにより正しく分類できた画像と、ご分類した画像をプロットし確認してみます。

neuralNetwork.py(または、neuralNetwork_template.py)のメインに以下を追加してください。

	# 9) 結果の可視化
	# 成功と失敗のインデックスを取得
	predict = np.argmax(classifier.predict(myData.xTest),axis=0)
	succInds = np.where((myData.yTest-predict)==0)[0]
	failInds = np.where(myData.yTest-predict)[0]

	# 成功画像と失敗画像のプロット
	print("成功例")
	myData.plotImg(succInds[:10],isTrain=False,predict=predict)

	print("失敗例")	
	myData.plotImg(failInds[:10],isTrain=False,predict=predict)

※成功例10枚と失敗例10枚が一枚ずつウィンドウに表示されます。ウィンドウを閉じると次の画像が表示されます。

以下、正解した事例と、誤分類した事例です。

【正解した事例】
f:id:hirotaka_hachiya:20171206140104p:plain

【誤分類した事例】
f:id:hirotaka_hachiya:20171206135300p:plain

人間が見ても、はっきりとどの数字かわからないような、相当くせの強い文字にて失敗しているのがわかります。

演習2

上記の内容に従い、data.MNISTを用いてMNISTの学習データと評価データを作成し、中間層のノード数が100のニューラルネットワークを学習し評価しましょう。また、可視化結果を確認しましょう。

作成したスクリプトおよび出力したグラフ画像ファイルを、Moodleにて提出してください。

宿題

感情分類および手書き文字画像の分類を参考に、各グループで選定した課題に、ニューラルネットワークを適用してみましょう。次回、各グループにて以下の内容を発表してください。
1) 選択した課題の内容
2) 学習データと評価データの概要
3) ニューラルネットワークを応用する上でのアルゴリズムおよび実装上の工夫
4) 実験設定と実験結果
5) まとめ(できた所、難しかった所など)