- 投稿日:2019-01-26T19:46:47+09:00
【TensorFlow】placeholderで指定している値を使ったTensorを定義する
経緯
下記のように、placeholderで指定している数をshape(valueも同様)に使ってtensorを作成したいときに困ったので、解決例をまとめたいと思います。
エラーimport tensorflow as tf dim = tf.placeholder(tf.int32) var = tf.constant(2, shape=[dim]) with tf.Session() as sess: print(sess.run(var, feed_dict={dim:5}))解決方法
tf.fillを使う
tf.fill使用import tensorflow as tf dim = tf.placeholder(tf.int32) var = tf.fill([dim], 2) with tf.Session() as sess: print(sess.run(var, feed_dict={dim:5}))出力[2 2 2 2 2]tf.zerosもしくはtf.onesを使う
tf.zeros&tf.ones使用import tensorflow as tf dim = tf.placeholder(tf.int32) var = tf.ones([dim], tf.int32) + 1 var2 = tf.zeros([dim], tf.int32) + 2 with tf.Session() as sess: print(sess.run(var, feed_dict={dim:5})) print(sess.run(var2, feed_dict={dim:5}))出力[2 2 2 2 2] [2 2 2 2 2]
- 投稿日:2019-01-26T19:46:47+09:00
【TensorFlow】placeholderで指定している値を使ったTensorを定義
経緯
下記のように、placeholderで指定している数をshape(valueも同様)に使ってtensorを作成したいときに困ったので、解決例をまとめたいと思います。
エラーimport tensorflow as tf dim = tf.placeholder(tf.int32) var = tf.constant(2, shape=[dim]) with tf.Session() as sess: print(sess.run(var, feed_dict={dim:5}))解決方法
tf.fillを使う
tf.fill使用import tensorflow as tf dim = tf.placeholder(tf.int32) var = tf.fill([dim], 2) with tf.Session() as sess: print(sess.run(var, feed_dict={dim:5}))出力[2 2 2 2 2]tf.zerosもしくはtf.onesを使う
tf.zeros&tf.ones使用import tensorflow as tf dim = tf.placeholder(tf.int32) var = tf.ones([dim], tf.int32) + 1 var2 = tf.zeros([dim], tf.int32) + 2 with tf.Session() as sess: print(sess.run(var, feed_dict={dim:5})) print(sess.run(var2, feed_dict={dim:5}))出力[2 2 2 2 2] [2 2 2 2 2]
- 投稿日:2019-01-26T13:37:58+09:00
TensorFlowを使ってBitcoinの価格を予想してみた
詳細ディープラーニングの本を読んだので、勉強の題材としてBitcoinの予測を行ってみました。
https://www.amazon.co.jp/dp/B072JC21DH/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1利用した技術や手法
- TensorFlow
- リカレントニューラルネットワーク
- LSTM
- Adam
TensorFlowとは
Googleが作成した機械学習用ライブラリ
機械学習の様々なアルゴリズムをライブラリ化してくれているので、アルゴリズムを理解していなくても機械学習のモデルを作成できる。リカレントニューラルネットワークとは
時系列のデータの扱う時に利用する手法
今回の場合だと、過去のビットコインの価格から、未来の価格を予測するので、この手法が当てはまってそうLSTMとは
長期の過去時間から学習を進めていくと、勾配が消失してしまい学習が進まなくなるから、その対処法となる手法
Adamとは
学習率の調整の手法
最初は大きく学習率をとって、学習が進めるにつれて学習率を小さくしてくれるこれらを使って作成したソースコードはこちら
https://github.com/unamu1229/deep_larning_bitcoin/blob/master/bitcoin.py学習データは
https://www.blockchain.com/ja/charts/market-price
からダウンロードした、2009-01-03から2019-01-01までのビットコインの市場価格予想結果のグラフこのような具合、y軸はドルになり、x軸は日付。
点線は学習のデータになり、実線は学習したモデルが予測したビットコインの市場価格になります。
ビットコインの価格が高騰した時の予測の市場価格と実際の市場価格に大きくズレがあります。
もっと学習の回数(epochs)を増やすことで、この辺りのズレも少なくなりそうです。
- 投稿日:2019-01-26T00:18:39+09:00
BERTの学習済みモデルを利用して日本語文章の尤度を測る
概要
BERTの本家には文章の尤度を測るサンプルがなかった。
尤度を測れるまでの作業メモ
- 本家 GitHub google-research/bert
- 言語モデル拡張 GitHub xu-song/bert-as-language-model
- 日本語モデル BERT with SentencePiece を日本語 Wikipedia で学習してモデルを公開しました
- 日本語モデルコード GitHub yoheikikuta/bert-japanese
謝辞
google-researchチーム、xu-songさん、yoheikikutaさんに感謝いたします。
フォークしたソース
GitHub KTaskn/bert-as-language-model
手順
- 言語モデル拡張をgit cloneする
- 日本語モデルコードからtokenization_sentencepiece.pyをダウンロードする
- クローンしたディレクトリにmodelsディレクトリを作成する
- 日本語モデルから "内容" => "google drive"から日本語モデルをダウンロードしmodelsディレクトリに保存する
- run_lm_predict.pyのコードを修正する
- 日本語モデルのconfig.iniを参考にからbert_config.jsonを作成する
bash.$ git clone https://github.com/xu-song/bert-as-language-model.git $ mkdir models $ wget --no-check-certificate https://raw.githubusercontent.com/yoheikikuta/bert-japanese/master/src/tokenization_sentencepiece.py # modelsにモデルをダウンロード # bert_configを作成する $ export BERT_BASE_DIR=models $ export INPUT_FILE=data/lm/test.ja.tsv $ python run_lm_predict.py \ --input_file=$INPUT_FILE \ --vocab_file=$BERT_BASE_DIR/wiki-ja.vocab \ --bert_config_file=$BERT_BASE_DIR/bert_config.json \ --init_checkpoint=$BERT_BASE_DIR/model.ckpt-1400000 \ --max_seq_length=128 \ --output_dir=/tmp/lm_output/ \ --jp_tokenizer=Truerun_lm_predict.py# 21行目〜 import os import json import modeling import tokenization # 追加 import tokenization_sentencepiece as tokenization_jp import numpy as np import tensorflow as tf # ~~ # 93行目〜 flags.DEFINE_integer( "num_tpu_cores", 8, "Only used if `use_tpu` is True. Total number of TPU cores to use.") # 追加 flags.DEFINE_bool("jp_tokenizer", False, "Use JP Tokenizer") class InputExample(object): def __init__(self, unique_id, text): self.unique_id = unique_id self.text = text # 310行目〜 # 変更 if FLAGS.jp_tokenizer: tokenizer = tokenization_jp.FullTokenizer( model_file="./models/jp_model/wiki-ja.model", vocab_file="./models/jp_model/wiki-ja.vocab", do_lower_case=True) else: tokenizer = tokenization.FullTokenizer( vocab_file=FLAGS.vocab_file, do_lower_case=FLAGS.do_lower_case)bert_config.json{ "attention_probs_dropout_prob" : 0.1, "hidden_act" : "gelu", "hidden_dropout_prob" : 0.1, "hidden_size" : 768, "initializer_range" : 0.02, "intermediate_size" : 3072, "max_position_embeddings" : 512, "num_attention_heads" : 12, "num_hidden_layers" : 12, "type_vocab_size" : 2, "vocab_size" : 32000 }実行結果
data/lm/test.ja.tsv私は本を読む 私は日本を読む 本の国土は広い 日本の国土は広い/tmp/lm_output/test_results.json[ { "tokens": [ { "token": "▁", "prob": 0.9849837422370911 }, { "token": "私は", "prob": 0.01772877760231495 }, { "token": "本", "prob": 0.38430821895599365 }, { "token": "を読む", "prob": 0.14501915872097015 } ], "ppl": 5.6616988500880625 }, { "tokens": [ { "token": "▁", "prob": 0.9833461046218872 }, { "token": "私は", "prob": 0.019558683037757874 }, { "token": "日本", "prob": 0.00026242720196023583 }, { "token": "を読む", "prob": 0.0007271786453202367 } ], "ppl": 128.47718205285057 }, { "tokens": [ { "token": "▁", "prob": 0.011469533666968346 }, { "token": "本の", "prob": 2.954236833829782e-06 }, { "token": "国土", "prob": 5.874089401913807e-05 }, { "token": "は", "prob": 0.514896810054779 }, { "token": "広い", "prob": 3.2568786991760135e-05 } ], "ppl": 1973.8280517535734 }, { "tokens": [ { "token": "▁日本の", "prob": 0.001967047341167927 }, { "token": "国土", "prob": 0.07699552178382874 }, { "token": "は", "prob": 0.11561550199985504 }, { "token": "広い", "prob": 2.0818872144445777e-05 } ], "ppl": 228.85563777870746 } ]summary.* 私は本を読む => 5.6616988500880625 * 私は日本を読む => 128.47718205285057 * 本の国土は広い => 1973.8280517535734 * 日本の国土は広い => 228.85563777870746うまくいったかな?
以上