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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1038閲覧

tensorflowの出力を1次元にする方法がわかりません

chain

総合スコア11

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2018/02/11 14:55

編集2018/02/11 15:52

前提・実現したいこと

tensorflowで出力のベクトルを1次元にするとエラーになります。たとえばplaceholderで[100,1]を指定したところに[100,]のものは代入できないよっていう感じで言われます。

でも実際は[100,]も[100,1]も100x1の行列なのですが・・・
どうすればよいでしょうか。

MNISTチュートリアルを行いたいわけではないのですが、今後出力を1次元にするプログラムを考えていて、MNISTで試したらエラーが出たということです。

発生している問題・エラーメッセージ

ValueError: Cannot feed value of shape (100,) for Tensor 'Placeholder_11:0', which has shape '(?, 1)'

該当のソースコード

python

1from tensorflow.examples.tutorials.mnist import input_data 2mnist=input_data.read_data_sets("MNIST_data/",one_hot=True) 3 4import tensorflow as tf 5 6x=tf.placeholder(tf.float32,[None,784]) 7 8W=tf.Variable(tf.zeros([784,1])) 9b=tf.Variable(tf.zeros([1])) 10 11y=tf.nn.softmax(tf.matmul(x,W)+b) 12 13y_=tf.placeholder(tf.float32,[None,1]) 14cross_entropy=tf.reduce_mean(-tf.reduce_sum(y_*tf.log(y),reduction_indices=[1])) 15 16train_step=tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy) 17 18init=tf.global_variables_initializer() 19 20sess=tf.Session() 21sess.run(init) 22 23for i in range(1000): 24 batch_xs,batch_ys=mnist.train.next_batch(100) 25 batch_ys=batch_ys[:,0] 26 sess.run(train_step,feed_dict={x:batch_xs,y_:batch_ys})

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

chain

2018/02/11 15:31

そのまま試すのは動いたのですが、今後作ろうと思っているプログラムの出力が1次元なので1次元出力を試したところエラーが出たんです。MNISTのチュートリアルを行うのが目的ではないので・・・
wakame

2018/02/11 15:38

その情報を質問文に追記しないと回答者が私と似たような回答か質問をするかなと思いました。あとfor文以下のソースコードのインデントがおかしいので修正してもらえますか。
chain

2018/02/11 15:53

指摘ありがとうございます。修正しました。
guest

回答1

0

ベストアンサー

厳密にいうと、(100,1)のarrayと(100,)のarrayは異なるものです。(100,1)は100行×1列の配列を意味していますが、(100,)は要素数が100の1次元ベクトルを意味しています。

y_=tf.placeholder(tf.float32,[None,1])

と定義している以上、feed_dictを使って与えるデータはn行×1列の配列(tensorといったほうが正しいかもしれません)である必要があります。skit-learnなどの関数はこの辺りの使い分けがあまり厳密ではないのですが、tensorflowは使い分けないとValueerrorになった記憶があります。
ということで、reshapeを使ってn行×1列に変換して実行すればエラーはなくなると思います。

投稿2018/02/11 16:02

編集2018/02/11 16:06
R.Shigemori

総合スコア3376

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

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

chain

2018/02/11 17:08

そういうことだったのですね。うまくいきました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問