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

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

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

Q&A

解決済

3回答

4943閲覧

勾配降下法の書き方を教えて下さい。

Worldforward

総合スコア17

0グッド

1クリップ

投稿2017/04/11 10:57

編集2017/04/11 14:38

下記コードで勾配降下法で定数a,b,cの近似値を求めようと考えています。

追記:描きコードに酒精したところ動作はしましたが、勾配降下方による予測値は期待値の半分程度の値をとっています。cはゼロ値になっており収束してゼロなのかこれから確認します。

lang

1# Imports 2import tensorflow as tf 3import numpy as np 4import xlrd 5 6# Gradient Update Rate 7gradient_rate=0.001 8 9# Placeholders 10Ta = tf.placeholder(tf.float32, name='Ta') 11Tb = tf.placeholder(tf.float32, name='Tb') 12 13a = tf.Variable(tf.zeros([1, 1])) 14b = tf.Variable(tf.zeros([1, 1])) 15c = tf.Variable(tf.zeros([1, 1])) 16 17def inference(Ta, Tb): 18 Z = (a * Ta + b) * tf.exp(Tb - c * Ta) 19 return Z 20 21def loss(logit, label): 22 loss = tf.reduce_mean(tf.square(logit - label)) 23 return loss 24 25def training(loss, gradient_rate): 26 optimizer = tf.train.GradientDescentOptimizer(gradient_rate) 27 train_op = optimizer.minimize(loss) 28 return train_op 29 30# Read Excel File 31book = xlrd.open_workbook('test.xlsx') 32sheet = book.sheet_by_index(0) 33 34# Model Processing 35for i in range(sheet.ncols): 36 Ta = float(sheet.cell_value(i, 0)) 37 Tb = float(sheet.cell_value(i, 1)) 38 print("%d: Ta: %f, Tb: %f" % (i, Ta, Tb)) 39 40 # Inference Model. 41 logit = inference(Ta, Tb) 42 43 label = float(sheet.cell_value(i, 2)) 44 45 # Loss Calculation. 46 loss = loss(logit, label) 47 48 train_op = training(loss, gradient_rate) 49 50# Model Running 51sess = tf.Session() 52sess.run(tf.global_variables_initializer()) 53sess.run(logit) 54sess.run(loss) 55sess.run(train_op) 56 57print(sess.run(a), sess.run(b), sess.run(c))

SDGでもバッチでも良いのですが、エラー:
ValueError: No variables to optimize.
がどういう意図のメッセージなのか理解できていません。現状SGDのコードになっていることは理解できていますが、書き方の正しさは分かっていません。
そもそもplaceholderを使うべきかもよく分かっていません。
Model runningの部分は自分でも間違っている気がしています。
forループの初回で上記エラーが"train_op = optimizer.minimize(loss)"で発生しています。

このような状況ですが、このコード上何が間違っているかをSGDとバッチの両方の面から指摘していただけると助かります。宜しくお願い致します。
トレースバックを下記に示します。
入力値TaとTbに対する期待値は例えば、下記の場合12.855です。

lang

1>>>> Ta <<<< 213.521899999999986 3>>>> Tb <<<< 456.5643 5>>>> LOGIT <<<< 6Tensor("mul_2:0", dtype=float32) 7>>>> LOSS <<<< 8Tensor("Mean:0", dtype=float32) 9Traceback (most recent call last): 10 File "fitting_question.py", line 53, in <module> 11 train_op = training(loss, gradient_rate) 12 File "fitting_question.py", line 25, in training 13 train_op = optimizer.minimize(loss) 14 File "//anaconda/lib/python3.5/site-packages/tensorflow/python/training/optimizer.py", line 279, in minimize 15 grad_loss=grad_loss) 16 File "//anaconda/lib/python3.5/site-packages/tensorflow/python/training/optimizer.py", line 339, in compute_gradients 17 raise ValueError("No variables to optimize.") 18ValueError: No variables to optimize.

lang

1# Imports 2import tensorflow as tf 3import numpy as np 4import xlrd 5 6# Gradient Update Rate 7gradient_rate=0.001 8 9# Placeholders 10Ta = tf.placeholder(tf.float32, name='Ta') 11Tb = tf.placeholder(tf.float32, name='Tb') 12 13a = tf.placeholder(tf.float32, name='a') 14b = tf.placeholder(tf.float32, name='b') 15c = tf.placeholder(tf.float32, name='c') 16 17def inference(Ta, Tb): 18 Z = (a * Ta + b) * tf.exp(Tb - c * Ta) 19 return Z 20 21def loss(logit, label): 22 loss = tf.reduce_mean(tf.square(logit - label)) 23 return loss 24 25def training(loss, gradient_rate): 26 optimizer = tf.train.GradientDescentOptimizer(gradient_rate) 27 train_op = optimizer.minimize(loss) 28 return train_op 29 30# Read Excel File 31book = xlrd.open_workbook('test.xlsx') 32sheet = book.sheet_by_index(0) 33 34# Model Processing 35for i in range(sheet.ncols): 36 Ta = float(sheet.cell_value(i, 0)) 37 Tb = float(sheet.cell_value(i, 1)) 38 print(">>>> Ta <<<<") 39 print(Ta) 40 41 print(">>>> Tb <<<<") 42 print(Tb) 43 44 # Inference Model. 45 logit = inference(Ta, Tb) 46 print(">>>> LOGIT <<<<") 47 print(logit) 48 49 label = float(sheet.cell_value(i, 2)) 50 51 # Loss Calculation. 52 loss = loss(logit, label) 53 print(">>>> LOSS <<<<") 54 print(loss) 55 56 train_op = training(loss, gradient_rate) 57 58# Model Running 59with tf.Graph().as_default(): 60 sess = tf.Session() 61 sess.run(tf.global_variables_initializer()) 62 sess.run(train_op) 63 64 print(sess.run(a), sess.run(b), sess.run(c))

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2017/04/11 13:20

エラーの発生場所が分かるTraceback、入力元データ(test.xlsx)および予測している正しい解を提示すると回答得られやすいかと思います。
Worldforward

2017/04/11 13:24

can110様 アドバイスありがとうございます。質問を編集しました。
can110

2017/04/11 13:32

質問者ご本人が正しい答え(動き)を理解・提示できない問題に答えるのは至難の技かと思われます。
Worldforward

2017/04/11 13:36

期待値を追加しました。全ての値の開示は諸事情によりできません。
can110

2017/04/11 13:58

質問文にあるTa,Tbの値の場合に与えているlabelの値はいくつですか?
can110

2017/04/11 14:15

というか質問文中のlossが「何」を表わそうと意図しているのか追記ください。何らかの値なのか?そうではないのか?
Worldforward

2017/04/11 14:31

lossは損失関数の値です。
guest

回答3

0

ベストアンサー

train_op = optimizer.minimize(loss)に渡すべきlossはコストの値ではなくコスト(誤差)を計算する関数です。
すなわち、何らかの(異なる)入力を与えると、それに応じた(異なる)コストを返す関数であるべきであると考えられます。
しかしながら

Python

1def loss(logit, label): 2 loss = tf.reduce_mean(tf.square(logit - label)) 3 return loss

においてFitしたい関数logitに対してlabelは、通常渡すべきベクトル列ではなく単一の値を渡しているように見えます。そのためNo variables to optimize.が返されているのだと推測します。
(どんな入力を与えても同じ結果しか返さない=勾配を計算できない)

より正確なエラーメッセージの「意図」は以下のソースを参照するとわかるかもしれません。
tensorflow/tensorflow/python/training/optimizer.py

参考:
TensorFlowを使って多項式のフィッティングを実装してみる
初めてのTensorFlow - イントロダクションとしての線形回帰
Tensorflowで学ぶ最急降下法

投稿2017/04/11 14:39

編集2017/04/11 14:40
can110

総合スコア38234

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Worldforward

2017/04/11 14:45

詳細なご返答ありがとうございます。追記の通りに修正することでエラーは発生せず最後まで走るようにななりました。
can110

2017/04/11 14:50

質問本文が大幅に書き換えられているため何とも判断できませんが 本来の質問の目的(エラー解消)が解決されたのであれば何よりです。
guest

0

が同意とのメッセージなのか理解できていません。

がどういう意図のメッセージなのか理解できていません。
の間違いです。失礼しました。

投稿2017/04/11 12:09

Worldforward

総合スコア17

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

optimizer = tf.train.GradientDescentOptimizer(learning_rate)

optimizer = tf.train.GradientDescentOptimizer(gradient_rate)
の間違いです。失礼しました

投稿2017/04/11 12:06

Worldforward

総合スコア17

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2017/04/11 12:22

ここは回答者が回答するところです。追記なら質問を編集してください。 また、コードはコードブロックで囲んでください。 囲むべきテキストを選択して <CODE> です。
Worldforward

2017/04/11 12:36

Zuishin様 ご指摘ありがとうございます。編集しました。 ちなみに<CODE>では対応してないですね
Zuishin

2017/04/11 13:04

しています。やり方を間違えたのでしょう。
Worldforward

2017/04/11 13:05

返答ありがとうございます。 それより本文へのご回答をお願い致します
Zuishin

2017/04/11 13:33

なぜ私が?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問