Deep Q Network имеет одинаковый выход независимо от того, вход - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь реплицировать (используя PyTorch) Deep Q Network другого человека (который использовал TensorFlow) для изучения среды спортзала OpenAI «BreakoutDeterministi c -v4». Тот, который я пытаюсь повторить, находится здесь: https://github.com/fg91/Deep-Q-Learning/blob/master/DQN.ipynb

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

Все параметры в сети взяты непосредственно из сети, которую я пытаюсь реплицировать, и входное изображение обрезается точно так же. Сеть, которую я реплицирую, работает так, как я ее тестировал.

Ниже приведен код, используемый для DQN.

class DQN(nn.Module):
def __init__(self, input_shape, n_actions):
    super(DQN, self).__init__()
    self.conv = nn.Sequential(
        nn.Conv2d(input_shape[0], 32, kernel_size=8, stride=4),
        nn.ReLU(),
        nn.Conv2d(32, 64, kernel_size=4, stride=2),
        nn.ReLU(),
        nn.Conv2d(64, 64, kernel_size=3, stride=1),
        nn.ReLU()
    )

    self.val_conv = nn.Sequential(
        nn.Conv2d(64, 512, kernel_size=7, stride=1),
        nn.ReLU()
    )

    self.adv_conv = nn.Sequential(
        nn.Conv2d(64, 512, kernel_size=7, stride=1),
        nn.ReLU()
    )

    conv_out_size = self._get_conv_out(input_shape)
    self.value_stream = nn.Sequential(
        nn.Linear(conv_out_size, 1)
    )

    self.advantage_stream = nn.Sequential(
        nn.Linear(conv_out_size, n_actions)
    )

def _get_conv_out(self, shape):
    o = self.conv(torch.zeros(1, *shape))
    o = self.val_conv(torch.zeros(*tuple(o.size())))
    return int(np.prod(o.size()))

def forward(self, state):
    print(state.cpu()[1][1])
    features = self.conv(state)
    feat_val = self.val_conv(features)
    feat_adv = self.adv_conv(features)
    feat_val = feat_val.view(feat_val.size(0), -1)
    feat_adv = feat_adv.view(feat_adv.size(0), -1)
    values = self.value_stream(feat_val)
    advantages = self.advantage_stream(feat_adv)
    qvals = values + (advantages - advantages.mean())

    return qvals

Я не уверен, что это полезно, но я использую Оптимизатор - Адам, скорость обучения 0,00001, а эпсилон уменьшается с той же скоростью, что и тот, который я пытаюсь повторить.

...