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

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

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

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

Python

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

Q&A

解決済

1回答

2242閲覧

Pythonのself.attr(attr)はどの様な意味ですか?(引数の後ろ()の中に,引数がある)

Shirui

総合スコア7

Keras

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

Python

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

0グッド

0クリップ

投稿2018/09/07 08:56

編集2018/09/07 10:37

KerasのLearningRateScheduler(Callback)クラスを自作したいのですが,元のKerasのコードをみて,以下の様な問題があります.

Python

1class LearningRateScheduler(Callback): 2 """Learning rate scheduler. 3 # Arguments 4 schedule: a function that takes an epoch index as input 5 (integer, indexed from 0) and current learning rate 6 and returns a new learning rate as output (float). 7 verbose: int. 0: quiet, 1: update messages. 8 """ 9 10 11 def __init__(self, schedule, verbose=0): 12 super(LearningRateScheduler, self).__init__() 13 self.schedule = schedule 14 self.verbose = verbose 15 16 def on_epoch_begin(self, epoch, logs=None): 17 if not hasattr(self.model.optimizer, 'lr'): 18 raise ValueError('Optimizer must have a "lr" attribute.') 19 lr = float(K.get_value(self.model.optimizer.lr)) 20 try: # new API 21 lr = self.schedule(epoch, lr) 22 except TypeError: # old API for backward compatibility 23 lr = self.schedule(epoch) 24 if not isinstance(lr, (float, np.float32, np.float64)): 25 raise ValueError('The output of the "schedule" function ' 26 'should be float.') 27 K.set_value(self.model.optimizer.lr, lr) 28 if self.verbose > 0: 29 print('\nEpoch %05d: LearningRateScheduler setting learning ' 30 'rate to %s.' % (epoch + 1, lr)) 31 32 def on_epoch_end(self, epoch, logs=None): 33 logs = logs or {} 34 logs['lr'] = K.get_value(self.model.optimizer.lr)

**lr = float(K.get_value(self.model.optimizer.lr))**コードでは,
selfを用い,「他クラスのインスタンスの属性を得ている」様に見えますが,この様な理解で宜しいですか?
スーパークラスのinit()にself.model = Noneコードがありました.
結論として,『selfを用い,「他クラスのインスタンスの属性を得ている」』ではないです.
以下スーパークラスのCallback(object)となります.

**lr = self.schedule(epoch, lr)**コードでは,
selfを用い,得た属性の後ろに又属性を加えているのですが(関数の使用に似ているのですが),この様な使い方の意味は,どの様なものでしょうか?

宜しくお願い致します.

Python

1class Callback(object): 2 """Abstract base class used to build new callbacks. 3 4 # Properties 5 params: dict. Training parameters 6 (eg. verbosity, batch size, number of epochs...). 7 model: instance of `keras.models.Model`. 8 Reference of the model being trained. 9 10 The `logs` dictionary that callback methods 11 take as argument will contain keys for quantities relevant to 12 the current batch or epoch. 13 14 Currently, the `.fit()` method of the `Sequential` model class 15 will include the following quantities in the `logs` that 16 it passes to its callbacks: 17 18 on_epoch_end: logs include `acc` and `loss`, and 19 optionally include `val_loss` 20 (if validation is enabled in `fit`), and `val_acc` 21 (if validation and accuracy monitoring are enabled). 22 on_batch_begin: logs include `size`, 23 the number of samples in the current batch. 24 on_batch_end: logs include `loss`, and optionally `acc` 25 (if accuracy monitoring is enabled). 26 """ 27 28 def __init__(self): 29 self.validation_data = None 30 self.model = None 31 32 def set_params(self, params): 33 self.params = params 34 35 def set_model(self, model): 36 self.model = model 37 38 def on_epoch_begin(self, epoch, logs=None): 39 pass 40 41 def on_epoch_end(self, epoch, logs=None): 42 pass 43 44 def on_batch_begin(self, batch, logs=None): 45 pass 46 47 def on_batch_end(self, batch, logs=None): 48 pass 49 50 def on_train_begin(self, logs=None): 51 pass 52 53 def on_train_end(self, logs=None): 54 pass 55 56

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

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

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

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

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

guest

回答1

0

ベストアンサー

どこまで理解されているかわからないので回答しづらいのですが、

self.schedule(epoch, lr)はメソッド関数呼び出しです。

そしてそこの左辺のlrはメソッドのローカル変数で、属性ではありません。

投稿2018/09/07 11:18

編集2018/09/07 12:54
hayataka2049

総合スコア30933

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

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

Shirui

2018/09/07 11:55

ご回答頂きありがとうございます. 1.「self.schedule(epoch, lr)はメソッド呼び出しです」につきましてですが, スーパークラスのCallback(object)及び派生クラスのLearningRateScheduler(Callback), どちらにも「def schedule(epoch, lr)」のメソッド定義がない,が現状僕の理解です. LearningRateScheduler(Callback)のdef __init__(self, schedule, verbose=0)に, 「self.schedule = schedule」がありますが,これは「引数の値をローカル変数に渡している」, が現状僕の理解です. 2.「そこの左辺のlrはメソッドのローカル変数で、属性ではありません」名称概念が曖昧です. 自分の勉強不足です.改めて学習し直します.
hayataka2049

2018/09/07 12:04

scheduleは考えてみればメソッドとして定義されていないですね。私の説明の間違いです。 実際はコンストラクタの__init__で関数オブジェクトとして渡されているのですね。
hayataka2049

2018/09/07 12:06

>引数の値をローカル変数に渡している 引数の関数オブジェクトをインスタンス変数に代入していると捉えるべきかと
Shirui

2018/09/07 12:10

「Pythonでは,関数に,引数として他の関数を渡すことができる」,と新しい認識です. (以前知らなかったです,自分の勉強不足です.) そしてなのですが,「schedule(epoch, lr)」のメソッドですが,Kerasでは,どの様に定義されているか,ご存知でしょうか?
hayataka2049

2018/09/07 12:53

自分で好きな関数を書いて渡せば良いのですね。 docstringの schedule: a function that takes an epoch index as input (integer, indexed from 0) and current learning rate and returns a new learning rate as output (float). がすべてです。
Shirui

2018/09/07 18:34

ご回答頂きありがとうございます. すみません,僕の文章表現が曖昧でした. 「Learning rate scheduler」は,「自作した関数を使用できる」, 逆に,「自作しなくても,元々Kerasにはそれに対応する関数がある」 が僕の認識です. (あまり細かいプログラミングをしなくても,Kerasは使えていたので) ですので,自作の関数がない際,Kerasはどの様な関数を使用しているのでしょうか?
hayataka2049

2018/09/08 01:08

そういう場合はLearningRateScheduler以外のスケジューラを使うのでは。 scheduleに与える関数は普通は簡単なものです。たとえば、 lambda epoch, lr: 1/(1+epoch) とかで良いと思います。
Shirui

2018/09/08 08:44

ご回答頂きありがとうございます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問