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

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

ただいまの
回答率

88.34%

TensorFlowでデータ型のエラーを解消したい。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,754

JunyaKoga

score 17

<1/26追記>

最下部の内容から進展があったので、記事を更新します。
問題があるであろう、グラフ作成の部分と実行部分を抜粋します(いくつか変更してます)。
実行部ではfor文でエポック数を増やしたいのですが、2周目からエラーが出るようです。実行部のfor文をfor i in range(1)とした場合はエラーは生じません。
エラー内容は「sess.runにndarrayを入れるな。テンソルを入れてくれ」ということだと思いますが、何故、forの1周目でテンソルだったものが2周目からndarrayに変化してしまうのかがわかりません。

グラフの作成
g = tf.Graph()
with g.as_default():
  tf.set_random_seed(123)

  tf_x = tf.placeholder(tf.float32, shape=(None, 4), name='tf_x')
  tf_y = tf.placeholder(tf.int32, shape=(None), name='tf_y')

  oh_y = tf.one_hot(tf_y, 3, dtype=tf.float32, name='oh_y')

  w = tf.Variable(tf.random_normal((4, 3)), name='weight')
  b = tf.Variable(tf.zeros(3), name='bias')

  logits = tf.add(tf.matmul(tf_x, w), b, name='logits')

  prediction = {'probabilities': tf.nn.softmax(logits, name='probabilities'),
                'labels': tf.argmax(logits,1)}

  cost = tf.losses.softmax_cross_entropy(logits=logits, onehot_labels=oh_y)
#   cost = -tf.reduce_sum(oh_y * tf.log(prediction['probabilities']))
  optimizer = tf.train.AdamOptimizer()
  train = optimizer.minimize(cost)
  correct_predictions = tf.equal(prediction['labels'], tf.argmax(oh_y, 1))
#   tf.reduce_meanの中身はfloatにしてあげないと小数点の計算できない
  accuracy = tf.reduce_mean(tf.cast(correct_predictions, tf.float32), name='accuracy')
  init = tf.global_variables_initializer()

実行
with tf.Session(graph=g) as sess:
  sess.run(init)
# ↓のfor文のrange(1)にすると、エラーが生じません。
  for step in range(2):
    _, cost= sess.run([train, cost], feed_dict={tf_x: X_train, tf_y: y_train})
    if (step + 1) % 10 == 0:
      print('Epoch%2d Cost:%.2f' %(step+1, cost))

  print('Prediction Accuracy: %.2f' %(sess.run(accuracy, feed_dict={tf_x: X_test, tf_y: y_test}) * 100))

生じているエラー

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/client/session.py in __init__(self, fetches, contraction_fn)
    299         self._unique_fetches.append(ops.get_default_graph().as_graph_element(
--> 300             fetch, allow_tensor=True, allow_operation=True))
    301       except TypeError as e:

/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/ops.py in as_graph_element(self, obj, allow_tensor, allow_operation)
   3489     with self._lock:
-> 3490       return self._as_graph_element_locked(obj, allow_tensor, allow_operation)
   3491 

/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/ops.py in _as_graph_element_locked(self, obj, allow_tensor, allow_operation)
   3578       raise TypeError("Can not convert a %s into a %s." % (type(obj).__name__,
-> 3579                                                            types_str))
   3580 

TypeError: Can not convert a float32 into a Tensor or Operation.

During handling of the above exception, another exception occurred:

TypeError                                 Traceback (most recent call last)
<ipython-input-134-171c87a28859> in <module>()
      3 # ↓のfor文のrange(1)にすると、エラーが生じません。
      4   for step in range(2):
----> 5     _, cost= sess.run([train, cost], feed_dict={tf_x: X_train, tf_y: y_train})
      6     if (step + 1) % 10 == 0:
      7       print('Epoch%2d Cost:%.2f' %(step+1, cost))

/usr/local/lib/python3.6/dist-packages/tensorflow/python/client/session.py in run(self, fetches, feed_dict, options, run_metadata)
    927     try:
    928       result = self._run(None, fetches, feed_dict, options_ptr,
--> 929                          run_metadata_ptr)
    930       if run_metadata:
    931         proto_data = tf_session.TF_GetBuffer(run_metadata_ptr)

/usr/local/lib/python3.6/dist-packages/tensorflow/python/client/session.py in _run(self, handle, fetches, feed_dict, options, run_metadata)
   1135     # Create a fetch handler to take care of the structure of fetches.
   1136     fetch_handler = _FetchHandler(
-> 1137         self._graph, fetches, feed_dict_tensor, feed_handles=feed_handles)
   1138 
   1139     # Run request and get response.

/usr/local/lib/python3.6/dist-packages/tensorflow/python/client/session.py in __init__(self, graph, fetches, feeds, feed_handles)
    469     """
    470     with graph.as_default():
--> 471       self._fetch_mapper = _FetchMapper.for_fetch(fetches)
    472     self._fetches = []
    473     self._targets = []

/usr/local/lib/python3.6/dist-packages/tensorflow/python/client/session.py in for_fetch(fetch)
    259     elif isinstance(fetch, (list, tuple)):
    260       # NOTE(touts): This is also the code path for namedtuples.
--> 261       return _ListFetchMapper(fetch)
    262     elif isinstance(fetch, collections.Mapping):
    263       return _DictFetchMapper(fetch)

/usr/local/lib/python3.6/dist-packages/tensorflow/python/client/session.py in __init__(self, fetches)
    368     """
    369     self._fetch_type = type(fetches)
--> 370     self._mappers = [_FetchMapper.for_fetch(fetch) for fetch in fetches]
    371     self._unique_fetches, self._value_indices = _uniquify_fetches(self._mappers)
    372 

/usr/local/lib/python3.6/dist-packages/tensorflow/python/client/session.py in <listcomp>(.0)
    368     """
    369     self._fetch_type = type(fetches)
--> 370     self._mappers = [_FetchMapper.for_fetch(fetch) for fetch in fetches]
    371     self._unique_fetches, self._value_indices = _uniquify_fetches(self._mappers)
    372 

/usr/local/lib/python3.6/dist-packages/tensorflow/python/client/session.py in for_fetch(fetch)
    269         if isinstance(fetch, tensor_type):
    270           fetches, contraction_fn = fetch_fn(fetch)
--> 271           return _ElementFetchMapper(fetches, contraction_fn)
    272     # Did not find anything.
    273     raise TypeError('Fetch argument %r has invalid type %r' % (fetch,

/usr/local/lib/python3.6/dist-packages/tensorflow/python/client/session.py in __init__(self, fetches, contraction_fn)
    302         raise TypeError('Fetch argument %r has invalid type %r, '
    303                         'must be a string or Tensor. (%s)' %
--> 304                         (fetch, type(fetch), str(e)))
    305       except ValueError as e:
    306         raise ValueError('Fetch argument %r cannot be interpreted as a '

TypeError: Fetch argument 5.690171 has invalid type <class 'numpy.float32'>, must be a string or Tensor. (Can not convert a float32 into a Tensor or Operation.)

<以下、更新前の原文>
GitHubの記事を参考にTensorFlowでアヤメの分類問題をやっているのですが、恐らくデータ型のエラーがどうしても解消できません。
コスト関数の最適化のとこでエラーが出ていますが、上の記事と見合わせても、データ型的にどこが間違えているのかがわかりません。
解決の方法がわかる方、是非ご教授くださると助かります。
試行錯誤して色々書き換えると様々なエラーが生じるので、もしかしたら多くの個所がおかしいのかもしれません。

書いたコード

from urllib.request import urlretrieve
import pandas as pd
import numpy as np
import tensorflow as tf
from sklearn.model_selection import train_test_split

# データの呼び出し
url = '上記記事のコードのURL'
urlretrieve(url, 'iris.csv')
df = pd.read_csv('iris.csv', encoding='utf-8')

# データの準備
names = sorted(set(df.Name.values))
name2num = {w:i for i, w in enumerate(names)}
df['label'] = df['Name'].map(name2num)
X = df.iloc[:,:4].values
y = df.label.values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, stratify=y, random_state=0)


# グラフの作成
g = tf.Graph()
with g.as_default():
  tf.set_random_seed(123)

  tf_x = tf.placeholder(tf.float32, shape=(None, 4), name='tf_x')
  tf_y = tf.placeholder(tf.int32, shape=(None), name='tf_y')

  oh_y = tf.one_hot(tf_y, 3, dtype=tf.float32, name='oh_y')

  w = tf.Variable(tf.random_normal((4, 3)), name='weight')
  b = tf.Variable(tf.zeros(3), name='bias')

  logits = tf.add(tf.matmul(tf_x, w), b, name='logits')

  prediction = {'probabilities': tf.nn.softmax(logits, name='probabilities'),
                'labels': tf.cast(tf.argmax(logits,1), tf.int32)}

#   cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=logits, labels=oh_y), name='cost')
  cost = -tf.reduce_sum(oh_y * tf.log(prediction['probabilities']))
  optimizer = tf.train.AdamOptimizer()
  train = optimizer.minimize(cost)
  correct_predictions = tf.equal(prediction['labels'], tf.cast(tf.argmax(oh_y, 1), tf.int32))
  accuracy = tf.reduce_mean(tf.cast(correct_predictions, tf.float32), name='accuracy')  
  init = tf.global_variables_initializer()


# 実行  
with tf.Session(graph=g) as sess:
  sess.run(init)

  for step in range(300):
    _, cost, accuracy = sess.run([train, cost, accuracy], feed_dict={tf_x: X_train, tf_y: y_train})
    if (step + 1) % 10 == 0:
      print('Epoch%2d Cost:%.2f Accuracy:%.2f%%' %(step+1, cost, accuracy*100))

  print('Prediction Accuracy: %.2f' %(sess.run(accuracy, feed_dict={tf_x: X_test, tf_y: y_test}) * 100))

生じているエラー(追記時に字数が足りなくなったので削りました)

---------------------------------------------------------------------------
TypeError: Fetch argument 682.8205 has invalid type <class 'numpy.float32'>, must be a string or Tensor. (Can not convert a float32 into a Tensor or Operation.)

環境など

Windows 10
Python 3.6.5

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

コードを見た限りだと、変数costの前が重複しているので、発生しているエラーだと思います。
1週目は、tensorのcostですが、`_, cost = ....で変数costが上書きされ、numpy.float32型のndarrayで出力されてしまい、2周目は、sess.run(...)を計算できないと考えられます。

  cost = tf.losses.softmax_cross_entropy(logits=logits, onehot_labels=oh_y)
  .....
実行
with tf.Session(graph=g) as sess:
  sess.run(init)
# ↓のfor文のrange(1)にすると、エラーが生じません。
  for step in range(2):
    ### ここで変数が上書きされてしまっている。
    _, cost= sess.run([train, cost], feed_dict={tf_x: X_train, tf_y: y_train})
    if (step + 1) % 10 == 0:
      print('Epoch%2d Cost:%.2f' %(step+1, cost))


そのため、for文で回す変数costをcost_valなどに変更するとエラーは消えると思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/01/31 17:02

    なるほど・・・Hiroki013さんのおっしゃる通りでした。
    costをcost_val、accuracyをaccに変えたらエラーがなくなり正常に動作しました!
    以後、繰り返しのとこは気をつけます。
    大変勉強になりました。有り難うございました!

    キャンセル

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

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

関連した質問

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