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

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

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

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

Python 3.x

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

Q&A

解決済

2回答

4256閲覧

pythonのoptimizerの変更について

yone_yone

総合スコア28

Keras

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

Python 3.x

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

0グッド

0クリップ

投稿2019/05/29 10:36

簡単なニューラルネットワークをpythonで構築して、中身のoptimizerを
変更したいのですが、できなかったため質問させていただきます。

やりたいこととしては、コード内のoptimizerの部分をAdaBoundというものに
変更したいと考えています。
AdaBoundはclassとしており、
ニューラルネットワークと同じpyファイルには無く、別のpyファイルにあります。
そのため実行する際はimportしてAdaBoundを呼び出すようにしています。

こちらが現在使っているニューラルネットワークのソース(sample.py)となります。

python

1import keras 2from keras.datasets import boston_housing 3from keras.models import Sequential 4from keras.layers import Dense 5import AdaBound 6from torch.optim import Optimizer 7 8(X_train, y_train), (X_test, y_test) = boston_housing.load_data() 9 10AdaBound_class = AdaBound.AdaBound() 11 12 13#トレーニングデータの正規化 14X_train_mean = X_train.mean(axis=0) 15X_train_std = X_train.std(axis=0) 16X_train -= X_train_mean 17X_train /= X_train_std 18 19y_train_mean = y_train.mean() 20y_train_std = y_train.std() 21y_train -= y_train_mean 22y_train /= y_train_std 23 24#テストデータの正規化 25X_test -= X_train_mean 26X_test /= X_train_std 27y_test -= y_train_mean 28y_test /= y_train_std 29 30model = Sequential() 31model.add(Dense(64, activation='relu', input_shape=(X_train.shape[1],))) 32model.add(Dense(64, activation='relu')) 33model.add(Dense(1)) 34 35model.compile(optimizer= AdaBound_class,loss='mse',metrics=['mae']) 36#model.compile(optimizer='Adam',loss='mse',metrics=['mae']) 37 38history = model.fit(X_train, y_train, batch_size=5, epochs=5, verbose=1, validation_data=(X_test, y_\ 39test)) 40print(X_test) 41print(y_test) 42print(X_train)

こちらがAdaBoundのソース(AdaBound.py)になります。

python

1import math 2import torch 3from torch.optim import Optimizer 4 5class AdaBound(Optimizer): 6 7 8 def __init__(self, params, lr=1e-3, betas=(0.9, 0.999), final_lr=0.1, 9 gamma=1e-3,eps=1e-8, weight_decay=0, amsbound=False): 10 if not 0.0 <= lr: 11 raise ValueError("Invalid learning rate: {}".format(lr)) 12 if not 0.0 <= eps: 13 raise ValueError("Invalid epsilon value: {}".format(eps)) 14 if not 0.0 <= betas[0] < 1.0: 15 raise ValueError("Invalid beta parameter at index 0: {}".format(betas[0])) 16 if not 0.0 <= betas[1] < 1.0: 17 raise ValueError("Invalid beta parameter at index 1: {}".format(betas[1])) 18 if not 0.0 <= final_lr: 19 raise ValueError("Invalid final learning rate: {}".format(final_lr)) 20 if not 0.0 <= gamma < 1.0: 21 raise ValueError("Invalid gamma parameter: {}".format(gamma)) 22 defaults = dict(lr=lr, betas=betas, final_lr=final_lr, gamma=gamma, 23 eps=eps,weight_decay=weight_decay, amsbound=amsbound) 24 super(AdaBound, self).__init__(params, defaults) 25 26 self.base_lrs = list(map(lambda group: group['lr'], self.param_groups)) 27 28 def __setstate__(self, state): 29 super(AdaBound, self).__setstate__(state) 30 for group in self.param_groups: 31 group.setdefault('amsbound', False) 32 33 def step(self, closure=None): 34 """Performs a single optimization step. 35 Arguments: 36 closure (callable, optional): A closure that reevaluates the model 37 and returns the loss. 38 """ 39 loss = None 40 if closure is not None: 41 loss = closure() 42 43 for group, base_lr in zip(self.param_groups, self.base_lrs): 44 for p in group['params']: 45 if p.grad is None: 46 continue 47 grad = p.grad.data 48 if grad.is_sparse: 49 raise RuntimeError( 50 'Adam does not support sparse gradients, please consider SparseAdam instead'\ 51) 52 amsbound = group['amsbound'] 53 54 state = self.state[p] 55 56 # State initialization 57 if len(state) == 0: 58 state['step'] = 0 59 # Exponential moving average of gradient values 60 state['exp_avg'] = torch.zeros_like(p.data) 61 # Exponential moving average of squared gradient values 62 state['exp_avg_sq'] = torch.zeros_like(p.data) 63 if amsbound: 64 # Maintains max of all exp. moving avg. of sq. grad. values 65 state['max_exp_avg_sq'] = torch.zeros_like(p.data) 66 67 exp_avg, exp_avg_sq = state['exp_avg'], state['exp_avg_sq'] 68 if amsbound: 69 max_exp_avg_sq = state['max_exp_avg_sq'] 70 beta1, beta2 = group['betas'] 71 72 state['step'] += 1 73 74 if group['weight_decay'] != 0: 75 grad = grad.add(group['weight_decay'], p.data) 76 77 # Decay the first and second moment running average coefficient 78 exp_avg.mul_(beta1).add_(1 - beta1, grad) 79 exp_avg_sq.mul_(beta2).addcmul_(1 - beta2, grad, grad) 80 if amsbound: 81 # Maintains the maximum of all 2nd moment running avg. till now 82 torch.max(max_exp_avg_sq, exp_avg_sq, out=max_exp_avg_sq) 83 # Use the max. for normalizing running avg. of gradient 84 denom = max_exp_avg_sq.sqrt().add_(group['eps']) 85 else: 86 denom = exp_avg_sq.sqrt().add_(group['eps']) 87 bias_correction1 = 1 - beta1 ** state['step'] 88 bias_correction2 = 1 - beta2 ** state['step'] 89 step_size = group['lr'] * math.sqrt(bias_correction2) / bias_correction1 90 91 # Applies bounds on actual learning rate 92 # lr_scheduler cannot affect final_lr, this is a workaround to apply lr decay 93 final_lr = group['final_lr'] * group['lr'] / base_lr 94 lower_bound = final_lr * (1 - 1 / (group['gamma'] * state['step'] + 1)) 95 upper_bound = final_lr * (1 + 1 / (group['gamma'] * state['step'])) 96 step_size = torch.full_like(denom, step_size) 97 step_size.div_(denom).clamp_(lower_bound, upper_bound).mul_(exp_avg) 98 99 p.data.add_(-step_size) 100 return loss

現在出ているエラー内容がこちらになります。

error

1Traceback (most recent call last): 2 File "sample.py", line 10, in <module> 3 AdaBound_class = AdaBound.AdaBound() 4TypeError: __init__() missing 1 required positional argument: 'params'

こちらの__init__()なのですが、使っていないのに出ているのがよくわかりません。
分かる方がいましたら、回答いただけると助かります。

※ご回答いただいた内容に質問させていただくこともあるかと思いますので、
※よろしければご返信いただければと思います。

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

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

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

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

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

guest

回答2

0

そもそも、pytorchとkerasって併用できましたっけ?
仮に併用できるとしても、kerasを使うのであればkerasのOptimizerを継承して作るのが普通だと思います。
(私はやったことないので詳しいことは分かりませんが)

また、自前で実装せずとも、「AdaBound Keras」で調べれば、使えそうなものがいくつか出てくるのですが、そちらでは駄目なのでしょうか。

投稿2019/05/29 11:45

fiveHundred

総合スコア9801

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

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

yone_yone

2019/05/29 12:34

回答ありがとうございます。 知識不足で申し訳ありません。併用できるものだと思っていました。 kerasのドキュメントの方に載っていなかったので、てっきり自前しかないものだと思っていました。 私の調査不足でした。参考にさせていただきます。
guest

0

ベストアンサー

https://github.com/taki0112/AdaBound-Tensorflow

Tensorflow用のものを使ってみてください

投稿2019/05/29 11:50

mkgrei

総合スコア8560

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

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

yone_yone

2019/05/29 12:29

回答ありがとうございます。 tensorflow用があることに気づいていませんでした。 参考にさせていただきます。
yone_yone

2019/05/30 10:15 編集

度々すみません。 使ってみたのですが、 ```FailedPreconditionError (see above for traceback): Attempting to use uninitialized value Variable/AdaBound [[Node: Variable/AdaBound/read = Identity[T=DT_FLOAT, _class=["loc:@AdaBound/Assign_2"], _device="/job:localhost/replica:0/task:0/device:GPU:0"](Variable/AdaBound)]]``` とエラーが出てしまいました。 おそらく、 ```update_weights=AdaBoundOptimizer(learning_rate=0.01,final_lr=0.1,beta1=0.9,beta2=0.999, amsbound=False).minimize(loss)``` の部分が悪いのかと思うのですが、全く改善できなかったため質問させていただきました。 個人宛に質問する形となり申し訳ありません。 分かるようでしたら、回答いただけると助かります。
yone_yone

2019/06/03 14:46

ありがとうございます。 なんとかエラーを解決することができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問