卷积神经网络:如何进行无监督训练?

我正在尝试实现一个卷积神经网络来玩游戏。我使用的是Python和Theano/Lasagne。我已经构建了网络,现在正在研究如何训练它。

现在我有一批32个状态,每个状态都有一个对应的动作和该动作的预期奖励

那么,我该如何训练网络,使其学会在这些状态下这些动作会导致这些奖励呢?

编辑:澄清我的问题。

这是我的完整代码:http://pastebin.com/zY8w98Ng蛇的导入:http://pastebin.com/fgGCabzR

我在这部分遇到了麻烦:

def _train(self):    # 准备Theano变量用于输入和目标
    input_var = T.tensor4('inputs')
    target_var = T.ivector('targets')
    states = T.tensor4('states')
    print "sampling mini batch..."
    # 抽样一个mini_batch用于训练
    mini_batch = random.sample(self._observations, self.MINI_BATCH_SIZE)
    # 获取批次变量
    previous_states = [d[self.OBS_LAST_STATE_INDEX] for d in mini_batch]
    actions = [d[self.OBS_ACTION_INDEX] for d in mini_batch]
    rewards = [d[self.OBS_REWARD_INDEX] for d in mini_batch]
    current_states = np.array([d[self.OBS_CURRENT_STATE_INDEX] for d in mini_batch])
    agents_expected_reward = []
    # print np.rollaxis(current_states, 3, 1).shape
    print "compiling current states..."
    current_states = np.rollaxis(current_states, 3, 1)
    current_states = theano.compile.sharedvalue.shared(current_states)
    print "getting network output from current states..."
    agents_reward_per_action = lasagne.layers.get_output(self._output_layer, current_states)
    print "rewards adding..."
    for i in range(len(mini_batch)):
        if mini_batch[i][self.OBS_TERMINAL_INDEX]:
            # 这是一个终止帧,因此需要缩放未来奖励...
            agents_expected_reward.append(rewards[i])
        else:
            agents_expected_reward.append(
                rewards[i] + self.FUTURE_REWARD_DISCOUNT * np.max(agents_reward_per_action[i].eval()))
    # 弄清楚如何使用previous_states, actions和agent_expected_rewards来训练模型(self._output_layer)

我想使用previous_states, actions和agent_expected_rewards来更新模型,使其学会这些动作会导致这些奖励。

我预计可能会像这样:

train_model = theano.function(inputs=[input_var],
    outputs=self._output_layer,
    givens={
        states: previous_states,
        rewards: agents_expected_reward
        expected_rewards: agents_expected_reward)

我只是不明白givens如何影响模型,因为在构建网络时我没有指定它们。我在Theano和Lasagne的文档中也找不到相关信息。

那么,我该如何更新模型/网络,使其“学习”呢?

如果还不清楚,请评论指出还需要哪些信息。我已经尝试解决这个问题几天了。


回答:

在查阅了文档后,我终于找到了答案。之前我找错了地方。

    network = self._output_layer
    prediction = lasagne.layers.get_output(network)
    loss = lasagne.objectives.categorical_crossentropy(prediction, target_var)
    loss = loss.mean()
    params = lasagne.layers.get_all_params(network, trainable=True)
    updates = lasagne.updates.sgd(loss, params, self.LEARN_RATE)
    givens = {
        states: current_states,
        expected: agents_expected_reward,
        real_rewards: rewards
    }
    train_fn = theano.function([input_var, target_var], loss,
                                    updates=updates, on_unused_input='warn',
                                    givens=givens,
                                    allow_input_downcast='True')
    train_fn(current_states, agents_expected_reward)

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注