SSブログ

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



人工知能もはじめます [人工知能(ディープラーニング)]

ずいぶん長いこと更新が遅れてしまいました。

この間、何をしていたかというと、今流行りの人工知能を使ってみたくてもがいていました。

しかも…最初の数カ月間はろくな成果もなく、ネットの記事を読んでもチンプンカンプンでした。

いきなりテンソルとかベクトルとか、内積とか言われたってこちとらチンプンカンプンです。
むしろ、わざとイジワルして難しく表現しているのではないか、と思ったほどです。
そうじゃなくとも、ある解説書とかでは、難しいところは端折って説明しやすいところだけ説明しているんじゃないのか?とか思いました…。
 
 やっとやさしい表現で解説しているサイトを見つけたと思ったら、結局は文字認識の実験プログラムを紹介して終わっているとか…
 あとは人工知能を使ったビジネスモデルの話ばっかりで…
 なんだこの状況は…と混乱するばっかりです。

 じゃあ、基礎から入るかと気持ちを切り替えて、解説書を手にしてみたら…
 いきなり線形代数の話をされたって判りません…
 確かに線形代数の話も大切だけど…そうじゃない、そうじゃないんだよ…
 
 まずは、どんなものなのかを感覚的に判るようにしよう、と。
 得意気に線形代数の話をする人はこのさい脇に置いといて、もう少しだけ判るようにしようと思います。

 それと、せっかくなんで、自分でも体験してみましょうよ!
 どっかの大学が公開している実験セットを動かして、「ああ、俺にはこんなの作れないよ」と内心でしょぼくれて終わらないようにしましょう。

 なので、(行列とかは高校でしか習っていない)私が、自分自身で、よく判らないながらも人工知能を作れるようになるまでを報告していこうと思います。

 目標は、「画像処理が出来る人工知能を作る」です。
IMG_0617.JPG
【この画像は雰囲気です。これを作るわけではありません】
 テキスト処理とかしません。
 あとどこかの大学が公開しているような実験セットは、よっぽどの事がない限り使いません。
 実験セットを動かしたところで、おもちゃのブロックを買ってもらったのに、そのおもちゃでかっこいい家を組み立てたのは親戚のおじさんで、「へー、こんなのも出来るんだ」で終わるのはもったいないです。
 なのでなんとか簡単なプログラム(人工知能?)を作ってみて、どんな動きをするのか、やってみたいと思います。

 また、使う人工知能フレームワークは「torch7」です。
 caffeとかchainerとかじゃありません。
 はっきりいって、日本国内ではいろいろな情報がろくに集まらない人工知能フレームワークですが、ちょっとガンバって英語で検索していくと、意外にもなんとか答えが見つかります。
 それと何でtorch7か…早稲田大学の石川研究室が白黒画像をカラー化できる人工知能を作ったのがtorch7です。それで、カラー化プログラムは物凄い複雑な処理をしていると思って見てみたら…たった数十行で動いていたんです。
 なんなのこれ? 物凄い複雑な処理をしてると思ったら、関数を呼び出してポン、みたいな感じで処理してます。このtorch7って絶対にすごいと思って、選びました…
 使ってみると、人工知能モデルの構築や変更がとても簡単で、試行錯誤を繰り返しても手間が最小限で済みます。

 ただ…MACかlinuxでないとtorch7は動きません。
 windowsに仮想環境を構築しても、学習済み人工知能モデルを使った処理は出来ますが、ちょっと複雑なディープラーニングは処理速度が遅くてすぐに限界が来ます。ここはまぁおいおいなんとかしていきましょう。

 また、環境構築に関することは基本的に触れません。
 何でかというと、とにかくあちこちに落とし穴があって、ネットの情報がろくに信用できないのです。
 人工知能フレームワークのインストール、pathの設定、CUDAの導入、ひとつふたつ解説したところであっという間に情報が古くなります。
 なので、なんとか自力でtorch7のインストールまでは行ってください。(まずはCPUだけで動けばいいので)
 悩んでこのtorch7が動くようにした経験は、必ず後で役に立ちますので!

 では、はじめます。


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

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

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


この本は画像処理に付いて詳しく説明しています。
特にプログラムを組めるけど、人工知能フレームワークはいまいち判らないという人にお勧めします。
「青い解説書」よりも説明に使う数式は最小限、python3を使っての解説も判りやすくなっています。



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

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。