面白いデータを探して

適当に書く。間違えていたら教えてください。

tensorflowでembeddingがしたい(準備)

tensorflowを使ってembeddingがしたい機会がありました。 今回はその予習としてtensorflowのembedding_lookupのテストコードを書いてみました。 下が実行結果で、確かにパラメータの特定の列についてのみ学習ができています。

# -*- coding:utf-8 -*-
import tensorflow as tf
import numpy as np

# パラメータの設定
size = 5
dim = 2

# 近づけたい出力
t = np.array([0, 1, 0, 0, 1])

# 5*2の行列と2*5の行列を用意
w_1 = tf.Variable(tf.random_normal([size, dim]))
w_2 = tf.Variable(tf.random_normal([dim, size]))

# w_1のうちでrow行の値のみを更新するようにoutputを設定
row = tf.placeholder(tf.int32, [None])
h = tf.nn.embedding_lookup(w_1, row)
output = tf.sigmoid(tf.matmul(h, w_2))

# loss、train、initを設定
loss = tf.reduce_mean(tf.square(output - t))
train = tf.train.GradientDescentOptimizer(0.01).minimize(loss)
init = tf.global_variables_initializer()

# 実行部分
with tf.Session() as sess:
    sess.run(init)
    
    # 学習前の行列
    first_w_1 = sess.run(w_1)
    first_w_2 = sess.run(w_2)
    
    
    for step in range(1, 101):
        # w_1については[1, 2]行目のみの値を更新
        # w_2については行列のすべての要素を更新
        sess.run(train, feed_dict={row:np.array([1, 2])})
    
    # 学習後の行列と学習前の行列の差分を計算
    print(sess.run(w_1) - first_w_1)
    print(sess.run(w_2) - first_w_2)
[[ 0.          0.        ]
 [-0.0712887  -0.01854229]
 [ 0.01749679 -0.00123197]
 [ 0.          0.        ]
 [ 0.          0.        ]]
[[ 0.00237578  0.00131099  0.00797105 -0.00899601  0.00117618]
 [-0.02722374  0.03683269  0.01439148 -0.07077052  0.03974867]]