【问题标题】:Keras model outputs constant value as predictionKeras 模型输出常数值作为预测
【发布时间】:2018-01-09 00:12:14
【问题描述】:

我目前正在实施强化学习算法,但 keras 似乎不想合作。在训练中,我为模型提供了一批数据,一切都按预期工作,但是当我想使用模型对单个数据点进行预测时,它只会一遍又一遍地输出相同的值(输入不同)。这是我的代码:

//网络初始化:

    def initialize_actor(self):

    state_variable_input = Input(shape=(3, ))

    dense = Dense(16, activation="relu", kernel_initializer="lecun_uniform")(state_variable_input)
    batch_norm1 = BatchNormalization()(dense)
    dense2 = Dense(16, activation="relu", kernel_initializer="lecun_uniform")(batch_norm1)
    batch_norm2 = BatchNormalization()(dense2)
    output = Dense(1, activation=lecun_tanh, kernel_initializer=RandomUniform(-3e-3, 3e-3),
                   bias_initializer=RandomUniform(-3e-3, 3e-3))(batch_norm2)

    model = Model(inputs=state_variable_input,
                  outputs=output)

    model.compile(optimizer="adam", loss="mse")

    return model, state_variable_input

//训练:

    def train_actor(self, samples):

    cur_state_var, action, reward, new_state_var = samples
    predicted_actions = self.actor_model.predict([cur_state_var]) # shape of cur_state_var (batch_size, 3), predicts n = batch_size actions as intended
    grads = self.sess.run(self.critic_grads, feed_dict={
        self.critic_var_in: cur_state_var,
        self.critic_action_in: predicted_action})[0]

    summ, _  = self.sess.run([self.merged, self.optimize], feed_dict={
        self.actor_var_in: cur_state_var,
        self.actor_critic_grad: grads
        })
    self.writer.add_summary(summ)

//预测:

  def act(self, cur_state_var):

      if np.random.random() < self.epsilon:
          return env.action_space.sample()

      else:
          action = self.actor_model.predict([cur_state_var], batch_size=1)[0] # shape of cur_state_var = (1,3), the network returns the same value for action at every call
          return action

我希望我的错误可以在我认为与此相关的代码中的某个地方找到。我怀疑这与训练和预测时的不同批次大小有关。非常感谢您的宝贵时间!

【问题讨论】:

    标签: tensorflow keras reinforcement-learning


    【解决方案1】:

    我经常遇到这个问题,其中一个原因是样本的特征不平衡。例如,特征是这样的:

    [1234, 0.001, 0.002, 0.01, 0.01]
    

    如你所见,第一列特征太大,其他特征太小,所以你应该做一些标准化特征。

    另外一个原因可能是激活错误,你应该根据你的具体工作检查激活,特别是最后一层的激活。

    希望对你有帮助。

    【讨论】:

    • 感谢您的回答。我已经考虑了您的第一点,并且我的数据已经进行了最小-最大缩放。平均1部分:-0.364490946837 STDDEV 1部分:0.609148434557敏第一个部件:-0.999999987686最大1部分:0.999999970844平均第二部分:0.0009056560424 STDDEV第二部分:0.704332105003闵第二部分:-0.999999999711最大第二部分:0.999999993432平均3部分:-0.00216107064395 STDDEV第三分量:0.45353269543 最小值第三分量:-1.0 最大值第三分量:1.0 你认为我也应该零中心吗?
    • 至于第二点,我使用的激活函数是来自 LeCun 的“高效反向传播”论文的修改后的 tanh。只要我提供一批输入,它就可以正常工作,并且我还验证了使用标准 tanh 时也会发生同样的情况
    • 非常感谢您的回答;这解决了我的问题。
    猜你喜欢
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 2018-08-08
    • 2018-09-13
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多