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

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

ただいまの
回答率

90.53%

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,110

Worldforward

score -3

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

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

# Imports
import tensorflow as tf
import numpy as np
import xlrd

# Gradient Update Rate
gradient_rate=0.001

# Placeholders
Ta = tf.placeholder(tf.float32, name='Ta')
Tb = tf.placeholder(tf.float32, name='Tb')

a = tf.Variable(tf.zeros([1, 1]))
b = tf.Variable(tf.zeros([1, 1]))
c = tf.Variable(tf.zeros([1, 1]))

def inference(Ta, Tb):
  Z = (a * Ta + b) * tf.exp(Tb - c * Ta)
  return Z

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

def training(loss, gradient_rate):
  optimizer = tf.train.GradientDescentOptimizer(gradient_rate)
  train_op = optimizer.minimize(loss)
  return train_op

# Read Excel File
book = xlrd.open_workbook('test.xlsx')
sheet = book.sheet_by_index(0)

# Model Processing
for i in range(sheet.ncols):
  Ta = float(sheet.cell_value(i, 0))
  Tb = float(sheet.cell_value(i, 1))
  print("%d: Ta: %f, Tb: %f" % (i, Ta, Tb))

  # Inference Model.
  logit = inference(Ta, Tb)

  label = float(sheet.cell_value(i, 2))

  # Loss Calculation.
  loss = loss(logit, label)

  train_op = training(loss, gradient_rate)

# Model Running
sess = tf.Session()
sess.run(tf.global_variables_initializer())
sess.run(logit)
sess.run(loss)
sess.run(train_op)

print(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です。

>>>> Ta <<<<
13.521899999999986
>>>> Tb <<<<
56.5643
>>>> LOGIT <<<<
Tensor("mul_2:0", dtype=float32)
>>>> LOSS <<<<
Tensor("Mean:0", dtype=float32)
Traceback (most recent call last):
  File "fitting_question.py", line 53, in <module>
    train_op = training(loss, gradient_rate)
  File "fitting_question.py", line 25, in training
    train_op = optimizer.minimize(loss)
  File "//anaconda/lib/python3.5/site-packages/tensorflow/python/training/optimizer.py", line 279, in minimize
    grad_loss=grad_loss)
  File "//anaconda/lib/python3.5/site-packages/tensorflow/python/training/optimizer.py", line 339, in compute_gradients
    raise ValueError("No variables to optimize.")
ValueError: No variables to optimize.
# Imports
import tensorflow as tf
import numpy as np
import xlrd

# Gradient Update Rate
gradient_rate=0.001

# Placeholders
Ta = tf.placeholder(tf.float32, name='Ta')
Tb = tf.placeholder(tf.float32, name='Tb')

a = tf.placeholder(tf.float32, name='a')
b = tf.placeholder(tf.float32, name='b')
c = tf.placeholder(tf.float32, name='c')

def inference(Ta, Tb):
  Z = (a * Ta + b) * tf.exp(Tb - c * Ta)
  return Z

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

def training(loss, gradient_rate):
  optimizer = tf.train.GradientDescentOptimizer(gradient_rate)
  train_op = optimizer.minimize(loss)
  return train_op

# Read Excel File
book = xlrd.open_workbook('test.xlsx')
sheet = book.sheet_by_index(0)

# Model Processing
for i in range(sheet.ncols):
  Ta = float(sheet.cell_value(i, 0))
  Tb = float(sheet.cell_value(i, 1))
  print(">>>> Ta <<<<")
  print(Ta)

  print(">>>> Tb <<<<")
  print(Tb)

  # Inference Model.
  logit = inference(Ta, Tb)
  print(">>>> LOGIT <<<<")
  print(logit)

  label = float(sheet.cell_value(i, 2))

  # Loss Calculation.
  loss = loss(logit, label)
  print(">>>> LOSS <<<<")
  print(loss)

  train_op = training(loss, gradient_rate)

# Model Running
with tf.Graph().as_default():
  sess = tf.Session()
  sess.run(tf.global_variables_initializer())
  sess.run(train_op)

  print(sess.run(a), sess.run(b), sess.run(c))
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • can110

    2017/04/11 22:58

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

    キャンセル

  • can110

    2017/04/11 23:15

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

    キャンセル

  • Worldforward

    2017/04/11 23:31

    lossは損失関数の値です。

    キャンセル

回答 3

checkベストアンサー

+1

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

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


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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/11 23:45

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

    キャンセル

  • 2017/04/11 23:50

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

    キャンセル

0

optimizer = tf.train.GradientDescentOptimizer(learning_rate) 

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/11 21:22

    ここは回答者が回答するところです。追記なら質問を編集してください。

    また、コードはコードブロックで囲んでください。
    囲むべきテキストを選択して <CODE> です。

    キャンセル

  • 2017/04/11 21:36

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

    キャンセル

  • 2017/04/11 22:04

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

    キャンセル

  • 2017/04/11 22:05

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

    キャンセル

  • 2017/04/11 22:33

    なぜ私が?

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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