神经网络的输出为啥不变呀?(语言-python)

神经网络模型长图片这样 可是为啥不管输入是什么 输出都一模一样 不变
结果一直是(0.5 0.5 0.5 0.5)
(输入数据维度是46 输出是4)
研究了好多天了 减少神经元数量,改变优化器、损失函数种类 ,降低输入维度 都试过啦 还是不行 实在是不知道问题出在哪里啦 有知道的可以帮忙解决一下嘛

img

你模型的训练代码呢?你不会每次训练之后没有反向传播更新下权重和梯度信息吧。看你打印的输出,基本上都是初始化之后的权重,不然按照你100个epoch存一下模型来看,不可能都是一样的权重

给出文字代码

不能只给神经网络模型这段代码,要给出你使用模型的代码

这是actor神经网络的模型:

class ActorNetwork(object):
    """
    Implements actor network
    """
    def __init__(self,sess,state_dim,action_dim,lr,tau):
        self.sess = sess
        K.set_session(sess)
        K.set_learning_phase(1)
        self.state_dim = state_dim
        self.action_dim = action_dim
        self.lr = lr
        self.tau = tau
        self.mainModel, self.mainModel_weights, self.mainModel_state = self._build_model()
        self.targetModel, self.targetModel_weights, _ = self._build_model()
        self.action_gradient = tf.placeholder(tf.float32, [None, self.action_dim])
        self.params_grad = tf.gradients(self.mainModel.output, self.mainModel_weights, -self.action_gradient)
        grads = zip(self.params_grad, self.mainModel_weights)
        self.optimize = tf.train.AdamOptimizer(self.lr).apply_gradients(grads)
        self.sess.run(tf.global_variables_initializer())

    def _build_model(self):
        input_obs = Input(shape=(self.state_dim,))  # 输入层 返回一个维度为self.state_dim的张量
        h = BatchNormalization()(input_obs)
        h = Dense(400, kernel_initializer = 'random_uniform')(h)  # 全连接层 400个神经元(即该层的输出维度)
        h = LeakyReLU(alpha=0.1)(h)
        h = Dense(300, kernel_initializer = 'random_uniform')(h)  # 全连接层 输出维度300
        h = LeakyReLU(alpha=0.1)(h)
        h = Dense(self.action_dim, kernel_initializer = 'random_uniform')(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

    def act(self, state):
        act = self.mainModel.predict(state)
        return act

这是使用该神经网络获取动作值的部分:

        for stp in range(int(args['max_episode_len'])):
            a = []
            for i in range(env.num_UAVs):
                actor = actors[i]
                a.append(actor.act(np.reshape(s[i], (-1, actor.state_dim))).reshape(actor.action_dim, ))  # 输入状态 输出动作
                # reshape 在不改变数据内容的情况下,改变一个数组的格式
                # (-1,actor.state_dim) 表示将智能体i的状态信息转化为列数为actor.state_dim的矩阵 行数自适应
                # 输入到actor网络的输出结果(动作)再reshape为行数为actor.action_dim的矩阵

            for i in range(env.num_UAVs):
                # 增加探索扰动, 输出限制在 [0, 1] 范围内
                a[i] = np.clip(np.random.normal(a[i], NOISE), 0, 1)

            s2, r, done = env.step(a)
            replayMemory.add(s, a, r, done, s2)
            s = s2

```

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^