2016-02-13 1 views
7

[int、-1]表記を使用してテンソルを変形したい(たとえば、画像を平坦化する)。しかし、私は最初の次元を前もって知らない。 1つのユースケースでは、大きなバッチをトレインし、次に小さいバッチで評価します。プレースホルダ値を使用したテンソルの変形

なぜこれが次のエラーを表示しますか:got list containing Tensors of type '_Message'

import tensorflow as tf 
import numpy as np 

x = tf.placeholder(tf.float32, shape=[None, 28, 28]) 
batch_size = tf.placeholder(tf.int32) 

def reshape(_batch_size): 
    return tf.reshape(x, [_batch_size, -1]) 

reshaped = reshape(batch_size) 


with tf.Session() as sess: 
    sess.run([reshaped], feed_dict={x: np.random.rand(100, 28, 28), batch_size: 100}) 

    # Evaluate 
    sess.run([reshaped], feed_dict={x: np.random.rand(8, 28, 28), batch_size: 8}) 

注:私は動作しているようです機能の再形成外を持っているが、私は複数回使用非常に大規模なモデルを持っているので、私は関数内でそれらを維持し、使用してDIMを渡す必要があるとき引数。

def reshape(_batch_size): 
    return tf.reshape(x, [_batch_size, -1]) 

...機能付き:

def reshape(_batch_size): 
    return tf.reshape(x, tf.pack([_batch_size, -1])) 

エラーの理由はtf.reshape()tf.Tensorように変換された値を期待していることで、この作業を行う機能を置き換えるために

答えて

9

2番目の引数。 TensorFlowは自動的にPythonの数字のリストをtf.Tensorに変換しますが、数字とテンソルの混合リスト(例えばtf.placeholder())を自動的には変換しません - あなたが見たやや直感的なエラーメッセージを生成します。

opはリストテンソルに変換可能なオブジェクトを持ち、各要素を個別に変換するので、プレースホルダと整数の組み合わせを処理できます。

+0

tf.pack()を使用していくつかの問題が発生しました。 'x = reshape(100)'は 'x.get_shape()。as_list()[ - 1]'を実行できなくなりました。 Nonetypeは反復可能ではないので、形状情報が失われています。これに関するコメント? – jstaker7

+1

'batch_size'プレースホルダを定義するときに' shape =() 'を指定してみてください。 'Tensor.set_shape()'を使用して、後で依存する場合、推定されない追加のシェイプ情報を提供することもできます。 – mrry

+0

優秀、ありがとう! – jstaker7

0

こんにちは、すべての問題はKerasのバージョンに起因します。私は何よりも何の成功もなしに試みました。 Kerasをアンインストールし、pip経由でインストールしてください。それは私のために働いた。

私はKeras 1.2.0

で解決Keras 1.0.2 &で、このエラーに直面していたこれが役立つことを願っています。ありがとうございました

関連する問題