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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

CNN (Convolutional Neural Network)

CNN (Convolutional Neural Network)は、全結合層のみではなく畳み込み層とプーリング層で構成されるニューラルネットワークです。画像認識において優れた性能を持ち、畳み込みニューラルネットワークとも呼ばれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

405閲覧

自作loss関数でエラーがでます[Python, TensorFlow, Keras]

nishimizuumi

総合スコア1

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

CNN (Convolutional Neural Network)

CNN (Convolutional Neural Network)は、全結合層のみではなく畳み込み層とプーリング層で構成されるニューラルネットワークです。画像認識において優れた性能を持ち、畳み込みニューラルネットワークとも呼ばれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2023/02/15 06:38

実現したいこと

自作のloss関数を走らせたい。
(可能ならばgeneraterを使用しない手法が知りたいです。)

前提

現在医療系大学にて超解像を勉強中です。
今年度から本格的に取り組み始めた初学者です。
SSIM lossなどの自作loss関数などの作成はできましたが、
トレーニングの低画質画像をlossに含もうとするとエラーが出ます。
Python, TensorFlow, Kerasを使用。

発生している問題・エラーメッセージ

超解像の学習時に自作のloss関数でlow resolution画像を計算に含みたいができません。
本来def loss(y_true, y_pred):より高解像度画像と推論画像とでlossを計算しますが、
ここに低解像度画像を含みたいです。

tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name, tensorflow.python.framework.errors_impl.InvalidArgumentError: Incompatible shapes: [16,48,48,1] vs. [41,48,48,1] [[node loss/sub_1 (defined at \Users\PycharmProjects\DL\loss_function.py:105) ]] [Op:__inference_train_function_17330] Errors may have originated from an input operation. Input Source operations connected to node loss/sub_1: IteratorGetNext (defined at /Users/PycharmProjects/DL/RUN.py:153) Function call stack: train_function

該当のソースコード

Python

1# 前略 2 3def custom_loss(x_true): 4 def loss(y_true, y_pred): 5 return K.mean(K.square(y_pred - y_true) + K.square(y_true - x_true)) 6 return loss 7 8model.compile(optimizer=Adam(lr=lr, beta_1=0.9, beta_2=0.999, epsilon=1e-8), 9 metrics=[psnr], loss=[custom_loss(x_true=imagelow)]) 10 11training = model.fit(imagelow, imagehigh, epochs=ep, batch_size=bs, 12 validation_split=vs, shuffle=True, verbose=1) 13 14# 後略

試したこと

ネットでかなり調べたつもりですが、x_trueを使ってるサイトが見つかりません。
custom lossなどの作成についても調べましたが、(おそらく)batchサイズが異なることしかわかりませんでした。

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

Python, TensorFlow, Kerasを使用。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2023/02/15 09:27

> 自作loss関数でエラーがでます 自作でなければエラーなく実行できる、と理解して良いでしょうか?
nishimizuumi

2023/02/26 00:59

自作でなければ(MAE,MSEなど)実行できています
guest

回答1

0

ベストアンサー

x_trueを使うにはSubclassing APIを利用して,keras.Modelcompute_lossをカスタマイズしてください.質問にあるcustom_lossを9行目で記述しました.

Python

1import tensorflow as tf 2from keras.layers import Input, Activation, Add, BatchNormalization, Conv2D 3from keras.models import Model 4 5class OriginalModel(Model): 6 def compute_loss(self, x, y, y_pred, sample_weight): 7 loss = super().compute_loss(x, y, y_pred, sample_weight) 8 # append your loss 9 loss += tf.math.reduce_mean(tf.math.squared_difference(y, y_pred)) + tf.math.reduce_mean(tf.math.squared_difference(y, x)) 10 return loss 11 12def ResBlock(ch, k): 13 def apply(inputs): 14 x = Conv2D(ch, k, padding = "same", kernel_initializer = "he_uniform")(inputs) 15 x = BatchNormalization()(x) 16 x = Activation("swish")(x) 17 x = Conv2D(ch, k, padding = "same")(x) 18 return Add()([x, inputs]) 19 return apply 20 21def build_model(): 22 inputs = Input(shape = (32, 32, 3)) 23 x = Conv2D(64, 7, padding = "same")(inputs) 24 for _ in range(8): 25 x = ResBlock(64, 3)(x) 26 x = Conv2D(3, 3, padding = "same")(x) 27 return OriginalModel(inputs, x) # Use your model included original loss function 28 29model = build_model() 30 31model.compile( 32 optimizer = "adam", 33 loss = "huber", 34 metrics = ["mse", "mae"] 35)

もちろんコメントでも申し上げた通り,keras.Modeltrain_stepをカスタマイズして損失を新たに与えるのも可能です.

投稿2023/02/16 15:37

編集2023/02/16 19:00
PondVillege

総合スコア1579

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nishimizuumi

2023/02/26 01:04

ご回答くださりありがとうございます。またmodelの記述も含めご丁寧に回答くださりありがとうございます。現在所用でご回答の内容を自身で実行できておりませんが、早急にご回答くださったためベストアンサーにさせていただきました。自身で実行し改めて追加の質問をさせていただくことがあるかもしれません。よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問