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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

852閲覧

kerasで四捨五入をするバックエンド関数について

Kohei_KESE

総合スコア41

Keras

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/12/26 07:17

現在、セグメンテーション課題に取り組んでまして、Dice係数をlossに適用しようと考えています。そこで、ネットに転がっていたプログラムに四捨五入の項を付け加えて使用しようと考えています。下記のnpの部分をkeras.backendに置き換えたいのですが、方法がわかりませんでした。アドバイスお願いします。

Python

1#Calculate dice coefficient 2def dice_coef(y_true, y_pred): 3 y_true_f = K.flatten(y_true) 4 y_pred_f = K.flatten(y_pred) 5 y_true_f = np.round(y_true_f) 6 y_pred_f = np.round(y_pred_f) 7# y_pred_f = K.int(y_pred_f) 8 intersection = K.sum(y_true_f * y_pred_f) 9 return (2.0 * intersection + 1) / (K. sum(y_true_f) + K.sum(y_pred_f) + 1) 10 11def dice_coef_loss(y_true, y_pred): 12 return - dice_coef(y_true, y_pred)

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

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

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

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

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

guest

回答1

0

ベストアンサー

keras.backend.round(x) があるので、これをお使いください。

投稿2018/12/26 07:22

tiitoi

総合スコア21956

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

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

Kohei_KESE

2018/12/26 07:26 編集

回答ありがとうございます。 K.roundに変えたところ以下のエラーが出てストップしました。何か対策はありますでしょうか? model.fitの部分です。 --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-17-97b0a25eb6f8> in <module>() 12 # callbacks = [tsb] 13 callbacks = [model_checkpoint], ---> 14 shuffle=True) 15 16 # 終了時刻 ~/anaconda3/lib/python3.6/site-packages/keras/engine/training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, **kwargs) 1008 else: 1009 ins = x + y + sample_weights -> 1010 self._make_train_function() 1011 f = self.train_function 1012 ~/anaconda3/lib/python3.6/site-packages/keras/engine/training.py in _make_train_function(self) 507 training_updates = self.optimizer.get_updates( 508 params=self._collected_trainable_weights, --> 509 loss=self.total_loss) 510 updates = (self.updates + 511 training_updates + ~/anaconda3/lib/python3.6/site-packages/keras/legacy/interfaces.py in wrapper(*args, **kwargs) 89 warnings.warn('Update your `' + object_name + '` call to the ' + 90 'Keras 2 API: ' + signature, stacklevel=2) ---> 91 return func(*args, **kwargs) 92 wrapper._original_function = func 93 return wrapper ~/anaconda3/lib/python3.6/site-packages/keras/optimizers.py in get_updates(self, loss, params) 473 @interfaces.legacy_get_updates_support 474 def get_updates(self, loss, params): --> 475 grads = self.get_gradients(loss, params) 476 self.updates = [K.update_add(self.iterations, 1)] 477 ~/anaconda3/lib/python3.6/site-packages/keras/optimizers.py in get_gradients(self, loss, params) 89 grads = K.gradients(loss, params) 90 if None in grads: ---> 91 raise ValueError('An operation has `None` for gradient. ' 92 'Please make sure that all of your ops have a ' 93 'gradient defined (i.e. are differentiable). ' ValueError: An operation has `None` for gradient. Please make sure that all of your ops have a gradient defined (i.e. are differentiable). Common ops without gradient: K.argmax, K.round, K.eval.
tiitoi

2018/12/26 07:32

ValueError: An operation has `None` for gradient. Please make sure that all of your ops have a gradient defined (i.e. are differentiable). Common ops without gradient: K.argmax, K.round, K.eval. エラーの通り、K.round() は微分が定義できないので、損失関数に使うことはできないということだと思います。 微分が定義できないとバックプロパゲーションが行えないので学習できません。
Kohei_KESE

2018/12/26 07:54

y_predが0,1の2値配列なのに対し、y_trueが少数を含む配列なので、正しくdice_coefが計算できないことが今回の質問でしたが、lossの部分ではなく、その前の入力の部分にnp.roundをかけてあげることで正しい値を表示することができました。 回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問