2017-04-07 10 views
0

計算グラフの作成中に、テンソルxがあります。 [-1, a, b, c]の形状を持つと私はそれをこの方法を実行しようとしました[-1, a*b*c] にそれを再構築したいと思います:テンソルのバッチをTensorFlowのベクトルバッチに変更する

n = functools.reduce(operator.mul, x.shape[1:], 1) 
tf.reshape(x, [-1, n]) 

が、私はエラーが持っている:

TypeError: unsupported operand type(s) for *: 'int' and 'Dimension' 

私の質問は:そこにあるのTensorは何かこの操作を行うために何かをしていますか?

答えて

3

エラーメッセージが示すとおり、タイプに問題があります。 TensorFlowプレースホルダを作成すると、たとえば次のようになります。

>>> import tensorflow as tf 
>>> x = tf.placeholder(tf.float16, shape=(None, 3,7,4)) 

、その上にshapeを呼び出すと、戻り値は

>>> x.shape 
TensorShape([Dimension(None), Dimension(3), Dimension(7), Dimension(4)]) 

であり、各要素、すなわちTensorFlowのDimensionクラス

>>> x.shape[1] 
<class 'tensorflow.python.framework.tensor_shape.Dimension'> 

あります。当然のことながら、operator.mul関数はそのような型で何をすべきか分かりません。幸運にも、tf.TensorShapeにはas_list()という関数があり、これは整数のリストとして形状を返します。

>>> import functools, operator 
>>> n = functools.reduce(operator.mul, x.shape.as_list()[1:], 1) 
>>> n 
84 
>>> y = tf.reshape(x, [-1, n]) 
:あなたが使用しているとして、それと

>>> x.shape.as_list() 
[None, 3, 7, 4] 

は、あなたは、要素nの数を計算することができます

関連する問題