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

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

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

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

Q&A

解決済

1回答

1062閲覧

pythonで別のpyhonファイルからclassが呼び出せない原因

trafalbad

総合スコア303

Python

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

0グッド

0クリップ

投稿2019/06/30 17:02

下のpythonファイル(dice_coefficient_loss.py)からclassのDiceconf_Lossを呼び出そうとしたのですが、エラーが出て呼び出せません。ちなみにclassのコードはこちらのサイトを参考にしました。

呼び出し

python

1from dice_coefficient_loss import Diceconf_Loss 2 3model = unet() 4# model.load_weights("10_unet.hdf5") 5model.compile(loss=Diceconf_Loss.dice_coef_loss, optimizer=Adam(lr=1e-4), 6 metrics=[Diceconf_Loss.dice_coef]) 7 8model.summary()

エラー

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-6-af8760623381> in <module>() 21 # model.load_weights("10_unet.hdf5") 22 model.compile(loss=Diceconf_Loss.dice_coef_loss, optimizer=Adam(lr=1e-4), ---> 23 metrics=[Diceconf_Loss.dice_coef]) 24 25 model.summary() 1 frames /usr/local/lib/python3.6/dist-packages/keras/engine/training_utils.py in weighted(y_true, y_pred, weights, mask) 402 """ 403 # score_array has ndim >= 2 --> 404 score_array = fn(y_true, y_pred) 405 if mask is not None: 406 # Cast the mask to floatX to avoid float64 upcasting in Theano TypeError: dice_coef_loss() missing 1 required positional argument: 'y_pred'

原因がわからないので、解決策を教えていだけないでしょうか?

python

1# dice_coefficient_loss.py 2import keras.backend as K 3import tensorflow as tf 4import numpy as np 5 6class Diceconf_Loss(): 7 # ロス関数 8 def dice_coef_loss(self, y_true, y_pred): 9 return 1.0 - self.dice_coef(y_true, y_pred) 10 11 12 def dice_coef(self, y_true, y_pred): 13 y_true = K.flatten(y_true) 14 y_pred = K.flatten(y_pred) 15 intersection = K.sum(y_true * y_pred) 16 return 2.0 * intersection / (K.sum(y_true) + K.sum(y_pred) + 1) 17 18 19 20class DiceLossByClass(): 21 def __init__(self, input_shape, class_num): 22 self.__input_h = input_shape[0] 23 self.__input_w = input_shape[1] 24 self.__class_num = class_num 25 26 27 def dice_coef(self, y_true, y_pred): 28 y_true = K.flatten(y_true) 29 y_pred = K.flatten(y_pred) 30 intersection = K.sum(y_true * y_pred) 31 denominator = K.sum(y_true) + K.sum(y_pred) 32 if denominator == 0: 33 return 1 34 if intersection == 0: 35 return 1 / (denominator + 1) 36 return (2.0 * intersection) / denominator 37 #return (2.0 * intersection + 1) / (KB.sum(y_true) + KB.sum(y_pred) + 1) 38 39 40 def dice_coef_loss(self, y_true, y_pred): 41 # (N, h, w, ch) 42 y_true_res = tf.reshape(y_true, (-1, self.__input_h, self.__input_w, self.__class_num)) 43 y_pred_res = tf.reshape(y_pred, (-1, self.__input_h, self.__input_w, self.__class_num)) 44 y_trues = tf.unstack(y_true_res, axis=3) 45 y_preds = tf.unstack(y_pred_res, axis=3) 46 47 losses = [] 48 for y_t, y_p in zip(y_trues, y_preds): 49 losses.append((1 - self.dice_coef(y_t, y_p))*3) 50 51 # return tf.reduce_mean(tf.stack(losses)) 52 return tf.reduce_sum(tf.stack(losses)) 53 #return 1 - self.dice_coef(y_true, y_pred)

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

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

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

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

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

guest

回答1

0

ベストアンサー

クラス内に定義した関数は、そのままではただのクラスに束縛された関数です。とりあえず、self引数が余計にあるので、引数の数の辻褄が合わなくなります。

インスタンス化することで初めてメソッドとして使えます。

python

1>>> class Hoge: 2... def f(self, x): 3... print(x) 4... 5>>> Hoge.f # そのまま見てみる 6<function Hoge.f at 0x7fedf281f840> 7>>> Hoge.f("今回はなんでもいい", "hoge") # そのまま呼び出す(真似しないで) 8hoge 9>>> h = Hoge() # インスタンス化してみる(正しいやり方) 10>>> h.f # メソッドオブジェクトが取れることを確認 11<bound method Hoge.f of <__main__.Hoge object at 0x7fedf278a320>> 12>>> h.f("hoge") # 呼び出す(正しい方法) 13hoge

なので、loss=Diceconf_Loss().dice_coef_lossのようにすれば良いのかもしれませんが……

コードを見る限り、特にクラスにする必然性がなさそうに思えます。単に関数を2つ定義した方がスマートではないでしょうか?

python

1def dice_coef_loss(y_true, y_pred): 2 return 1.0 - dice_coef(y_true, y_pred) 3 4def dice_coef(y_true, y_pred): 5 y_true = K.flatten(y_true) 6 y_pred = K.flatten(y_pred) 7 intersection = K.sum(y_true * y_pred) 8 return 2.0 * intersection / (K.sum(y_true) + K.sum(y_pred) + 1)

どうしても一つのクラスに押し込みたいのであれば、classmethodstaticmethodにする、という手もあります。必要もないのにインスタンスを作って使うよりは良い解決策だと思います(デコレータをつけて引数フォーマットを変えるだけなのでコードは省略)。

投稿2019/06/30 18:33

hayataka2049

総合スコア30933

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

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

trafalbad

2019/06/30 20:02

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問