2017-11-28 9 views
0

私はテンソルフローが初めてで、深い学習ネットワークで遊んでいました。私は、各反復後にすべてのウェイトを四捨五入するカスタムを行いたいと思っていました。テンソルフローライブラリのラウンド関数では、値を小数点以下の桁数に丸めるオプションはありません。 だから私は私が得た出力だから四捨五入カスタムはテンソルの最初のアイテムにのみ働いていたと私は私が間違っているのかについてわからないこのtf.py_func、テンソル内の最初の要素にのみ適用されるカスタムテンソルフロー関数

[ 0.234567 0.71200001 1.20000005 1.70000005] [ 0.235  0.71200001 1.20000005 1.70000005] 

たこの

import numpy as np 
import tensorflow as tf 
from tensorflow.python.framework import ops 

np_prec = lambda x: np.round(x,3).astype(np.float32) 
def tf_prec(x,name=None): 
    with ops.name_scope("d_spiky", name,[x]) as name: 
      y = tf.py_func(np_prec, 
         [x], 
         [tf.float32], 
         name=name, 
         stateful=False) 
      return y[0] 
with tf.Session() as sess: 

    x = tf.constant([0.234567,0.712,1.2,1.7]) 
    y = tf_prec(x) 
    y = tf_prec(x) 
    tf.global_variables_initializer 

    print(x.eval(), y.eval()) 

を書きました。前もって感謝します。理由は次の行の

ここ

答えて

1

エラー、

np_prec = lambda x: np.round(x,3).astype(np.float32) 

あなたはnp.float32への出力をキャストしています。あなたは

print(np.round([0.234567,0.712,1.2,1.7], 3).astype(np.float32)) #prints [ 0.235  0.71200001 1.20000005 1.70000005] 

np.roundのデフォルトの出力は、のfloat64で、次のコードでエラーを確認することができます。さらに、のTout引数をに変更する必要があります。tf.py_funcfloat64

私は上記の修正で次のコードを与え、必要に応じてコメントしました。

import numpy as np 
import tensorflow as tf 
from tensorflow.python.framework import ops 

np_prec = lambda x: np.round(x,3) 
def tf_prec(x,name=None): 
    with ops.name_scope("d_spiky", name,[x]) as name: 
      y = tf.py_func(np_prec, 
         [x], 
         [tf.float64], #changed this line to tf.float64 
         name=name, 
         stateful=False) 
      return y[0] 
with tf.Session() as sess: 

    x = tf.constant([0.234567,0.712,1.2,1.7],dtype=np.float64) #specify the input data type np.float64 
    y = tf_prec(x) 
    y = tf_prec(x) 
    tf.global_variables_initializer 

    print(x.eval(), y.eval()) 

これが役に立ちます。

+0

ありがとうございました。できます :) – George

関連する問題