张量流:ValueError:设置具有序列的数组元素

时间:2018-07-26 20:35:31

标签: python arrays tensorflow openai-gym

我正在尝试使用Tensor Flow为自己的Nim博士游戏创建AI程序。我正在尝试使用强化学习。如果您不熟悉该游戏,则它是由两个玩家玩的游戏。每个玩家轮流将1、2或3加到运行总和上。说进球数的人(最初是20)是获胜者。

因此,我希望输入张量具有两个值:当前总和和目标数。不幸的是,Tensor Flow层仅采用二维或更高维的张量。所以我将其重塑为[2,1]形状。

但是当我将输入数据一起以numpy数组的形式进行训练时,出现以下错误: ValueError:设置具有序列的数组元素。

我看了看,可能是因为我在参数中输入了不同的形状值。但是我在OpenAiGym提供的游戏中查看了相同参数的形状,发现它也具有不同的形状值(类似于我的数组)。

我不确定是否存在其他方式来馈送数据或解决问题

这是代码终止的地方

        # per run, record the data and rewards
        input = np.array([game.total_sum, game_winning_number])
        reward = game.reward
        episode_history.append([input, action_choice, reward])
        episode_rewards += reward

        if done:
            #get game history and create gradients
            total_episode_rewards.append(episode_rewards)
            episode_history = np.array(episode_history)

            print(episode_history)
            print(episode_history[::, 2])
            episode_history[:, 2] = discount_and_normalize_rewards(episode_history[:, 2])


            #we need to feed in two input numbers but keep seperate until reshaping or similar in the actual neural net
            ep_gradients = sess.run(agent.gradients, feed_dict={agent.input_layer: episode_history[:, 0],
                                                                agent.actions: episode_history[:, 1],
                                                                agent.rewards: episode_history[:, 2]})

`

这是神经网络。共有2个观察值(当前的总和和目标数)和3个操作(相加1、2或3)

class Agent:

def __init__(self, num_actions):

    # layers of network
    initializer = tf.contrib.layers.xavier_initializer()
    self.input_layer = tf.placeholder(dtype=tf.float32, shape=[None, ])

    self.input_layer = tf.reshape(self.input_layer, [2,1])

    hidden_layer_1 = tf.contrib.layers.fully_connected(self.input_layer, 4)
    hidden_layer_2 = tf.contrib.layers.fully_connected(hidden_layer_1, 4)

    output_layer = tf.layers.dense(hidden_layer_2, num_actions, activation=None)

    self.outputs = tf.nn.softmax(output_layer)
    self.choice = tf.argmax(self.outputs, axis=1)

    # Training procedure
    self.rewards = tf.placeholder(dtype=tf.float32, shape=[None, ])
    self.actions = tf.placeholder(dtype=tf.int32, shape=[None, ])

    one_hot_actions = tf.one_hot(self.actions, num_actions)

    cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits=output_layer, labels=one_hot_actions)

    self.loss = tf.reduce_mean(cross_entropy * self.rewards)
    self.gradients = tf.gradients(self.loss, tf.trainable_variables())

    # Create a placeholder list for gradients
    self.gradients_to_apply = []
    for index, variable in enumerate(tf.trainable_variables()):
        gradient_placeholder = tf.placeholder(dtype=tf.float32)
        self.gradients_to_apply.append(gradient_placeholder)

    optimizer = tf.train.AdamOptimizer(learning_rate=1e-2)
    self.update_gradients = optimizer.apply_gradients(zip(self.gradients_to_apply, tf.trainable_variables()))

让我知道是否需要澄清任何事情。我想了解如何使用TensorFlow制作自己的AI

0 个答案:

没有答案