So-net無料ブログ作成
検索選択
前の10件 | -

torch7で小さくディープラーニング(6)パターン認識 [人工知能(ディープラーニング)]

今回はパターン認識をしてみます。
さらには、これまではプログラムの中で学習用データを作成していましたが、外部のデータを読み込んで処理をします。

まずは、以下のテキストデータをNUMBERS.CSVとしてセーブします。
========================= CSV FILEここの下から
1,1,1,1,0,1,1,0,1,1,0,1,1,1,1,0
0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1
1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,2
1,1,1,0,0,1,1,1,1,0,0,1,1,1,1,3
1,0,1,1,0,1,1,1,1,0,0,1,0,0,1,4
1,1,1,1,0,0,1,1,1,0,0,1,1,1,1,5
1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,6
1,1,1,0,0,1,0,0,1,0,0,1,0,0,1,7
1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,8
1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,9
========================= CSV FILEここの上まで

実はこのデータ、縦5、横3のピクセルで数字の0〜9を表しています。
例えば数字の9ならば以下のような形です。
===9===
1 1 1
1 0 1
1 1 1
0 0 1
0 0 1
=======
(数字の1が9の形に並んでいます)
これを横一列に並べれば、数字の9は…
1,1,1,1,0,1,1,1,1,0,0,1,0,0,1
というデータになります。
さらに、データを入れたCSVファイルの各行のいちばん右側の数字は、データに対する答えです。

こんな形で0〜9に対応するデータを用意し、それをニューラル・ネットワークで認識できるようにします。

※なお、torch7でCSVファイルを扱えるように、csvigoライブラリーをインストールしておく必要があります。
「luarocks install csvigo」でインストールしてください。

 CSVファイルから読み込んだデータは、そのままでは行列データのtorch.Tensorではなく、連想配列といわれるテーブル形式なので、「1」という数字も実際にはテキストの「1」扱いになっているので、それを数値に変えてあげる作業が必要です。

 で、パターン認識のプログラムは以下のようになります。
=====================================ここから
require 'nn'
require 'csvigo'
-- ####”luarocks install csvigo” でインストールしておいてください


-- CSVファイルのデータをロード
m=csvigo.load{path='NUMBERS.CSV',mode='large'}
print ("####### DATA LOAD! ######")

dataset={}

function dataset:size() return 10 end

-- 読み込んだデータをtorch.Tensorに直して学習出来るようにする。
for i=1,dataset:size() do
input =torch.Tensor(15)
output=torch.Tensor(10):zero()
input[1]=m[i][1]
input[2]=m[i][2]
input[3]=m[i][3]
input[4]=m[i][4]
input[5]=m[i][5]
input[6]=m[i][6]
input[7]=m[i][7]
input[8]=m[i][8]
input[9]=m[i][9]
input[10]=m[i][10]
input[11]=m[i][11]
input[12]=m[i][12]
input[13]=m[i][13]
input[14]=m[i][14]
input[15]=m[i][15]
a=m[i][16]
-- 10チャンネルの出力のうち、答えになるところを1に設定する
-- Torchの配列などは0スタートではなく、1がスタートになるので注意!
output[a+1]=1
dataset[i]={input,output}
print("###########",m[i][16])
print(input[1],input[2],input[3])
print(input[4],input[5],input[6])
print(input[7],input[8],input[9])
print(input[10],input[11],input[12])
print(input[13],input[14],input[15])
end
print ("####### DATASET! ######")

model=nn.Sequential();
model:add(nn.Linear(15,15))
model:add(nn.Tanh())
model:add(nn.Linear(15,30))
model:add(nn.Tanh())
model:add(nn.Linear(30,10))
-- 今回はソフトマックスも入れてみますが、これがなくともそれぞれの合計が1にならないだけで、順序そのものが入れ替わるなどの変化はありません
model:add(nn.SoftMax())
print ("####### MODEL SET OK! ######")

criterion = nn.MSECriterion()
trainer=nn.StochasticGradient(model,criterion)
trainer.learningRate=0.01
trainer.maxIteration=10000
print ("####### TARINER SET! ######")

trainer:train(dataset)


print ("####### LEARNING...DONE! ######")


-- 学習結果の検証
for i=1,dataset:size() do
input =torch.Tensor(15)
input[1]=m[i][1]
input[2]=m[i][2]
input[3]=m[i][3]
input[4]=m[i][4]
input[5]=m[i][5]
input[6]=m[i][6]
input[7]=m[i][7]
input[8]=m[i][8]
input[9]=m[i][9]
input[10]=m[i][10]
input[11]=m[i][11]
input[12]=m[i][12]
input[13]=m[i][13]
input[14]=m[i][14]
input[15]=m[i][15]

a=model:forward(input)

print ("#############CHECK!",i-1)
print (input:reshape(input,5,3),a)

end

=====================================ここまで

これをファイルに保存し、dofile 'ファイル名'で実行をすると…

Screenshot from 2017-01-16 19:27:59.png
それぞれのデータ(行列データ)を認識すると、それに応じて、0〜9の位置の数値が1に近い数値が返ってきます。
※今回のプログラムでは、答えになる部分を数字にしたため、9などの数字としてますが、これを
0,0,0,0,0,0,0,0,1というデータ形式に変えるのも面白いと思います。

 15個の数字の配置状況から、それに応じた答えを返す人工知能の完成です。

 ここまでくると、なんか面白い(不気味?)ですよね。
 IF文が全く存在しないのに、期待する答えが出てきてしまいます。
 プログラム主体ではなく、データ主体で動作が決まるので、これまでのプログラム作成になれている人には特に違和感を感じるかもしれません。

 (ちなみに…このプログラムにも落とし穴があって、データが1つがズレると、正しい答えが得られなくなってしまいます。それを解決する方法はまた次回以降でお話しします)


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:学問

torch7で白黒画像をカラー化してみる3(過学習) [人工知能(ディープラーニング)]

今、カラー化人工知能の構築でぶつかっている問題が「過学習」です。

なんとか人工知能モデルも改良し、良い感じになってきたと思ったんですが、そう簡単にはいきませんでした。

「過学習(オーバー・フィッティング)」とは、限られた学習用サンプルに人工知能が最適化されてしまい、学習していないサンプルを与えるとダメダメな結果になることです。

地獄のネコを生み出した人工知能モデルも、学習に使ったサンプルを白黒画像にして、それをカラー化してみると思いのほか良い結果を出してきます。

この画像をカラー化すると…
IMG_0634.JPG
こんな結果になります。
IMG_0630.JPG
枯れ木も枝の先が赤く着色されて、まるで花が咲いたみたいで、良い感じです。
(実際には花が咲かない街路樹です)
学習サンプルには花の画像などは含まれていないので、なぜ枝の先が赤くなるのかは謎です。

この何気ない駐輪場の風景などは
IMG_0635.JPG
びっくりする完成度です!
IMG_0631.JPG
最初にこの結果を見たときは、間違って白黒にする前のカラー画像(元画像)を見たんじゃないかと疑ったほどです。
それくらい、学習に使った画像はうまくカラー化出来るようになっています。
(聞いたところ、もしこの白黒画像を人間がカラー化しようとすると、物凄く手間がかかり、金額もかなりになるらしいです)

全部うまくいっているわけではなく、例えばこの画像は
IMG_0636.JPG
空のカラー化が不自然です。
IMG_0632.JPG

こんな感じで、学習に使ったサンプルは、実際にカラー化させてみると「それなり」、もしくは「予想以上」に良い結果になります。

その一方で、学習していない画像は、地獄のネコのようになったりしますし…
この学習サンプルとして使っていない画像(同じ場所の風景)などは、
IMG_0638.JPG
わけのわからない色に着色されてしまいます。
IMG_0637.JPG

人工知能モデルが複雑なのに、サンプル数が200以下と少ない事がどうも原因のようです。
(この場所にはイングレスのポータル奪取が目的で行ったため、そんなに撮影をしてませんでした)

過学習…なんとかしないといけません。



nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:学問

torch7で白黒画像をカラー化してみる2(途中経過報告) [人工知能(ディープラーニング)]

torch7を使って、白黒画像をカラー化出来る人工知能を作っているのは前にもお話ししましたが…

そう簡単にはいきません…

例えばこの、まだサハリンが樺太として日本領だった頃の豊原(ユジノサハリンスク)の写真ですが…
test0.jpg

これを自作のカラー化人工知能で処理してみると…
testout.jpg

 えーと、なんか空が妖しいです…
 ビルが緑です。

 まだ人工知能モデルの構築がうまくいってません。
 で、いろいろと画像処理をしている人に話を聞いたところ、おそらくは人工知能モデルが参考にする情報が足りていないんだろう、との事です。
 コンボリューション・レイヤーは工夫しつつ組み込んでいるんですが…

 白黒画像のカラー化は、いきなり買い物帰りの人からおつりを見せられて「手元に残ったおつりはこれだけなんだが、何を買ったか当ててみろ」と言われているようなもの、だそうです。
 早稲田大学の人工知能モデルでは、全体イメージ、中ぐらいの大きさのイメージ、細部のイメージを補助的な情報としてカラー化するための情報として利用しているのですが…確かに今のところ、私の人工知能は細部のイメージしか利用できていません、
 もっと何か、補助的な情報を組み込める事が出来れば精度はあがるはずなんですが…

 そんなことを考えながらぼーっとしていたら、人工知能が過学習していまい、変な色合いに着色するようになってしまいました。

元画像はこれですが…
IMG_0622.JPG

出来たのはこんな画像です。
KAGAKUSYU.jpg

前回では緑色のネコが、地獄のネコになってしまいました…



nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:学問

torch7で小さくディープラーニング(5)活性化関数の注意 [人工知能(ディープラーニング)]

今回は、「活性化関数」についての話です。

説明で使うのは、与えられた5つの数の中から、-1がどこにあるのかを見つける人工知能です。
前回は、入力5、出力5でしたが、今回は入力5、出力1です。
ちなみに、前回のプログラムを変更して学習させてみます。

=================================TYPE NG
require 'nn'

dataset={}

function dataset:size() return 100 end

for i=1,dataset:size() do
input=torch.Tensor(5)
for j=1,5 do
input[j]=torch.random(1,10)
end
x=torch.random(1,5)
input[x]=-1
output=torch.Tensor(1):zero()
output[1]=x
dataset[i]={input,output}
end

-- 人工知能モデルの設定
model=nn.Sequential();
model:add(nn.Linear(5,10))
model:add(nn.Tanh())
model:add(nn.Linear(10,1))
model:add(nn.Tanh())

criterion = nn.MSECriterion()
trainer=nn.StochasticGradient(model,criterion)
trainer.learningRate=0.01
trainer.maxIteration=1000
trainer:train(dataset)

-- torch.save('TEST.t7',model) 今回は使いませんのでコメントアウトします

-- ===================TEST
a=torch.Tensor(5)
for i=1,10 do
for j=1,5 do
a[j]=torch.random(1,10)
end
x=torch.random(1,5)
a[x]=-1

b=model:forward(a)

print("INPUT :"..a[1]..","..a[2]..","..a[3]..","..a[4]..","..a[5])
print("ANSWER:"..b[1])
print("------")

end
=================================

結果は、全く学習が進まずに、テスト結果もボロボロです。

TEST4NG.png

何が問題かというと、人工知能モデルの最後(出力の直前)にある活性化関数「Tanh」にあります。
活性化関数というのは、ぶっちゃけて言うと「入力値によってオン・オフされるスイッチ」です。
ただ、プログラムを作る人が任意でオン・オフするようなものではなく、「人工知能モデルが自分自身でオン・オフするためのもの」です。なので、これをいろいろなタイプのものに変更しても、なかなかプログラムを作った本人にはその変化の反応がダイレクトに伝わってこないもどかしさを感じたりもします。
で、このTanhですが、以下のような出力を返します。
IMG_0625.GIF
なんと、出力値が-1〜1です.
1以上の数値を与えても、1にしかなりません。
出力の直前にこれを入れてしまったために、答えが正しくならないのです。
では、もしこれを取り除いてしまったらどうなるでしょう…

=================================TYPE OK
require 'nn'


dataset={}

function dataset:size() return 100 end

for i=1,dataset:size() do
input=torch.Tensor(5)
for j=1,5 do
input[j]=torch.random(1,10)
end
x=torch.random(1,5)
input[x]=-1
output=torch.Tensor(1):zero()
output[1]=x
dataset[i]={input,output}
end

model=nn.Sequential();
model:add(nn.Linear(5,10))
model:add(nn.Tanh())
model:add(nn.Linear(10,1))
-- model:add(nn.Tanh()) コメントアウトします。

criterion = nn.MSECriterion()
trainer=nn.StochasticGradient(model,criterion)
trainer.learningRate=0.01
trainer.maxIteration=1000
trainer:train(dataset)

-- torch.save('TEST.t7',model)

-- ===================TEST
a=torch.Tensor(5)
for i=1,10 do
for j=1,5 do
a[j]=torch.random(1,10)
end
x=torch.random(1,5)
a[x]=-1

b=model:forward(a)

print("INPUT :"..a[1]..","..a[2]..","..a[3]..","..a[4]..","..a[5])
print("ANSWER:"..b[1])
print("------")

end
=================================
これだときちんと、その場所の数値(-1が左から1個目なら1,2個目なら2…)に近い値が返ってきます。

TEST4OK.png

「いくら正しい答えが返ってきても、なんか活性化関数がないのはイヤだな」と考える人がいるかもしれません。
実は、ここには「活性化関数がない」のではなく、「恒等関数(入力値をそのまま出力する)がある」とも考えられる事も出来ます。(なんか、とんち話でごまかされた気がするかもしれませんが…)

また、ここに入力値がプラスの時には、数値をそのまま出力する「ReLU」を使っても問題ありません。
人工知能モデルをこんな感じで変更します。
====================
model=nn.Sequential();
model:add(nn.Linear(5,10))
model:add(nn.Tanh())
model:add(nn.Linear(10,1))
-- model:add(nn.Tanh())
model:add(nn.ReLU())
====================
これでも問題なくこちらの意図するように動いてくれます。

TEST4OKReLU.png
※ただし、もし0以下のマイナスの出力値が欲しい場合に、出力の直前でReLUを組み込んだりすると、0にされてしまうので注意が必要です。

実は、以前は良くWEBで見られるサンプルには「Sigmoid(出力値は0〜1)」が使われていたり、WEBでは「TanhよりもSigmoidが性能が良い」という説明されていたので、意味もわからずに組み込んで、学習が進まなかったり、期待する出力が得られずにがっくりしていたのです。
活性化関数には、実は今回のような落とし穴があったりします。

まずは性能よりも、「出力値がどうなるか」が重要です。


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:学問

コンブ入りチョコレート [ロシア文化・日本文化]

IMG_2402.JPG
少し前になりますが、チョコレートをいただきました。
「с морской капустой тёмный шоколад」とありますが…
「昆布入りチョコレート」です。
IMG_2405.JPG
さすがに、粉末にされているのか、ペーストにされたのか、食べてみても食感としては「昆布」は判りませんでした。
味の方は、「あれ? 昆布っぽいかな?」という後味が微かにするぐらいで、何も言われないと気がつかないかもしれません。
日本のちょっと失敗した地元産品のお土産のような感じではなく、上品な味にまとめられています。

IMG_2403.JPG
このチョコレート、他にも「с морской солью」塩入り(シーソルト入り)もあります(右から3番目)。
どこかで見かけたときには、お土産に良いかもしれません!

で、なんというか、ロシアにあるお菓子が、探してみると、日本のご当地お土産のノリに近いものもあって、結構好きです。
ポテトチップス「行者ニンニク味(ネギ味)」とか…
ポテトチップス「イクラ味」とか…
ポテトチップス「カニ味」とか…
で、それがちゃんと一定のレベルを超えているのが面白いです。


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:学問

torch7で小さくディープラーニング(4)複数データからある数値をピックアップ [人工知能(ディープラーニング)]

今回は、5つの数のうちから-1になっているものを見つけるようにします。

==================================ここから

require 'nn'

dataset={}

function dataset:size() return 200 end
-- データセットを200個作ります
for i=1,dataset:size() do
input=torch.Tensor(5)
input[1]=torch.random(1,10)
input[2]=torch.random(1,10)
input[3]=torch.random(1,10)
input[4]=torch.random(1,10)
input[5]=torch.random(1,10)
-- 乱数でどこかを-1にして、同じ位置の出力は1にします。他は0
x=torch.random(1,5)
input[x]=-1
output=torch.Tensor(5):zero()
output[x]=1

dataset[i]={input,output}
end
-- 人工知能モデルの設定
model=nn.Sequential();
model:add(nn.Linear(5,6))
model:add(nn.Tanh())
model:add(nn.Linear(6,5))
model:add(nn.Tanh())


-- 学習用パラメーターの設定
criterion = nn.MSECriterion()
trainer=nn.StochasticGradient(model,criterion)
trainer.learningRate=0.01
trainer.maxIteration=100
trainer:train(dataset)

-- 学習済みデータをセーブしておきます。(今回はなくてもかまいません)
torch.save('TEST.t7',model)

-- 学習結果の確認
a=torch.Tensor(5)
for i=1,10 do
a[1]=torch.random(1,10)
a[2]=torch.random(1,10)
a[3]=torch.random(1,10)
a[4]=torch.random(1,10)
a[5]=torch.random(1,10)
x=torch.random(1,5)
a[x]=-1

b=model:forward(a)
-- 見やすいように、出力結局を十倍にして小数点以下きりすてます
b=torch.round(b*10)
print("INPUT :"..a[1]..","..a[2]..","..a[3]..","..a[4]..","..a[5])
print("ANSWER:"..b[1]..","..b[2]..","..b[3]..","..b[4]..","..b[5])
print("------")

end
==============================================
これで実行すると、ちゃんと-1の値と同じ位置の出力結局が9(限りなく10に近いのですが、小数点以下切り捨てのため9になってます)

STEST4.png

ちなみに、今回は5つの入力と同じ、出力も5つにしました。
これがもっとも簡単なパターンです。

もしこれを、出力のデータを1個にして、-1が1番目だったら1、5番目だったら5、というように出力させようとすると…かなり難しくなります。
(人工知能関係を解説しているサイトや、書籍でも説明が面倒なのか、当たり前すぎる事なのか、意外と説明はありません)

それを説明しますので、次回はちょっとだけ難しくなります…


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:学問

torch7で白黒画像をカラーにする [人工知能(ディープラーニング)]

人工知能torch7で、ちょっと白黒画像をカラー化する人工知能を自作してみました。

IMG_0623.JPG
このネコと山々の写っている画像ですが、これは人工知能を使ってカラー化したものです。

元画像はこれです。
IMG_0622.JPG
カラー化した画像と元画像を比べると、かなり色は薄いですし、ネコの額には緑色がついてますし…解決すべき課題は多いのですが、せっかくカラー化人工知能を自作したのでちょっとだけ報告します。
(1)torch7を動かしているのは、NVIDIAの評価用ワンボードPC「JETSON TK1」
 ※とにかく安くGPU(CUDA)を使ってみたかったため。
(2)使った人工知能フレームワークはtorch7、人工知能モデルはまったくのオリジナル。
 ※特別なライブラリは全く使っていません
(3)人工知能の学習に要した時間は2時間
(4)学習に使った静止画は自宅の近所にある公園でデジカメで撮影した20枚を加工して出来た40枚

 機材もデータも、たいしたものではないのですが、意外と何とかそれっぽく出来て、実は自分自身がいちばん驚いていたりします。

 ちなみに、最初にテストした結果はこんな感じです。
IMG_0624.JPG
 ネコが緑です。

 今後も改良していきますので、見捨てないでください…
 (人工知能モデルを改良中です)

 念のため繰り返しますが、どこかの大学とかで公開した学習済みデータなどは全く、これっぽちも使っていません。
 すべて私のオリジナルです。
 torchは個人レベルでもこんなことが出来るんです。

(改良後のお話へ続く)

 
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

  • 作者: 斎藤 康毅
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2016/09/24
  • メディア: 単行本(ソフトカバー)


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:学問

torch7で小さくディープラーニング(3)学習済みデータを使う [人工知能(ディープラーニング)]

前回のプログラムでは、学習済みデータをセーブしました。

今度はそれを使ったプログラムです。

ファイル名は便宜的にT3handan.luaとします。

====T3handan.lua========ここから

require 'nn'
-- 引数をaとbに代入、引数がない場合は0と1にする
a=arg[1] or 0
b=arg[2] or 1

model=torch.load('TEST.t7')
x=torch.Tensor(2)
x[1]=a
x[2]=b
as=model:forward(x)
print("INPUT :",x[1],",",x[2])
print("ANSWER:",as[1])
print("------")

=================ここまで

torchの引数として、ファイル名と引数を二つ与えて実行させます。

th T3handan.lua 2 1
という感じです。

t3handan.png

するとこんな感じで結果が返ってきます。
学習済みデータを利用するのはとても簡単です。

早稲田大学のカラー化人工知能は、実はこのプログラムのように、学習済み人工知能モデルで処理をしています。
便利です。
すごく便利です。
でも、なんか物足りない気がする人もいるでしょう。
やはり、人工知能モデルの学習も醍醐味の一つですし。

(人工知能について話を聞けた人の中には「人工知能モデルの学習ノウハウを持っている事は大きなアドバンテージなので、学習済みデータは公開しても、学習ノウハウの公開は考えていない」という方も居たくらいです)

 そこまでいかなくとも、人工知能モデルの構築はどんなパズルよりもエキサイティングだと思います…難しいけど面白いです。

 そんな訳でこれからは、人工知能モデルの構築と、そこに潜む落とし穴について見ていきましょう!

 いゃぁ、人工知能は魔物です…
 時には柔順に振る舞いますが、ある時は牙を剥いて飛び掛かってきます…
 怖いけど、魅力もあります。


ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

  • 作者: 斎藤 康毅
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2016/09/24
  • メディア: 単行本(ソフトカバー)



nice!(1)  コメント(0)  トラックバック(0) 
共通テーマ:学問

torch7で小さくディープラーニング(2) [人工知能(ディープラーニング)]

さて、前回はふたつの数値を入力すると、答えとしてふたつの数値が出力されるというものでした。
今度は、ふたつの数値を入力して、出力されるのはひとつの数値、というように変えてみます。
これもテキストファイルに保存して、thorchを起動、dofile '保存したファイル名'で実行させます。


------------------ここから
require 'nn'

dataset={}

function dataset:size() return 200 end

for i=1,dataset:size() do
input=torch.randn(2)
input[1]=torch.random(0,10)
input[2]=torch.random(0,10)
output=torch.Tensor(1):zero()
if (input[1] > input[2]) then
output[1]=-1
end
if (input[1] < input[2]) then
output[1]=1
end
-- データセットは入力2、出力1
dataset[i]={input,output}

end


-- 人工知能モデルも入力2、出力1、データセットと合わせます。
model=nn.Sequential();
model:add(nn.Linear(2,5))
model:add(nn.Tanh())
model:add(nn.Linear(5,1))
model:add(nn.Tanh())

criterion = nn.MSECriterion()
trainer=nn.StochasticGradient(model,criterion)
trainer.learningRate=0.01
trainer.maxIteration=200
trainer:train(dataset)
-- 学習済みデータの単独利用のために保存しておく
torch.save('TEST.t7',model)

x=torch.Tensor(2)
for i=1,10 do
x[1]=torch.random(1,10)
x[2]=torch.random(1,10)
a=model:forward(x)
print("INPUT :",x[1],",",x[2])
print("ANSWER:",a[1])
print("------")
end

------------------ここまで

プログラム中に
trainer.maxIteration=200
とありますが、これを
trainer.maxIteration=10000
とかに設定すれば学習を200回から10000回にすることができます。

さて結果ですが…
右側の数値が大きいときには答えはほぼ「1」、
左側の数値が大きいときには答えはほぼ「-1」、
両方が同じときには、「0」に近い答えが返ってきます。
これはこれで面白いですよね!
TEST3kekka.png
ちなみに、今回の人工知能モデルのニューラルネットワークは、なぜ2層でノードが5個なのかというと…最初は適当に20個ぐらいのノードで、3層くらいでやってみたのですが、扱う数値も大きくないし、複雑な処理でもないので減らしていったら、これぐらいでも大丈夫だったため…というのが真相です。
「なんだよ、もっと数学的に計算してノードや層の数を割り出すんじゃないのかよ」と思った人もいるでしょう。
 たしかに理由が「いきあたりばったり」だと言われるとモヤモヤしてなんかきもちわるいですよね。
 実は私なりに、いろいろと詳しい人とか、実際に研究している人にそれを尋ねたのですが…
 ノードや層の数の決定は「正直、やってみないと判らない」そうです。
 扱うデータの数や、その数値の大きさ、使われている関数など様々な影響を受けるので、一概にこれだとは言えないそうです。

 それでも自分なりにテストして判った事は、ノードや層の数が少な過ぎると学習はまったく進みませんし、やたら増やしても時間がかかるだけで効率が悪いので、よく使うデータセットの規模に合わせて、自分なりの目安を探しておくのが良いようです。

あと、このプログラムの中に、
torch.save('TEST.t7',model)
と、学習済みデータの保存をしている部分があるんですが…これは学習済みデータを使ったプログラムの利用を想定しています。
次回はいよいよ、学習済みデータを使ったプログラムの作成です。



ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

  • 作者: 斎藤 康毅
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2016/09/24
  • メディア: 単行本(ソフトカバー)


torch7で小さくディープラーニング(1) [人工知能(ディープラーニング)]

まずは自力でディープラーニングをやってみます。

プログラムは以下のとおりです。

エディタなどで、打ち込んで、ファイルを保存、
torchを起動してから、dofile 'ファイル名'で実行させます。

Torch7start.png
【torch7の起動画面】

はじめに、学習用のデータを200個ほど作り、
そのあとでニューラル・ネットワークを定義、
学習用のパラメーターを設定して学習開始、
最後に学習できたか、検証します。

======================ここから


require 'nn'
dataset={}
-- ここでイレギュラーな設定しています(ここでデータを200個使うようにしています)
function dataset:size() return 200 end

for i=1,200 do
input=torch.randn(2)
input[1]=torch.random(0,10)
input[2]=torch.random(0,10)
output=torch.Tensor(2):zero()
if (input[1] > input[2]) then
output[1]=1
end
if (input[1] < input[2]) then
output[2]=1
end
dataset[i]={input,output}
end

-- 人工知能モデルの定義
model=nn.Sequential();
model:add(nn.Linear(2,5))
model:add(nn.Tanh())
model:add(nn.Linear(5,2))
model:add(nn.Tanh())

-- パラメーター
criterion = nn.MSECriterion()
trainer=nn.StochasticGradient(model,criterion)
trainer.learningRate=0.01
trainer.maxIteration=200
-- 学習開始(200回)
trainer:train(dataset)

-- 学習結果の検証
x=torch.Tensor(2)
for i=1,10 do
x[1]=torch.random(1,10)
x[2]=torch.random(1,10)
a=model:forward(x)
print("INPUT :",x[1],",",x[2])
print("ANSWER:",a[1],"|",a[2])
print("------")
end
======================ここまで

このプログラムで、数字をふたつtorch.Tensorで与えると大きな数字の方に1に近い数値を表示します。


test2kekka.png

学習用のデータセット作成をこのプログラム内で行っているため、そこにはif文がありますが、データセット作成以降は、直接ふたつの数字を比較してそれに反応するプログラムがないのが判ると思います。
人工知能モデルが、与えられたデータから(input)と(output)の関係を学習をしたのです。
このプログラムの中心部はここです。

-- 人工知能モデルの定義
model=nn.Sequential();
model:add(nn.Linear(2,5))
model:add(nn.Tanh())
model:add(nn.Linear(5,2))
model:add(nn.Tanh())

-- パラメーター
criterion = nn.MSECriterion()
trainer=nn.StochasticGradient(model,criterion)
trainer.learningRate=0.01
trainer.maxIteration=200
-- 学習開始(200回)
trainer:train(dataset)

これで人工知能モデルを作り、学習方法や学習用パラメーターを決めて学習を開始しています。

他にも、別の「入力データ2個と、出てくる答え2個のサンプル」を与えて学習させれば、それに応じた反応を返してくれます。
(望む内容によっては人工知能モデルの変更は必要になりますが)

…プログラム組んでないのに…答えが出てくる…
あれ? 俺、いらなくない? とか思いました…
(数日後そんなに簡単な事ではないと気がつくのですが…)

とはいえ、はじめてこの結果を見たときは、なんというか物凄い不気味さを感じました。
プログラムを組んでいないのに望んだ答えが出てくる…頭ではなんとか理解しようと思うのですが、自分の足下に妖怪というか、スライムが生まれた、というかそんな変な感覚に襲われました。
感情はないし、複雑な事は出来ないけど、データから答えを出す方法を学びやがった存在がいる。
これは衝撃でした。
この違和感は数日間抜けませんでした。

ぜひともこの感覚を味わって欲しいです!

いろいろな大学が公開している実験セットでは完璧過ぎて味わえない、不思議な感覚です…

次回は、このプログラムを変更してみます!


torch7と直接関係はないのですが、基本的なことがとても判りやすく解説されているのでお勧めの本です。

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

  • 作者: 斎藤 康毅
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2016/09/24
  • メディア: 単行本(ソフトカバー)



前の10件 | -