2016-04-04 3 views
-3

Я пытаюсь реализовать CNN, чтобы играть в игру. Я использую python с theano/lasagne. Я создал сеть, и теперь я выясняю, как ее обучать.Сверторная нейронная сеть: как ее обучать? (неконтролируемый)

Так что теперь у меня есть партия из 32 государств, и для каждого государства в этой партии действие и ожидаемых наград для этого действия.

Теперь, как я могу обучить сеть так, чтобы она узнала, что эти действия в этих состояниях приводят к этим наградам?

EDIT: Разъяснение моей проблемы.

Вот мой полный код: http://pastebin.com/zY8w98Ng импорт змея: http://pastebin.com/fgGCabzR

У меня возникли проблемы с этим битом:

def _train(self): 
    # Prepare Theano variables for inputs and targets 
    input_var = T.tensor4('inputs') 
    target_var = T.ivector('targets') 
    states = T.tensor4('states') 
    print "sampling mini batch..." 
    # sample a mini_batch to train on 
    mini_batch = random.sample(self._observations, self.MINI_BATCH_SIZE) 
    # get the batch variables 
    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]: 
      # this was a terminal frame so need so scale future reward... 
      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())) 

    # figure out how to train the model (self._output_layer) with previous_states, 
    # actions and agent_expected_rewards 

Я хочу, чтобы обновить модель с помощью previous_states, действия и 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) 

Я просто не понимаю, как данность бы эффект модель, потому что при построении сети я не указываю их. Я тоже не могу найти его в документации по анано и лазаньи.

Так как я могу обновить модель/сеть так, чтобы она «училась».

Если все еще не ясно, прокомментируйте, какая информация по-прежнему необходима. Я пытался понять это уже несколько дней.

ответ

1

После прохождения документации я наконец нашел ответ. Раньше я искал не то место.

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)