我正在尝试使用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