質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

解決済

Tensorflowの復元した2回目のsessionでnomarizeを行わないif~elseの分岐ができていないです。

zakio49
zakio49

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1回答

0評価

1クリップ

1471閲覧

投稿2017/07/12 03:22

編集2022/01/12 10:58

###Tensorflowの2回目のsessionでnomarizeを行わないif~elseの分岐ができていない。
たびたび質問失礼します。
45個のデータを学習して、restoreを行って新しいsessionの中で1個分の実践データを吐き出すプログラムを作っています。

2個分の実践データを予想する際には出力値が0.~~と正解データに近い値がでるのですが、1個分の実践データを読み込ませると常に結果が1になりました。

・Tensorflowの正規化の定義式がxの値が一つだと1になるので自明であることは理解しました。
間違った認識:||X||p=(|X1|^p+|X2|^2+・・・・|Xn|^p)^1/pと
正しい式:= x / (max(Σ(x**2)^1/2

[【機械学習】LPノルムってなんだっけ?](http://qiita\.com/kenmatsu4/items/cecb466437da33df2870\)

###行いたい実装
二回目のrestoreした後のセッションに関してはreturnする値をnomarizeしないで、復元された重みとバイアスを一行CSVデータと行列計算したものをreturnとして返したいのでif~else文で分岐させたのですが、出力値は以前として1のままです
以下が問題だと思っています

###問題だと思っている点
・今のコードではTACKという変数を用いて、nomarizeしてruturnするか、しないでreturnするかを担わせています。

if TACK == 1: print\("saku1"\) print\(output\) return output else : print\("saku2"\) return tf\.nn\.l2_normalize\(output, 0\)

session2の中でTACKを初期値0→1に変えたので、sess2を実行すれば、

best_match2 = sess2\.run\(output, feed_dict={score_placeholder:\[test2\]}\)

outputが実行される時にinference()関数を実行を行い、TACK == 1のほうが実行されて1ではない値が出力として出てくると考えています。

この認識に誤りがあると考えています。
inference関数はNNの入力層―隠れ層―出力層を辿って計算結果を出力する関数ですが
tf.Graphを作る過程でinference関数の返り値のみをoutputに引き継いで

output = inference\(score_placeholder\) ・ ・ ・ ・ ・ best_match2 = sess2\.run\(output, feed_dict={score_placeholder:\[test2\]}\)

sess2で実行しているのでsess2.run()が行われた際にはscore_placeholder:[test2]を用いてinferenceを実行してその返り値を返しているのか、はたまた、tfの独自の処理が動いているのか、時にどうしてTACKの値が反映されてif~else文の分岐が成功していないのかを知りたいです。inferenceの引数にTACKの値を持たせて分岐などさせるのか、scopeとかの話なのでしょうかで困惑しています。

助けれいただければ嬉しいです。
長くなってしまいましたがお答えしていただけるとありがたいです。

def inference\(score_placeholder\): with tf\.name_scope\('hidden1'\) as scope: hidden1_weight = tf\.Variable\(tf\.truncated_normal\(\[SCORE_SIZE, HIDDEN_UNIT_SIZE\], stddev=0\.01\), name="hidden1_weight"\) hidden1_bias = tf\.Variable\(tf\.constant\(0\.1, shape=\[HIDDEN_UNIT_SIZE\]\), name="hidden1_bias"\) hidden1_output = tf\.nn\.relu\(tf\.matmul\(score_placeholder, hidden1_weight\) \+ hidden1_bias\) with tf\.name_scope\('output'\) as scope: output_weight = tf\.Variable\(tf\.truncated_normal\(\[HIDDEN_UNIT_SIZE, 1\], stddev=0\.01\), name="output_weight"\) output_bias = tf\.Variable\(tf\.constant\(0\.1, shape=\[1\]\), name="output_bias"\) output = tf\.matmul\(hidden1_output, output_weight\) \+ output_bias if TACK == 1: print\("saku1"\) print\(output\) return output else : print\("saku2"\) return tf\.nn\.l2_normalize\(output, 0\)

ソースコード全文

import tensorflow as tf import numpy import os cwd = os\.getcwd\(\) SCORE_SIZE = 12 HIDDEN_UNIT_SIZE = 40 TRAIN_DATA_SIZE = 45 TACK = 0 raw_input = numpy\.loadtxt\(open\("test\.csv"\), delimiter=","\) \[tensor, score\] = numpy\.hsplit\(raw_input, \[1\]\) \[tensor_train, tensor_test\] = numpy\.vsplit\(tensor, \[TRAIN_DATA_SIZE\]\) \[score_train, score_test\] = numpy\.vsplit\(score, \[TRAIN_DATA_SIZE\]\) #tensorは正解データtrainは学習モデル、scoreは学習データ、testは実データ def inference\(score_placeholder\): with tf\.name_scope\('hidden1'\) as scope: hidden1_weight = tf\.Variable\(tf\.truncated_normal\(\[SCORE_SIZE, HIDDEN_UNIT_SIZE\], stddev=0\.01\), name="hidden1_weight"\) hidden1_bias = tf\.Variable\(tf\.constant\(0\.1, shape=\[HIDDEN_UNIT_SIZE\]\), name="hidden1_bias"\) hidden1_output = tf\.nn\.relu\(tf\.matmul\(score_placeholder, hidden1_weight\) \+ hidden1_bias\) with tf\.name_scope\('output'\) as scope: output_weight = tf\.Variable\(tf\.truncated_normal\(\[HIDDEN_UNIT_SIZE, 1\], stddev=0\.01\), name="output_weight"\) output_bias = tf\.Variable\(tf\.constant\(0\.1, shape=\[1\]\), name="output_bias"\) output = tf\.matmul\(hidden1_output, output_weight\) \+ output_bias #一回目は正規化を行う 。 if TACK == 1: print\("saku1"\) print\(output\) return output #二回目は正規化を行うと1になるので行わない。 else : print\("saku2"\) return tf\.nn\.l2_normalize\(output, 0\) def loss\(output, tensor_placeholder, loss_label_placeholder\): with tf\.name_scope\('loss'\) as scope: loss = tf\.nn\.l2_loss\(output - tf\.nn\.l2_normalize\(tensor_placeholder, 0\)\) tf\.summary\.scalar\('loss_label_placeholder', loss\) return loss def training\(loss\): with tf\.name_scope\('training'\) as scope: train_step = tf\.train\.GradientDescentOptimizer\(0\.01\)\.minimize\(loss\) return train_step with tf\.Graph\(\)\.as_default\(\): tensor_placeholder = tf\.placeholder\(tf\.float32, \[None, 1\], name="tensor_placeholder"\) score_placeholder = tf\.placeholder\(tf\.float32, \[None, SCORE_SIZE\], name="score_placeholder"\) loss_label_placeholder = tf\.placeholder\("string", name="loss_label_placeholder"\) feed_dict_train={ tensor_placeholder: tensor_train, score_placeholder: score_train, loss_label_placeholder: "loss_train" } feed_dict_test={ tensor_placeholder: tensor_test, score_placeholder: score_test, loss_label_placeholder: "loss_test" } output = inference\(score_placeholder\) loss = loss\(output, tensor_placeholder, loss_label_placeholder\) training_op = training\(loss\) summary_op = tf\.summary\.merge_all\(\) init = tf\.global_variables_initializer\(\) best_loss = float\("inf"\) with tf\.Session\(\) as sess: summary_writer = tf\.summary\.FileWriter\('data', graph_def=sess\.graph_def\) sess\.run\(init\) for step in range\(10000\): sess\.run\(training_op, feed_dict=feed_dict_train\) loss_test = sess\.run\(loss, feed_dict=feed_dict_test\) if loss_test < best_loss: best_loss = loss_test best_match = sess\.run\(output, feed_dict=feed_dict_test\) #if step % 100 == 0: # summary_str = sess\.run\(summary_op, feed_dict=feed_dict_test\) # summary_str \+= sess\.run\(summary_op, feed_dict=feed_dict_train\) # summary_writer\.add_summary\(summary_str, step\) saver=tf\.train\.Saver\(\) saver\.save\(sess,cwd\+'/model\.ckpt'\) print\(cwd\) print\(best_match\) print\('Saved a model\.'\) sess\.close\(\) with tf\.Session\(\) as sess2: #変数の読み込み summary_writer = tf\.summary\.FileWriter\('data', graph=sess2\.graph\) #sess2\.run\(init\) #新しいデータ TRAIN_DATA_SIZE2 = 0 test2 = numpy\.loadtxt\(open\("one_data\.csv"\), delimiter=","\)\.astype\(numpy\.float32\) print\(TACK\) saver = tf\.train\.Saver\(\) cwd = os\.getcwd\(\) saver\.restore\(sess2,cwd \+ "/model\.ckpt"\) TACK = 1 #best_match2 = sess2\.run\(inference\(score3\)\) best_match2 = sess2\.run\(output, feed_dict={score_placeholder:\[test2\]}\) print\(best_match2\) print\("fin"\) sess2\.close\(\)

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。