最近在用DDPG算法解决无人机的轨迹优化问题 想问下大家 为什么我的神经网络输出的多维向量的每个向量值都一样啊(输入是46维 输出的是一个4维的向量)
在网络参数更新前的刚开始的几个steps里 输出一直是下面这样子的:(网络参数更新之后 每个向量的值确实也改变了 但总感觉一开始不应该是这样的 因为开始的这些steps里 输入也是有变化的啊 为啥输出不变呢 而且每个向量的值还都一样)
Action: [array([0.5, 0.5, 0.5, 0.5], dtype=float32), array([0.5, 0.5, 0.5, 0.5], dtype=float32), array([0.5, 0.5, 0.5, 0.5], dtype=float32)]
Action: [array([0.5, 0.5, 0.5, 0.5], dtype=float32), array([0.5, 0.5, 0.5, 0.5], dtype=float32), array([0.5, 0.5, 0.5, 0.5], dtype=float32)]
Action: [array([0.5, 0.5, 0.5, 0.5], dtype=float32), array([0.5, 0.5, 0.5, 0.5], dtype=float32), array([0.5, 0.5, 0.5, 0.5], dtype=float32)]
Action: [array([0.5, 0.5, 0.5, 0.5], dtype=float32), array([0.5, 0.5, 0.5, 0.5], dtype=float32), array([0.5, 0.5, 0.5, 0.5], dtype=float32)]
Action: [array([0.5, 0.5, 0.5, 0.5], dtype=float32), array([0.5, 0.5, 0.5, 0.5], dtype=float32), array([0.5, 0.5, 0.5, 0.5], dtype=float32)]
Action: [array([0.5, 0.5, 0.5, 0.5], dtype=float32), array([0.5, 0.5, 0.5, 0.5], dtype=float32), array([0.5, 0.5, 0.5, 0.5], dtype=float32)]
Action: [array([0.5, 0.5, 0.5, 0.5], dtype=float32), array([0.5, 0.5, 0.5, 0.5], dtype=float32), array([0.5, 0.5, 0.5, 0.5], dtype=float32)]
Action: [array([0.5, 0.5, 0.5, 0.5], dtype=float32), array([0.5, 0.5, 0.5, 0.5], dtype=float32), array([0.5, 0.5, 0.5, 0.5], dtype=float32)]
Action: [array([0.5, 0.5, 0.5, 0.5], dtype=float32), array([0.5, 0.5, 0.5, 0.5], dtype=float32), array([0.5, 0.5, 0.5, 0.5], dtype=float32)]
Action: [array([0.5, 0.5, 0.5, 0.5], dtype=float32), array([0.5, 0.5, 0.5, 0.5], dtype=float32), array([0.5, 0.5, 0.5, 0.5], dtype=float32)]
Episode: 0 | Reward: 2584.647520928725 | Min: 18.447269023774265 | Max: 6327.96879377968
我的神经网络模型是这样子的:(会是因为我在输入层之后增加了一个批归一化层的原因嘛 可是不加BN层的话 输出就一直取的是边界值 其他方法比如 更改神经元数量 减少层数 改变优化器 损失函数种类这些方法都试过了 可发现结果都还是这样 没什么效果诶。。)
def _build_model(self):
input_obs = Input(shape=(self.state_dim,)) # 输入层 返回一个维度为self.state_dim的张量
h = BatchNormalization(trainable=True)(input_obs)
h = Dense(400)(h)
h = LeakyReLU(alpha=0.1)(h)
h = Dense(300)(h) # 全连接层 输出维度300
h = LeakyReLU(alpha=0.1)(h)
h = Dense(self.action_dim)(h) # 全连接层 输出维度self.action_dim
h = Activation('tanh')(h) # softmax 改为 tanh
pred = Lambda(lambda h: (h+1)/2)(h)
# RelaxedOneHotCategorical() 函数的作用??? 网络最终输出结果的范围???
# pred = Lambda(lambda h: tf.contrib.distributions.RelaxedOneHotCategorical(0.5, probs=h).sample())(h)
# 给定输入张量和输出张量 生成一个函数型模型 这里包括一个输入层和3个全连接层
model = Model(inputs=input_obs, outputs=pred)
# 用于配置训练模型 优化器:Adam 损失函数:categorical_crossentropy
model.compile(optimizer='Adam', loss='categorical_crossentropy')
return model, model.trainable_weights, input_obs