TensorFlowで言語識別を
やってみた
2015/12/11@TensorFlow研究会
株式会社ビズリーチ 安田京太
自己紹介
安田京太(@dasoran)
・株式会社ビズリーチ所属
・新卒で今年の春に入社して現在インフラ担当
・機械学習は(ほぼ)趣味ですこし
やったこと
・英語、フランス語、スペイン語の文章を食わせて言語を当てさせる
・MNIST以外の簡単な学習タスクで挙動を確認したかった
・word単位で入力するのではなく、文字単位で入力した
・シンプルだと思ったのに見かけることがない
・それくらいの構造頑張って学習してほしい
入力データ
This is a pen.
↓ 文字コード化
[0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73,0x20, 0x61, 0x20, 0x70, 0x65, 0x6e, 0x2e]
・400文字で文章を切って入力
TensorFlow部分のコード
x = tf.placeholder(tf.float32, [None, n_input_node])
W = tf.Variable(tf.zeros([n_input_node, 3]))
b = tf.Variable(tf.zeros([3]))
y = tf.nn.softmax(tf.matmul(x, W) + b)
y_ = tf.placeholder(tf.float32, [None, 3])
cross_entropy = -tf.reduce_sum(y_*tf.log(y))
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
init = tf.initialize_all_variables()
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
sess = tf.Session()
sess.run(init)
for i in range(100):
perm = np.random.permutation(n_train)
for i in range(0, n_train, batchsize):
x_batch = np.asarray(x_train[perm[i:i + batchsize]])
y_batch = np.asarray(y_train[perm[i:i + batchsize]])
sess.run(train_step, feed_dict={x: x_batch, y_: y_batch})
print sess.run(accuracy, feed_dict={x: x_test, y_: y_test})
入力データ
短い!
(というかほとんどMNISTそのまま……)
初心者的TensorFlowの勘所
・定義してから実行する
・外部から値を入れたい変数をplaceholderで定義する
・placeholderで定義した値にsess.run(関数, feed_dict={値})で代入実行する
初心者的TensorFlowの勘所
「y = 5x + 3」を計算してみる
x = tf.placeholder(tf.float32, [None, 1])
y = 5 * x + 3
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
print sess.run(y, feed_dict={x: [[10], [3]]})
話を戻して
言語認識の結果
正答率:0.416
ほとんど識別できてない
やはりword単位でないとだめなのか・・・
文字だけでなんとかする努力
・入力文字を数値ではなく256次元の1,0のベクトルにしてみた
T
↓ 文字コード化
[0x54]
↓ ベクトル化
[0, 0, 0, …, 0, 0, 1, 0, 0, ….0]
努力の結果
正答率:0.843
学習してると言えるくらいになった!
データが分散していないと学習がうまくできない事があるらしい。
まとめ
・TensorFlowは簡単!
・学習タスクは入力データの形式が大事

Tensorflowで言語識別をやってみた