web-dev-qa-db-ja.com

Tensorflow TensorをNumpy Arrayに変換します

問題の説明

Tensorflow 2.3.0にカスタムロス関数を書いてみています。損失を計算するには、numpy配列に変換するy_predパラメータが必要です。ただし、Tensorflow関数がそうするようにされている場合でも、<class 'tensorflow.python.framework.ops.Tensor'>からnumpy配列に変換する方法が見つかりません。

コード例

def custom_loss(y_true, y_pred):
    print(type(y_pred))
    npa = y_pred.make_ndarray()
    ...
    

if __name__ == '__main__':
    ...
    model.compile(loss=custom_loss, optimizer="adam")
    model.fit(x=train_data, y=train_data, epochs=10)

エラーメッセージを表示します。AttributeError: 'Tensor' object has no attribute 'make_ndarrayパラメータのタイプを印刷した後のy_pred<class 'tensorflow.python.framework.ops.Tensor'>

私が今まで試したこと

私がこれが一般的な問題であり、いくつかの提案があるように思われる解決策を探していますが、これまでに私のために働きませんでした。

1。 "...だからテンソルオブジェクトのnumpy()を呼び出します。 Tensorflowのテンソルをnumpy配列に変換するにはどうすればよいですか?

だから私は試してみました:

def custom_loss(y_true, y_pred):
    npa = y_pred.numpy()
    ...

AttributeError: 'Tensor' object has no attribute 'numpy'を与える

2。 msgstr "tensorflow.tensor.eval()を使用して、テンソルを配列に変換する": PythonのTensorflowテンソルをnumpy配列に変換する方法

だから私は試してみました:

def custom_loss(y_true, y_pred):
    npa = y_pred.eval(session=tf.compat.v1.Session())
    ...

私に最長のトレースの一人が私が今までであることを見たことがある:

InvalidArgumentError: 2 root error(s) found.
      (0) Invalid argument: You must feed a value for placeholder tensor 'functional_1/conv2d_2/BiasAdd/ReadVariableOp/resource' with dtype resource
         [[node functional_1/conv2d_2/BiasAdd/ReadVariableOp/resource (defined at main.py:303) ]]
         [[functional_1/cropping2d/strided_slice/_1]]
      (1) Invalid argument: You must feed a value for placeholder tensor 'functional_1/conv2d_2/BiasAdd/ReadVariableOp/resource' with dtype resource
         [[node functional_1/conv2d_2/BiasAdd/ReadVariableOp/resource (defined at main.py:303) ]]

また、バージョン1.xからTensorflow互換機能を呼び出す必要がありますので、将来証明を感じませんので、このアプローチが多すぎるのはあまり好きではありません。

。 Tensorflowドキュメントを見ると、待機した機能があるように見えました. tf.make_ndarray テンソルからNDArrayを作成します。

だから私は試してみました:

def custom_loss(y_true, y_pred):
    npa = tf.make_ndarray(y_pred)
    ...

AttributeError: 'Tensor' object has no attribute 'tensor_shape'を与える

TF文書の例を調べて、Proto_tensorでこれを使用するので、最初にプロトに変換しようとしました。

def custom_loss(y_true, y_pred):
    proto_tensor = tf.make_tensor_proto(y_pred)
    npa = tf.make_ndarray(proto_tensor)
    ...

しかし、tf.make_tensor_proto(y_pred)はエラーを発生させます:TypeError: Expected any non-tensor type, got a tensor instead.

Const Tensorを最初に同じエラーにするようにしようとしている:

def custom_loss(y_true, y_pred):
    a = tf.constant(y_pred)
    proto_tensor = tf.make_tensor_proto(a)
    npa = tf.make_ndarray(proto_tensor)
    ...

これの周りに多くの投稿がありますが、すべてこれら3つの基本的なアイデアに戻ってくるようです。あなたの提案を楽しみにしています!

5
Frank Jacob

y_pred.numpy() TF 2で動作しますが、AttributeError: 'Tensor' object has no attribute 'make_ndarrayTensorオブジェクトがEagerTensor _ _オブジェクトを持っていないため、EAGERモードで実行されていないコードの一部があることを示します。

EAGERモードを有効にするには、グラフ内の何も構築される前に、これをコードの先頭に置きます。

tf.config.experimental_run_functions_eagerly(True)
 _

次に、モデルをコンパイルすると、このパラメータを追加します。

model.compile(..., run_eagerly=True, ...)
 _

今、あなたはEAGERモードで実行し、すべての変数は実際にあなたが印刷して動作することができる値を保持します。 EAGERモードへの切り替えには、コードに対する追加の調整が必要な場合があります(概要のために、 こちら を参照)。

0
runDOSrun