2016年05月21日

Binarized Neural Networksの勉強





二値しか値を取らないと言う事で神経回路的と言うよりは、完全に半導体的なネットワークなはずですが、
しかしながら、どうも、実際はそうでも無いようなのですが...?

Binarized Neural Networks: Training Deep Neural Networks with Weights and Activations Constrained to +1 or -1
Matthieu Courbariaux, Universite de Montreal
Itay Hubara,Ran El-Yaniv, Technion - Israel Institute of Technology
Daniel Soudry, Columbia University
Yoshua Bengio CIFAR Senior Fellow
arXiv preprint arXiv:1602.02830 (2016)
1.2. Gradient Computation and Accumulation
Although our BNN training method uses binary weights and activation to compute the parameters gradients, the real-valued gradients of the weights are accumulated in real-valued variables, as per Algorithm 1.
学習方法では、パラメータ勾配を計算するために2値のweights と activationを利用しているが
実際の勾配値はアルゴリズム1に従って、実数値に溜められる


岡野原さんのコードでは、
BNN1

l1 = n_in×n_units
b1 = n_units 
l2 = n_units×n_units
b2 = n_units 
l3 = n_units×n_out
b2 = n_out 
こういう形 で、
出力はこうやって決定している
h1 = bst.bst(self.b1(self.l1(x), test=not self.train))
h2 = bst.bst(self.b2(self.l2(h1), test=not self.train))
return self.b3(self.l3(h2), test=not self.train)
ところで、b1,b2とはbiasなのかと最初思ったんですが、
biasはl1,l2,l3内に値を持っていて違います。

l1(x)の出力は、 x とl1.W の積に l1.b を足した値 行列の積和がそのまま出力となっている
通常のニューラルネットワークと同じ
BNN2


b1,b2は、BatchNormalizationで、これらは正則化関数で、
l1(x)の出力一回ごとの値を正規化する関数

bst.bst() は、self.b1 の出力を、{-1,1}に二値化する。

実際は、入力self.b2(self.l2(h1))の段階で、 ほぼ二値化されてるような値になってますが
これで、h1,h2 は二値化した値になります。

なんで、b3 は bst.bst を通さないのかがわかりませんが...
続きを読む

2016年05月20日

chainerでcsvデータを読み込んで機械学習

UCIデータセット などの形式のデータセットを読み込みして学習させたいと思うんですが、chainerにはそんなサンプルはありませんでした

DeepLearningだ!と意気込んだものの手書き数字認識の後に続かなくなった時に読むデータそのものの話

このソースコードでは上手くいかないことがありました。
私が実行が確認できたコードは
import pandas as pd

csvdata = pd.read_csv('data.csv')
C=10 #クラスラベルの列番号
x, y = np.split( csvdata , [C], axis=1)
y = np.array(y , dtype=np.int32) #整数値

y_data = []
for row in y:
  y_data.append( row[0] )

もっとスマートな方法があると思います
N = 10000 # 何でも良い
x_train, x_test = np.split(x , [N])
y_train, y_test = np.split(y_data , [N])

x_train = np.array(x_train , dtype=np.float32)
y_train = np.array(y_train , dtype=np.int32)
x_test = np.array(x_test , dtype=np.float32)
y_test = np.array(y_test , dtype=np.int32)

型が無かったり配列になって無かったりしていました。
以下はtrain_mnist.pyと同じ


あとはネットワークの入力、出力サイズを、x,yと同じにしなければいけませんが
model = L.Classifier(net.MnistMLP( input , n_units, out ))









続きを読む

2016年05月19日

pythonで形態素解析の実装

インストールが簡単な方はjanomeです。
pip install janome

これでインストールできました。

これで
janome テキストファイル

と実行できます。

python内で使う方法は
from janome.tokenizer import Tokenizer

tokenize = Tokenizer()
tokens = tokenize.tokenize( unicode( queue , 'utf-8') )
for token in tokens:
  print( token.surface.encode('utf_8') )

surface以外を取っても良いです。
文字コードutf-8の指定ですが、こうしないと、このエラーが生じるのではないでしょうか

UnicodeDecodeError: 'ascii' codec can't decode byte 0xxx in position 0: ordinal not in range(128)

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)






mecabの方のインストールは
apt-get install mecab libmecab-dev mecab-ipadic
apt-get install aptitude
aptitude install mecab-ipadic-utf8
apt-get install python-mecab

エラーが無ければ、
mecab テキストファイル
で、形態素解析結果を出力します。
pythonで呼び出す方法は、
PythonからMeCab(とCaboCha)を使うまで
この通りですが


所で
SyntaxError: Non-ASCII character '\xx0' in file mecab.py on line 3, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

このエラーは、ファイル先頭に
# -*- coding: utf-8 -*-
と、書いてないからです。


adsense
Categories
サイト内検索
にほんブログ村 科学ブログへ
にほんブログ村

amazon
Profile
Archives
blogchart
QRコード
QRコード
Recent Comments
o