【发布时间】:2021-04-07 19:33:01
【问题描述】:
我希望基于时间步长而不是像大多数调度程序所基于的时期那样具有自适应学习率。我有一个模型:
import tensorflow as tf
from tensorflow.keras.models import Model
from tensorflow.keras import layers
from tensorflow.keras.optimizers import Adam
class DQNagent:
def __init__(self, state_size, action_size):
self.state_size = state_size
self.action_size = action_size
self.model = self.build_model() # original model
self.target_model = self.build_model() # target model
self.lr = 1e-2
def build_model(self):
x_in = layers.Input(shape=(self.step_size, self.state_size))
x_out = layers.Dense(20, activation='relu')(x_in)
output = layers.Dense(self.action_size, activation='linear')(x_out)
self.learning_rate = CustomSchedule()
opt = tf.keras.optimizers.Adam(self.learning_rate)
model = Model(inputs=x_in, outputs=output_y, name="DQN")
model.compile(loss=['mse'], optimizer=opt)
return model
我想制作一个类似这样的调度程序:
class CustomSchedule:
def __init__(self, lr=1e-2):
super(CustomSchedule, self).__init__()
self.lr = lr
self.t = 0
def __call__(self):
self.t +=1
if self.t % 100 ==0:
self.lr /= 10
return self.lr
我没有声明所有内容的主要代码是这样的:
dqn = DQNagent(state_size, action_size)
for step in range(1000):
states_all = np.array([[[0, 0, 1],[1,0,1], [0, -1, 1], [1,-1,1]]])
Q_values = dqn.model.predict(state_all)[0]
# training
batch = memory.sample(batch_size)
batch_states = utils.get_states_user(batch) # assuming I have generated states using this method
Q_states = dqn.model.predict(batch_states) # assuming I have sampled batch states
dqn.model.fit(batch_states, Q_states, verbose =0)
我想安排我的学习率,如果我说step%100==0,学习率会降低为learning_rate/10。似乎对于我创建的CustomSchedule 类,我将不得不重新编译model,这似乎无法有效地保存和加载权重。有没有其他方法可以做到这一点?
编辑:
我已经按照@FedericoMalerba answer 编辑了我的代码
创建了decay_func 为:
def decay_func(step, lr):
return lr/10**(step/100)
然后我在DQNAgent 类中添加了以下更改:
class DQNAgent():
def __init__(self, state_size, action_size):
self.lr = 1e-2
self.t_step = tf.Variable(0, trainable=False, name='Step', dtype=tf.int64)
self.decaying_lr = partial(decay_func, step=self.step, lr=self.lr)
def __call__(self):
self.step.assign_add(1)
return self.step
并在我的主代码中为每个步骤调用dqn()。可调用的decaying_lr 被传递给build_model() 中的优化器
opt = tf.keras.optimizers.Adam(self.decaying_lr)
【问题讨论】:
标签: python tensorflow machine-learning keras reinforcement-learning