如何在keras中添加自己的优化器(如adam等)
本文主要讨论windows下基于tensorflow的keras
1、找到tensorflow的根目录
如果安装时使用anaconda且使用默认安装路径,则在C:\ProgramData\Anaconda3\envs\tensorflow-gpu\Lib\site-packages\tensorflow处可以找到(此处为GPU版本),cpu版本可在C:\ProgramData\Anaconda3\Lib\site-packages\tensorflow处找到。若并非使用默认安装路径,可参照根目录查看找到。
2、找到keras在tensorflow下的根目录
需要特别注意的是找到keras在tensorflow下的根目录而不是找到keras的根目录。一般来说,完成tensorflow以及keras的配置后即可在tensorflow目录下的python目录中找到keras目录,以GPU为例keras在tensorflow下的根目录为C:\ProgramData\Anaconda3\envs\tensorflow-gpu\Lib\site-packages\tensorflow\python\keras
3、找到keras目录下的optimizers.py文件并添加自己的优化器
找到optimizers.py中的adam等优化器类并在后面添加自己的优化器类
以本文来说,我在第718行添加如下代码
@tf_export('keras.optimizers.adamsss') classAdamsss(Optimizer): def__init__(self, lr=0.002, beta_1=0.9, beta_2=0.999, epsilon=None, schedule_decay=0.004, **kwargs): super(Adamsss,self).__init__(**kwargs) withK.name_scope(self.__class__.__name__): self.iterations=K.variable(0,dtype='int64',name='iterations') self.m_schedule=K.variable(1.,name='m_schedule') self.lr=K.variable(lr,name='lr') self.beta_1=K.variable(beta_1,name='beta_1') self.beta_2=K.variable(beta_2,name='beta_2') ifepsilonisNone: epsilon=K.epsilon() self.epsilon=epsilon self.schedule_decay=schedule_decay defget_updates(self,loss,params): grads=self.get_gradients(loss,params) self.updates=[state_ops.assign_add(self.iterations,1)] t=math_ops.cast(self.iterations,K.floatx())+1 #Duetotherecommendationsin[2],i.e.warmingmomentumschedule momentum_cache_t=self.beta_1*( 1.-0.5* (math_ops.pow(K.cast_to_floatx(0.96),t*self.schedule_decay))) momentum_cache_t_1=self.beta_1*( 1.-0.5* (math_ops.pow(K.cast_to_floatx(0.96),(t+1)*self.schedule_decay))) m_schedule_new=self.m_schedule*momentum_cache_t m_schedule_next=self.m_schedule*momentum_cache_t*momentum_cache_t_1 self.updates.append((self.m_schedule,m_schedule_new)) shapes=[K.int_shape(p)forpinparams] ms=[K.zeros(shape)forshapeinshapes] vs=[K.zeros(shape)forshapeinshapes] self.weights=[self.iterations]+ms+vs forp,g,m,vinzip(params,grads,ms,vs): #thefollowingequationsgivenin[1] g_prime=g/(1.-m_schedule_new) m_t=self.beta_1*m+(1.-self.beta_1)*g m_t_prime=m_t/(1.-m_schedule_next) v_t=self.beta_2*v+(1.-self.beta_2)*math_ops.square(g) v_t_prime=v_t/(1.-math_ops.pow(self.beta_2,t)) m_t_bar=( 1.-momentum_cache_t)*g_prime+momentum_cache_t_1*m_t_prime self.updates.append(state_ops.assign(m,m_t)) self.updates.append(state_ops.assign(v,v_t)) p_t=p-self.lr*m_t_bar/(K.sqrt(v_t_prime)+self.epsilon) new_p=p_t #Applyconstraints. ifgetattr(p,'constraint',None)isnotNone: new_p=p.constraint(new_p) self.updates.append(state_ops.assign(p,new_p)) returnself.updates defget_config(self): config={ 'lr':float(K.get_value(self.lr)), 'beta_1':float(K.get_value(self.beta_1)), 'beta_2':float(K.get_value(self.beta_2)), 'epsilon':self.epsilon, 'schedule_decay':self.schedule_decay } base_config=super(Adamsss,self).get_config() returndict(list(base_config.items())+list(config.items()))
然后修改之后的优化器调用类添加我自己的优化器adamss
需要修改的有(下面的两处修改依旧在optimizers.py内)
#Aliases. sgd=SGD rmsprop=RMSprop adagrad=Adagrad adadelta=Adadelta adam=Adam adamsss=Adamsss adamax=Adamax nadam=Nadam
以及
defdeserialize(config,custom_objects=None): """Inverseofthe`serialize`function. Arguments: config:Optimizerconfigurationdictionary. custom_objects:Optionaldictionarymapping names(strings)tocustomobjects (classesandfunctions) tobeconsideredduringdeserialization. Returns: AKerasOptimizerinstance. """ iftf2.enabled(): all_classes={ 'adadelta':adadelta_v2.Adadelta, 'adagrad':adagrad_v2.Adagrad, 'adam':adam_v2.Adam, 'adamsss':adamsss_v2.Adamsss, 'adamax':adamax_v2.Adamax, 'nadam':nadam_v2.Nadam, 'rmsprop':rmsprop_v2.RMSprop, 'sgd':gradient_descent_v2.SGD } else: all_classes={ 'adadelta':Adadelta, 'adagrad':Adagrad, 'adam':Adam, 'adamax':Adamax, 'nadam':Nadam, 'adamsss':Adamsss, 'rmsprop':RMSprop, 'sgd':SGD, 'tfoptimizer':TFOptimizer }
这里我们并没有v2版本,所以if后面的部分不改也可以。
4、调用我们的优化器对模型进行设置
model.compile(loss='crossentropy',optimizer='adamss',metrics=['accuracy'])
5、训练模型
train_history=model.fit(x,y_label,validation_split=0.2,epoch=10,batch=128,verbose=1)
补充知识:keras设置学习率--优化器的用法
优化器的用法
优化器(optimizer)是编译Keras模型的所需的两个参数之一:
fromkerasimportoptimizers model=Sequential() model.add(Dense(64,kernel_initializer='uniform',input_shape=(10,))) model.add(Activation('softmax')) sgd=optimizers.SGD(lr=0.01,decay=1e-6,momentum=0.9,nesterov=True) model.compile(loss='mean_squared_error',optimizer=sgd)
你可以先实例化一个优化器对象,然后将它传入model.compile(),像上述示例中一样,或者你可以通过名称来调用优化器。在后一种情况下,将使用优化器的默认参数。
#传入优化器名称:默认参数将被采用
model.compile(loss='mean_squared_error',optimizer='sgd')
以上这篇如何在keras中添加自己的优化器(如adam等)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。