DQN以及相关算法的Python模板总结——基于tensorflow和部分开源文献

DQN以及相关算法的Python模板总结

基于tensorflow和部分开源文献

简介 已经发现,目前接触到的DQN应用于频谱分配的方法,本质上就是分别设计DQN类和环境类,然后在主函数中让两者互动。这次的工作,就是找到这个DQN类的规律,把它拆解成我们以后会用到的模块、模板,再封装成可以半直接调用的包;找到主函数中两个模拟器互动的接口,确定主函数设计的规律和模板。如此一来可以简化我们编程需要的时间,剩下的工作就是根据接口编写我们自己设计的环境模拟器了。
DQN本身是一种适用于处理图像、视频的强化学习算法,在处理针对这些方面的问题时,已经有很成熟的开源算法。但是当DQN应用到频谱分配问题时,输入的数据变得比较“扁平”,不再是图像、视频中的像素点。因此,在处理频谱分配问题时,就需要对算法和代码进行相应的优化。参考了多篇开源论文后发现,这些文献采用的DQN算法并没有本质上的差别,基本思路就是通过两个模拟器(DQN、环境,在Python中就是将这两个模拟器封装为两个Class)之间的互动,来完成目标。进一步思考后发现,其实我们在设计自己的算法时,只需要把注意力放在环境模拟器的设计上,DQN模拟器(就是本文要介绍的DQN类)稍加改动就可以直接利用。
因此,本文的主要目的,其实就是把这个DQN模拟器拆开来,把每个功能的模板整理好,并指出在主函数中如何调用这些模块(相当于指明接口和接口的用法)。
几乎所有的DQN开源代码都是面向对象编程。尽管这种编程方式有其优点,但是在自己的实践中意识到,这种封装性特别强的代码容易使人找不到算法的内在联系,使得我们在应用开源的代码时常常出现很多的问题。相信通过这个DQN类模板的拆解和总结,会在很大程度上帮助解决编程的问题。
因此,认为本文中的DQN模板的拆解和整体算法模板的设计,是目前为止比较重要的进展:
第一,搞清楚了DQN算法应用在频谱分配时本质上就是在设计自己的环境模拟器。
第二,环境模拟器设计好后,其实只需要在主函数中调用封装好的DQN类的“接口”,就可以完成环境模拟器和DQN模拟器的互动。
第三,两个模拟器设计好以后,主函数调用这两个模拟器进行互动也是有规律可循的。总结好这个规律,将对我们整体上编写这个算法提供相当大的帮助。
第四,DQN类及其类中与深度学习网络、贪心算法等相关的模块,可以作为我们实验室的资源,整理好以后对新接触的成员提供很大的帮助。

深度网络的搭建:

DQN使用到的深度网络其实和深度学习中的深度网络时一回事,这部分的代码可以通用。主要的内容是使用tf中的内置函数设置好深度网络的层数、权重、偏置等。(以下函数都要放在一个class中互相调用,将这个class命名为DQN-yzh)

def weight_variable(self,shape):        
initial = tf.truncated_normal(shape)
          return tf.Variable(initial)
def bias_variable(self,shape):
  	      initial = tf.constant(0.01, shape = shape)
     	  return tf.Variable(initial)

而后利用上面这两个类内函数搭建网络:
(1) 设置四层深度网络的权重和偏置:

W_fc1 = self.weight_variable([self.sensor_dim,self.hidden1])
b_fc1 = self.bias_variable([self.hidden1])

W_fc2 = self.weight_variable([self.hidden1,self.hidden2])
b_fc2 = self.bias_variable([self.hidden2])
      
W_fc3 = self.weight_variable([self.hidden2,self.hidden3])
b_fc3 = self.bias_variable([self.hidden3])
      
W_fc4 = self.weight_variable([self.hidden3,self.actions])
b_fc4 = self.bias_variable([self.actions])  

(2) 设置各层使用的激活函数,把偏置、权重、激活函数“乘”在一起:

h_fc1 = tf.nn.relu(tf.matmul(self.stateInput,W_fc1) + b_fc1)
h_fc2 = tf.nn.relu(tf.matmul(h_fc1,W_fc2) + b_fc2)
h_fc3 = tf.nn.tanh(tf.matmul(h_fc2,W_fc3) + b_fc3) 

这时,一个隐藏层数目为2,加上输入层和输出层总过4层的深度网络就构建好了。但这时我们只是把这个深度网络的架子搭起来了,在上面标亮的位置我们发现输入层的数据是通过self.stateInput输入的,因此在这之前要先根据实际情况定义stateInput:

self.stateInput = tf.placeholder("float",[None,self.sensor_dim])

第四层(输出层)由于并没有使用激活函数,所以没有在(2)中定义,需要单独定义如下:

self.QValue = tf.matmul(h_fc3,W_fc4) + b_fc4

DQN的迭代、调参

上一部分只和深度网络的搭建有关,在DQN中还涉及到了Q表的更新迭代,反向调参的过程,这部分的模板可以这样设置:

self.actionInput = tf.placeholder
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值