37
DL適用分野:言語解析
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
Skip gramを用いた単語埋め込み(word embedding)
EncoderDecoderモデルを用いた翻訳モデル
言語解析ライブラリ
「Word2Vec」
t’=2
ボブ
t’=1 t’=0
は 私
t=0 t=1 t=2
I am Bob
50
計算グラフ
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
Variable
val1
const1 val1
add
定数:3 変数:初期値0
加算の結果
a = tf.constant(3, name="const1")
b = tf.Variable(0, name="val1")
add = tf.add(a, b)
Variableやconstantは、変数・定数を出力
するという演算を行うという認識。
51
計算グラフ
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
Variable
val1
const1 val1
add
Input
assign = tf.assign(b, add)
c = tf.placeholder(tf.int32, name="input")
mul = tf.multiply(assign, c)
変数に対する値の更新はassignを用いる
assign
placeholder
実行時の引数
mul
掛け算の結果
52
計算グラフ
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
Variable
val1
const1 val1
add
Input
Init = tf. global_variables_initializer ()
変数は初期化が必要
assign
placeholder
mul
掛け算の結果 init
構築したグラフをセッション上で動かす
初期化オペレーション
53
計算グラフ
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
Variable
val1
const1 val1
add
Input
with tf.Session() as sess:
sess.run(init)
assign
placeholder
mul
掛け算の結果 init
構築したグラフをセッション上で動かす
まずは初期化だけ実行
54
計算グラフ
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
Variable
val1
const1 val1
add
Input
for i in range(3):
print(sess.run(mul, feed_dict={c: 3}))
assign
placeholder
mul
掛け算の結果 init
mulの結果を3回実行
feed_dict: 2
55
計算グラフ
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
Variable
val1
const1 val1
add
Input
for i in range(3):
print(sess.run(add))
assign
placeholder
mul
掛け算の結果 init
Addの部分だけ実行する際は、このグラフ
でplaceholderは関係ないのでいらない。
assignも通らないので変数も更新されない
97
モデルを保存するには
1. tf.train.Saverオブジェクトを生成
2. 保存したいステップの時にsave
2017/9/19
Singularity Copyright 2016 Singularity Inc. All rights
reserved
saver = tf.train.Saver()
with tf.Session() as sess:
sess.run(init)
for i in range(1000):
#step数とイテレーション数を合わせる
step = i + 1
(訓練・割愛)
if step % 100 == 0:
saver.save(sess, ‘models/my_model’, global_step = step)
models直下にmy_modelという名前で 名前の後に何step目のモデルかを付与
162
many to one
必要なのは最終ステップの出力のみ
例:1行ずつ画像を読み込んで行って、その画像のクラス分類
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
入力1 入力2 入力3
中間1 中間2 中間2
出力3
163
many to one実装
ポイントはtf.nn.dynamic_rnnの出力の最終時系列のデータだけを
引っ張ってくること
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
Tensor操作になるのでちょっと手間
165
プログラム作成
インポートなど
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
#-*- coding:utf-8 -*-
from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf
#mnistデータを格納したオブジェクトを呼び出す
mnist = input_data.read_data_sets("data/", one_hot=True)
166
プログラム作成
モデル構築(入力データ整形)
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
#入力データ整形
num_seq = 28
num_input = 28
x = tf.placeholder(tf.float32, [None, 784])
input = tf.reshape(x, [-1, num_seq, num_input])
dynamic_rnnへの入力は[バッチサイズ, sequenceサイズ, 入力長]
tf.reshapeで整形 ※num_seq* num_input=784にするように
167
プログラム作成
モデル構築(rnn cell作成)
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
#ユニット数128個のLSTMセル
#三段に積む
stacked_cells = []
for i in range(3):
stacked_cells.append(tf.nn.rnn_cell.LSTMCell(num_units=128))
cell = tf.nn.rnn_cell.MultiRNNCell(cells=stacked_cells)
168
プログラム作成
モデル構築(dynamic_rnn構築、最終時間のみのスライス)
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
#dynamic_rnn構築
outputs, states = tf.nn.dynamic_rnn(cell=cell, inputs=input, dtype=tf.float32,
time_major=False)
#シーケンス軸のランクを最初に来るように入れ替え
#type_major=Trueにしていれば必要ない
outputs = tf.transpose(outputs,[1, 0, 2])
#最後のシーケンスのデータのみスライス
last_output = tf.gather(outputs, int(outputs.get_shape()[0]) -1)
Last_outputは最終時間における[バッチサイズ, 出力長]となり、
いつものニューラルネットワークと同じ!!
169
プログラム作成
モデル構築(出力層)
2017/9/19
C8Lab Copyright 2014 C8Lab Inc. All rights reserved
#出力層
w = tf.Variable(tf.truncated_normal([128,10], stddev=0.1))
b = tf.Variable(tf.zeros([10]))
out = tf.nn.softmax(tf.matmul(last_output, w ) + b)
以前書いたものと同じ。以降、lossや評価、実行も全て他のプログラムと同じ
RNNなので計算時間もかかる上に、収束も遅い。