我现在正在代理DQN。 我实现了这样的Relu激活功能:
self.model = tf.keras.Sequential([
tf.keras.layers.Dense(20),
tf.keras.layers.ReLU(),
tf.keras.layers.Dense(self.action_size)
])
当我计算梯度时,某些梯度变为零。 我认为这是因为RELU。 所以我将其更改为:
self.model = tf.keras.Sequential([
tf.keras.layers.Dense(20),
tf.keras.layers.LeakyReLU(),
tf.keras.layers.Dense(self.action_size)
])
然后效果很好。
但是当我使这段代码成为这样的低级张量流时:
self.X = tf.placeholder(tf.float32,[None,self.state_size])
self.layer1=tf.layers.dense(self.X,20,activation=tf.nn.relu)
self.output_layer = tf.layers.dense(self.layer1,self.action_size)
self.Y = tf.placeholder(tf.float32,[None,self.action_size])
relu激活效果很好。我的意思是梯度并非全为零。 我不知道为什么第一次执行的结果与最后一次执行的结果不一样。
答案 0 :(得分:0)
有不同的ReLU函数:LeakyLeakyReLU和Parametric PReLU以及keras中的默认ReLU。您需要检查这两个的默认参数是什么。例如:keras.layers.LeakyReLU的默认参数alpha为0.3。
梯度可能会变为0,因为神经元参数在一开始就被随机设置了,这可能会导致您遇到问题。