Python 为什么sigmoid函数的输出层得到值0或1{0,1}而不是[0,1]中的值

Python 为什么sigmoid函数的输出层得到值0或1{0,1}而不是[0,1]中的值,python,tensorflow,deep-learning,reinforcement-learning,activation-function,Python,Tensorflow,Deep Learning,Reinforcement Learning,Activation Function,我正在实现deepdeterministicpolicygradient(DDPG),通过遵循本教程()并使用python源代码()来解决我的问题 动作数为3(alpha、beta、gamma),状态维度数为2。我想得到[0,1]中3个动作的值,所以我将类Actor的输出层(第三层)从“tanh”函数更改为文件“ddpg_orig_tf.py”中的“sigmoid”函数。然而,当我尝试这个算法来解决我的问题时,它只在3个动作中获得了值0或1{0,1},在区间[0,1]中没有随时间变化。我想问题不

我正在实现deepdeterministicpolicygradient(DDPG),通过遵循本教程()并使用python源代码()来解决我的问题

动作数为3(alpha、beta、gamma),状态维度数为2。我想得到[0,1]中3个动作的值,所以我将类Actor的输出层(第三层)从“tanh”函数更改为文件“ddpg_orig_tf.py”中的“sigmoid”函数。然而,当我尝试这个算法来解决我的问题时,它只在3个动作中获得了值0或1{0,1},在区间[0,1]中没有随时间变化。我想问题不是激活函数,我试着换成tanh,它也只得到了{-1,1}

  • 下面是我在“ddpg_orig_tf.py”中更改的代码:我在输出层将“tanh”更改为“sigmoid”
def构建_网络(自):
使用tf.variable_作用域(self.name):
self.input=tf.placeholder(tf.float32,
形状=[None,*self.input_dims],
name='inputs')
self.action_gradient=tf.placeholder(tf.float32,
shape=[None,self.n_actions],
name='gradients')
f1=1np.sqrt(自身fc1_dims)
密度1=tf.layers.dense(self.input,units=self.fc1_dims,
内核初始化器=随机一致(-f1,f1),
偏差\初始值设定项=随机\均匀(-f1,f1))
batch1=tf.layers.batch\u规范化(dense1)
层1_激活=tf.nn.relu(批次1)
f2=1。/np.sqrt(自身fc2_dims)
密度2=tf.layers.致密(layer1\u激活,单位=self.fc2\u dims,
内核初始化器=随机一致(-f2,f2),
偏差初始值设定项=随机均匀(-f2,f2))
batch2=tf.layers.batch\u标准化(dense2)
层2_激活=tf.nn.relu(批次2)
f3=0.003
mu=tf.layers.dense(第二层激活,单位=自我n行动,
激活=乙状结肠',
内核初始化器=随机一致(-f3,f3),
偏差\初始值设定项=随机\均匀(-f3,f3))
self.mu=tf.multiply(mu,self.action\u绑定)
  • 这是我的环境:
导入健身房
从健身房导入空间
从gym.utils导入种子
将numpy作为np导入
从操作系统导入路径
类P_nomenv():
定义初始值(自身,距离1,距离2,功率,B=15000,N0=10**-20,路径损耗=2,g=1):
self.B=B#带宽
self.N0=N0
self.path\u loss=路径损耗
self.g=g
self.alpha_low=0。
self.alpha_high=1。
self.beta_low=0。
self.beta_high=1。
self.gamma_low=0。
self.gamma_高=1。
self.distance1=np.random.randint(30500)
self.distance2=2*distance1
自我力量=力量
self.max_迭代=1000
self.high=np.array([self.B,self.power])
self.action_space=spaces.Box(低=0,高=1,形状=(3,),数据类型=np.float32)
self.observation_space=spaces.Box(低=np.array([0.1,0.0001]),高=np.array([self.B,self.power]),dtype=np.float32)
self.seed()
def种子(自身,种子=无):
self.np_random,seed=seeding.np_random(seed)
返回[种子]
def cal_SINR_near(自身、α、β、γ、g、距离1、路径损耗、功率、B、N0):
h_近距离=g*(距离1**-路径损耗)
信道噪声=B*N0#1子信道
非重叠=(np.平方(np.绝对(h_近))*功率*0.5*(1-beta))/信道噪声
重叠=(np.平方(np.绝对(h_近))*功率*伽马*(α+β)*0.5)/(通道噪声+(np.平方(np.绝对(h_近))*功率*(1-伽马)*(α+β)*0.5))
SINR\u near=非重叠+重叠
返回SINR_附近
def cal_SINR_far(自身、α、β、γ、g、距离2、路径损耗、功率、B、N0):
h_far=g*(距离2**-路径损耗)
信道噪声=B*N0#1子信道
非重叠=(np.平方(np.绝对(h_far))*功率*0.5*(1-alpha))/信道噪声
重叠=(np.平方(np.绝对(h_far))*功率*(1-伽马)*(α+β)*0.5)/(通道噪声
+(np.平方(np.绝对(h_far))*幂*伽马*(α+β)*0.5)
SINR\u far=非重叠+重叠
返回SINR_far
定义校准和速率(自身、近信噪比、远信噪比、B、α、β):
R_近邻=(1+alpha)*0.5*B*np.log2(1+SINR_近邻)
R_far=(1+beta)*0.5*B*np.log2(1+SINR_far)
总回报率=近回报率+远回报率
回报率
def正常化(自我,x):
归一化=(x+1.2)/2.4
返回标准化
def步骤(自我、行动):
自行采取的步骤+=1
B、 P=自我状态
新的α=np.clip(动作,self.alpha低,self.alpha高)[0]
new_beta=np.clip(动作,self.beta\u低,self.beta\u高)[1]
新的伽马=np.clip(动作,自伽马低,自伽马高)[2]
SINR\u near=self.cal\u SINR\u near(新α、新β、新γ、self.g、self.distance 1、self.path\u损耗、self.power、self.B、self.N0)
SINR\u far=self.cal\u SINR\u far(新α、新β、新γ、self.g、self.distance 2、self.path\u损耗、self.power、self.B、self.N0)
奖励=自校准和费率(近信、远信、自B、新阿尔法、新贝塔)
完成=self.steps\u taked>=self.max\u迭代
新的=(1-新的测试版)*0.5*self.B+(新的测试版+新的测试版)*0.5*self.B
P_new=(1-新β)*0.5*自功率+(新α+新β)*0.5*新γ*自功率
self.state=np.array([B_new,P_new])
返回自我。获得行动,奖励,完成,{},新阿尔法,新贝塔,新伽马
def_get_obs(自我、行动):
新的α=np.clip(动作,self.alpha低,self.alpha高)[0]
新测试版=