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

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

ただいまの
回答率

89.10%

入力値によって異なる損失関数を用いる方法

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 74

morimana

score 0

前提・実現したいこと

初心者です。
tensorflowを使い、入力値によって異なる損失関数を用いるディープニューラルネットワークを実装したいと思っています。
その簡単な例として入力値が0の時だけ損失関数が0となるプログラムを書いたのですが、以下のようなエラーメッセージが発生しました。
エラーの意味もよく分かっておらず、どこを直せば良いのか教えていただけるととても嬉しいです。どうぞよろしくお願い致します。

Traceback (most recent call last):
  File "/Users/XXX/.pyenv/versions/3.7.3/lib/python3.7/site-packages/tensorflow/python/ops/gen_math_ops.py", line 8631, in select_v2
    tld.op_callbacks, condition, t, e)
tensorflow.python.eager.core._FallbackException: This function does not handle the case of the path where all inputs are not already EagerTensors.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "ex11_v6.py", line 36, in <module>
    model = build_model()
  File "ex11_v6.py", line 31, in build_model
    model.compile(loss=custom_loss(train_dataset),
  File "ex11_v6.py", line 29, in custom_loss
    return tf.where(cond, zero_loss, MSE)
  File "/Users/XXX/.pyenv/versions/3.7.3/lib/python3.7/site-packages/tensorflow/python/ops/array_ops.py", line 4346, in where_v2
    return gen_math_ops.select_v2(condition=condition, t=x, e=y, name=name)
  File "/Users/XXX/.pyenv/versions/3.7.3/lib/python3.7/site-packages/tensorflow/python/ops/gen_math_ops.py", line 8636, in select_v2
    condition, t, e, name=name, ctx=_ctx)
  File "/Users/XXX/.pyenv/versions/3.7.3/lib/python3.7/site-packages/tensorflow/python/ops/gen_math_ops.py", line 8657, in select_v2_eager_fallback
    _attr_T, _inputs_T = _execute.args_to_matching_eager([t, e], ctx)
  File "/Users/XXX/.pyenv/versions/3.7.3/lib/python3.7/site-packages/tensorflow/python/eager/execute.py", line 263, in args_to_matching_eager
    t, dtype, preferred_dtype=default_dtype, ctx=ctx))
  File "/Users/XXX/.pyenv/versions/3.7.3/lib/python3.7/site-packages/tensorflow/python/framework/ops.py", line 1341, in convert_to_tensor
    ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref)
  File "/Users/XXX/.pyenv/versions/3.7.3/lib/python3.7/site-packages/tensorflow/python/framework/constant_op.py", line 321, in _constant_tensor_conversion_function
    return constant(v, dtype=dtype, name=name)
  File "/Users/XXX/.pyenv/versions/3.7.3/lib/python3.7/site-packages/tensorflow/python/framework/constant_op.py", line 262, in constant
    allow_broadcast=True)
  File "/Users/XXX/.pyenv/versions/3.7.3/lib/python3.7/site-packages/tensorflow/python/framework/constant_op.py", line 270, in _constant_impl
    t = convert_to_eager_tensor(value, ctx, dtype)
  File "/Users/XXX/.pyenv/versions/3.7.3/lib/python3.7/site-packages/tensorflow/python/framework/constant_op.py", line 96, in convert_to_eager_tensor
    return ops.EagerTensor(value, ctx.device_name, dtype)
ValueError: Attempt to convert a value (<function build_model.<locals>.custom_loss.<locals>.MSE at 0x135288400>) with an unsupported type (<class 'function'>) to a Tensor.

該当のソースコード

import tensorflow as tf
import numpy as np

from tensorflow import keras
from tensorflow.keras import layers

train_dataset = np.array([0.,0.,1.,2.,4.])
train_labels = np.array([2.,1.,3.,2.,5.])

def build_model():
  model = keras.Sequential([
    layers.Dense(2, activation='tanh', dtype='float32', input_shape=(1,)),
    layers.Dense(1)
  ])

  def custom_loss(x):

    cond = (x == 0) 

    zero_loss = tf.keras.backend.zeros((5,1))

    def MSE(y_true, y_pred):
      error = y_true - y_pred
      squared_loss = tf.keras.backend.square(error)
      return squared_loss    

#    return MSE
#    return zero_loss
    return tf.where(cond, zero_loss, MSE)

  model.compile(loss=custom_loss(train_dataset),
                optimizer='RMSprop',
                metrics=['mae','mse'])
  return model

model = build_model()

model.summary()

model.train_on_batch(train_dataset, train_labels)

試したこと

return tf.where...の行をreturn MSEとするとエラーは出なくなりますが、return zero_lossにすると以下のエラーが出ました。

Traceback (most recent call last):
  File "ex11_v6.py", line 36, in <module>
    model = build_model()
  File "ex11_v6.py", line 33, in build_model
    metrics=['mae','mse'])
  File "/Users/XXX/.pyenv/versions/3.7.3/lib/python3.7/site-packages/tensorflow/python/keras/engine/training.py", line 338, in compile
    self.loss = loss or {}  # Backwards compat.
  File "/Users/XXX/.pyenv/versions/3.7.3/lib/python3.7/site-packages/tensorflow/python/ops/resource_variable_ops.py", line 474, in __bool__
    return bool(self.read_value())
  File "/Users/XXX/.pyenv/versions/3.7.3/lib/python3.7/site-packages/tensorflow/python/framework/ops.py", line 884, in __bool__
    return bool(self._numpy())
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

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

macOS Catalina バージョン10.15.4
Python 3.7.3
Tensorflow 2.2.0
Keras 2.3.1

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

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

  • ただいまの回答率 89.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る