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

torch7:CSVでファイル保存 [人工知能(ディープラーニング)]

データをファイルとして保存するときにいろいろと方法はあるのですが、CSVファイルとして保存するのは意外と面倒だったりします。

 例えば、以下のような単純な10x10の二次元配列をファイルとして保存するだけでも結構面倒です。
--------------------------------------
1 6 8 2 1 7 4 4 9 7
6 9 7 3 8 9 0 9 8 0
8 2 4 6 2 7 8 4 7 7
7 6 9 1 7 2 3 8 1 9
2 4 6 7 5 5 1 5 6 6
8 9 2 3 6 1 7 8 5 0
0 3 4 5 7 4 2 0 8 6
9 6 5 1 3 8 5 9 3 8
0 9 8 9 5 4 5 8 4 2
1 3 5 3 2 1 7 7 4 2
[torch.DoubleTensor of size 10x10]
--------------------------------------

 こんな時は、以前の「パターン認識」でも紹介したcsvigoを使えば簡単です。

(今回はコマンドラインで直接動かしていますが、プログラムとしてファイルに保存しても動作はできます)

基本的にはこれだけです。

require 'csvigo'
a=torch.Tensor(10,10):random(0,9)
b=torch.totable(a)
csvigo.save{data=b,path='test.csv'}

解説すると…
-- csvigoライブラリーを読み込む
require 'csvigo'
-- 10x10の数値(Tensor)を乱数で作る
a=torch.Tensor(10,10):random(0,9)
-- torch.Tensor形式のaを、テーブル形式でbにセットする
b=torch.totable(a)
-- csvigo.saveを使って、ファイルとしてむ保存
-- 「data=」に続いてテーブルの変数、「path='ファイル名'」をつけます
-- カッコ()ではなく、{ }を使ってください。
csvigo.save{data=b,path='test.csv'}

たったこれだけです。
これでCSVファイルとして保存できます。
ただし、ここで注意するポイントがあります。

単純に
1
8
5
6
7
4
1
3
6
8

のようにファイルを出力したい場合、Tensorは
th> a
1
8
5
6
7
4
1
3
6
8
[torch.DoubleTensor of size 10]と単純な10個の配列を元にして、保存用テーブルのデータを作ってcsvigoライブラリで保存しようとしてもエラーになってしまいます。

具体的にはテーブルの変数 b
{
1 : 1
2 : 8
3 : 5
4 : 6
5 : 7
6 : 4
7 : 1
8 : 3
9 : 6
10 : 8
}
*このデータをcsvigoで保存しようするとエラーになります。

このような場合には、
-- まずは10個の配列を 1x10に直して
a=a:repeatTensor(a,1,1)
-- それを10x1に「t()」で行と列を入れ替えた配列に直して
a=a:t()
-- テーブル形式に変換します
a=torch.totable(a)
という感じで、10x1の配列(テンソル)としてデータに直して、それをテーブルに変換する必要があります。(もっとスマートな方法があるかもしれません)

th> a
9
6
9
8
7
9
1
4
1
8
[torch.DoubleTensor of size 10x1]

 これが最終的には…
th> b
{
1 :
{
1 : 9
}
2 :
{
1 : 6
}
3 :
{
1 : 9
}
4 :
{
1 : 8
}
5 :
{
1 : 7
}
6 :
{
1 : 9
}
7 :
{
1 : 1
}
8 :
{
1 : 4
}
9 :
{
1 : 1
}
10 :
{
1 : 8
}
}
こんな形になります。
これであれば縦に数字が並んだCSVファイルが作成できます。
th> csvigo.save{path='ttt.csv',data=b}
<csv> writing to file: ttt.csv
<csv> writing done
これでもうCSVファイルでの保存ができるのでいろいろと利用範囲が広がります。

スクリーンショット 2017-02-12 1.49.26.png
(CSVでの保存例)

torch7のバリエーションcl-torchはおススメできません [人工知能(ディープラーニング)]

torch7のバリエーションには、open-clで処理をGPUに割り当てるものもあります。
cl-torchとか、distro-clとか呼ばれているものですが…オススメできません。

スクリーンショット 2017-02-10 23.20.12.png
(プログラムのライブラリにclnnやcltorchが含まれているcl-torch動作版のプログラム)


導入してみたのですが…すごく遅いのです。
MacBook Pro (15インチ, 2016)、GPUにRadeon Pro 460を搭載しているモデルでも、下手にOpen-CLなど使わずにCPUで処理した方が早かったほどです。

最初はCPUのパワーを使わずに動いていて、「お、これはいけるか?」と喜んだのですが…
JETSON TK1の5倍もの時間がかかります。(JETSON TK1(CUDA動作)で40秒で終わる処理が、cl-Torchでは200秒以上かかります)

まさかと思って、CPUで動作させると、同じ処理に40秒…しかかかりませんでした。
しかも、別のLINUXのTorch7で作成した人工知能データを読み込ませると、エラーで動作しないというおまけつきです。
発想は良かったのですが…中身が付いてきてませんでした。

CUDAが使えないパソコンの救世主に見えて、実は見掛け倒しという悲しい運命を背負ってしまったようです。

さっそく、cl-Torchは、コマンドラインからさっくり「rm -rf cl-torch」で削除して、通常版のtorch7をインストールしました。
それにしても、2016年のMACBOOK PROはCPU動作でもJETSON TK1のCUDA動作に負けない性能になっていたんですね。
2012年モデルのMAC MINIはTK1にかなり大差で負けてしまうのですが。
(3万円のJETSON TK1が大健闘していると言えるかもしれません)

 結論としては、cl-torchはお勧めできません。
 なにせ、正式なtorch7で作成した人工知能モデルがエラーで動かないのは致命的です。

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つがズレると、正しい答えが得られなくなってしまいます。それを解決する方法はまた次回以降でお話しします)


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以下と少ない事がどうも原因のようです。
(この場所にはイングレスのポータル奪取が目的で行ったため、そんなに撮影をしてませんでした)

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



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

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

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

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

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

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

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

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

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

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

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

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



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が性能が良い」という説明されていたので、意味もわからずに組み込んで、学習が進まなかったり、期待する出力が得られずにがっくりしていたのです。
活性化関数には、実は今回のような落とし穴があったりします。

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


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

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

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

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


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、というように出力させようとすると…かなり難しくなります。
(人工知能関係を解説しているサイトや、書籍でも説明が面倒なのか、当たり前すぎる事なのか、意外と説明はありません)

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


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
  • メディア: 単行本(ソフトカバー)


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
  • メディア: 単行本(ソフトカバー)



前の10件 | -