【Deep Learning】NNの重みの傾向(差分とヒストグラム)
はじめに
前にNNの重みに関する見解を書きました。
そこでは、以下のようにまとめていました。
学習による割り当てられる重みの初期値の差異は大きく、
繰り返し学習による重みの変化は小さいことが分かった。これらから、NNモデルの学習では重みの初期値が重要になることが分かる。
今回は、MNISTを使用し、
重みの初期値と学習終了時の差分と
学習終了時の重みのヒストグラムを求めて
NNの重みの傾向を探っていきます!
学習モデル
今回はMNISTを使用し、以下のモデルで学習しました。
#MNISTの取得方法はこちら
self.model = FunctionSet( l1 = L.Linear(784,1000), l2 = L.Linear(1000,1000), l3 = L.Linear(1000,10), )
まとめ
今回はMNISTによるNNの重みについて調査しました。
結果として、重み(l3)が最も初期値から学習終了までに変化する量が多くなりました。
これは、l3は1000次元から10次元に大きく減少している、
かつ、誤差量の影響が大きいためでしょうか。
また、重みのヒストグラムを見るとどれも同じような傾向になりました。
重み0に近くなるにつれて割合が多くなるのは興味深いですね。
【Deep Learning】fetch_mldataでmnistのデータを取得できない場合の対処(Chainerの場合)
はじめに
mnistを使った実験を行いたい場合、
これまでは「fetch_mldata」でmnistのデータを取得していましたが、
どうやら取得できなくなっている模様です。
#Irisは取得できています。
そこで、fetch_mldataではなく
Chainerにあるmnistを取得する関数を使おうとしました。
ところが、データ形式がfetch_mldataとは異なっていて困った。
なんとかfetch_mldataの形式に合わせる処理を作ったので紹介します。
fetch_mldataの場合
mnist = fetch_mldata('MNIST original', data_home=".") # mnist.data : 70,000件の28x28=784次元ベクトルデータ mnist.data = mnist.data.astype(np.float32) mnist.data /= 255 # 正規化 # mnist.target : 正解データ mnist.target = mnist.target.astype(np.int32) # 学習用データN個,検証用データを残りの個数に設定 N = 60000 xtrain, xtest = np.split(mnist.data, [N]) ytrain, yans = np.split(mnist.target, [N])
Chainerでmnistを取得しfetch_mldataの形式に変換
各変数がfetch_mldataと対応しています。
train, test = chainer.datasets.get_mnist() train = np.array(train) test = np.array(test) xtrain = [] ytrain = [] for data, label in train: xtrain.append(data) label_list = np.zeros(10) label_list[label] = 1.0 ytrain.append(label_list) xtrain = np.array(xtrain).astype(np.float32) ytrain = np.array(ytrain).astype(np.float32) xtest = [] yans = [] for data, label in test: xtest.append(data) yans.append(label) xtest = np.array(xtest).astype(np.float32) yans = np.array(yans)
以上!
【人工知能】うどん工場にもAIが!?
製麺業の川田製麺(高松市、川田明義社長)は、高松東ファクトリーパーク内の自社工場(さぬき市)に人工知能(AI)機能を搭載した検知器やIoT(モノのインターネット)技術を今秋に導入する。
うどん工場に人工知能 川田製麺 不良品検知、学習で進化 今秋導入 | うどん関連ニュース | 讃岐うどん遍路 | 四国新聞社
X線の画像を使用して包装の不良品を検知するとのこと。
気になるのは、検知精度ですね。
X線の画像なので、可視光に比べると検知しやすいとは思いますが、
果たしてどれほどの精度があるのでしょうか?
また、記事の中に、
使用回数が増えるごとに“進化”して検知の精度が向上する
とありますが、どうやって進化するのでしょうか。
導入している人工知能の出力をそのまま使用している場合、
人工知能が一度間違った出力してしまうと真実とは間違った方向にどんどんずれていくように思うのですが。
#正解を人が教えている?
どういうアルゴリズムなのか気になりますね。
【IT】コンビニの全商品に電子タグが!
【Rails】Ruby on Rails始めました
はじめに
現在のITサービスにおいて、
Webサービスは切っても切れないものになっています。
そんな中で事業を作っていく身としてはWebサービスはできませんでは話になりません。
ということで、Webアプリの開発が容易だという「Ruby on Rails」の勉強を始めました。
今回やったことは以下の2点になります。
- 環境構築
- 簡単なRailsアプリの作成
#環境はMac OSです。
環境構築
私は以下のサイトを参考にしました。
最初は他のサイトを参考にしていましたが途中うまくいかず、
以下のサイトに行き着きました。
【El Capitan】Mac OSX 10.11 El Capitan にRuby + Rails4 開発環境の構築 【初心者必見】 - Qiita
簡単なRailsアプリの作成
環境構築まで完了した後、以下のサイトを参考に簡単なRailsアプリを作成しました。
タイトルにあるように、「小学生でもわかる」ということで
どんなものかと思い選んでみたところ、
とてもわかりやすかったです。
小学生でもわかるRuby on Rails入門 | OpenBook
ただ、ITリテラシーが低い方にとってはちょっと難しいかなと思います。(^_^;
ただ、行き詰まった際には関連するサイトを探して解決していけば問題ないかと思います。
最後に
今回はRuby on Railsの環境構築と簡単なRailsアプリの作成を行いました。
感想としては、「これは便利!!」の一言です。
というのも、画面と処理とDBが同じ環境内に収まっているので、
そういった各モジュールとの連携で悩む必要がありません。
【Deep Learning】NNの重みは学習の度に異なり、初期値から大きく変化しない
はじめに
NNを学習する際に
まずは各重みに初期値が割り当てられる。
そして、NNの学習はこの初期値の重みを変えながら進んでいくことになる。
つまり、初期値が大事になる。
そこで、今回は
- 初期値が学習のたびにどれだけ異なるのか
- 繰り返し学習によってどれほど初期値が変化するのか
について評価する。
また、今回は評価するために重みを色で表現した。
例:
左の〇4つが入力層、真ん中の〇6つが中間層、右の〇3つが出力層となっている。
重みは各〇をつないでいる線の色で表す。
より赤ければ重みが大きく、黒ければ小さい。
初期値が学習のたびにどれだけ異なるのか
下の画像が各学習での初期値になる。
ぱっと見はわかりにくいが、よく見ると結構異なっている。
繰り返し学習によってどれほど初期値が変化するのか
以下に初期値と繰り返し学習回数を5,000回行ったときの画像を列挙した。
大きな変化がないことが分かる。
学習①
学習②
学習③
学習④
学習①の重みの移り変わりの動画
youtu.be
まとめ
今回は学習するNNモデルの重みについて、について、
学習による割り当てられる重みの初期値の差異と
繰り返し学習による重み変化を評価した。
結果として、
学習による割り当てられる重みの初期値の差異は大きく、
繰り返し学習による重みの変化は小さいことが分かった。
これらから、NNモデルの学習では重みの初期値が重要になることが分かる。
よって、
構築した学習モデルの評価を行う際は、
構築した学習モデルに対して学習を複数回行い、
各学習モデルの平均等を出すべきである。
【Deep Learning】Chainerを使ったニューラルネットワークを再勉強
はじめに
これから私が事業を考えていくうえで欠かせない技術が
Deep Learningをはじめとした機械学習です。
これまでは画像認識の分野でCNNを用いた画像の識別を勉強してきましたが、
CNNではなくRNNのほうが、私が考えている事業で利用することになります。
そこで、RNNを理解するにあたって、
Deep Learningを改めて勉強していこうという考えに至っています。
#フレームワークとしてChainerを使用しています。
qstairs.hatenablog.com
処理
今回はscikit-learnを使ってIris(アヤメ)データをダウンロードし、
ニューラルネットワークを構築して学習・評価します。
Iris(アヤメ)データは、
花びらの長さ、幅、がく片の長さ、幅の4次元データに対して、
アヤメの種類であるsetosa(0),versicolor(1),virginica(2)の3種類が割り当てられています。
データは全部で150個あり、
今回は学習に半分、評価に半分使用しています。
#!/usr/bin/env python # -*- coding: utf-8 -*- from chainer import cuda, Function, FunctionSet, gradient_check, Variable, optimizers, serializers from chainer.training import extensions import chainer.functions as F import chainer.links as L from sklearn import datasets import numpy as np import os class IrisChain(): cuda.get_device(0).use() def __init__(self): self.model = FunctionSet( l1 = L.Linear(4,6), l2 = L.Linear(6,3), ).to_gpu() def __call__(self, x, y, train=True): h1 = F.sigmoid(self.model.l1(x)) h2 = self.model.l2(h1) if train == True: return F.mean_squared_error(h2, y) else: return h2 cuda.get_device(0).use() # iris=[花びらの長さ、幅、がく片の長さ、幅]→[setosa(0),versicolor(1),virginica(2)] # データ数:150個 iris = datasets.load_iris() X = iris.data.astype(np.float32) Y = iris.target N = Y.size Y2 = np.zeros(3 * N).reshape(N, 3).astype(np.float32) for i in range(N): Y2[i, Y[i]] = 1.0 index = np.arange(N) # 奇数番目のデータを学習データにする xtrain = X[index[index % 2 != 0],:] ytrain = Y2[index[index % 2 != 0],:] # 偶数番目のデータを学習データにする xtest = X[index[index % 2 == 0],:] yans = Y[index[index % 2 == 0]] print N model = IrisChain() optimizer = optimizers.SGD() optimizer.setup(model.model) f = open("loss.csv","w") for i in range(50000): x = Variable(cuda.to_gpu(xtrain)) y = Variable(cuda.to_gpu(ytrain)) model.model.zerograds() loss = model(x,y) loss.backward() optimizer.update() print "%d: %f"%(i, loss.data) f.write("%d,%f\n"%(i, loss.data)) f.close() xt = Variable(cuda.to_gpu(xtest), volatile='on') yt = yans result = model(xt, yt, train=False) nrow, ncol = result.data.shape print nrow correct = 0 for j in range(nrow): c = np.argmax(result.data[j,:]) if c == yans[j]: correct += 1 print "%d / %d = %f"%(correct, nrow, float(correct)/float(nrow))
結果
繰り返し学習回数を50,000回で学習し、
そのときの損失の傾向をグラフにしました。
0.019あたりで収束しているようです。
また、正解率は、96%となっています。
72 / 75 = 0.960000
最後に
基本のキホン的な感じでニューラルネットワークを構築し、
実際に学習して評価しました。
これから、さらに複雑な処理を勉強していきます。
こちらの書籍を参考にしています。
www.amazon.co.jp