Theano DeepRL Встраивание в сверточные слои - PullRequest
0 голосов
/ 29 января 2020

У меня возникли проблемы с получением действительной модели с базой Lasagne + Theano для обучения глубокому укреплению.

Точно, я хочу слой встраивания, за которым следует сверточный слой. Модель строится правильно, поскольку входные формы и выходные формы соответствуют НО при попытке получить выходные данные. Похоже, что встраиваемый слой возвращает объект, недопустимый для сверточного слоя.

здесь это воспроизведенная более простая версия моего кода (4 строки в конце конструктора меня беспокоят)

import lasagne
import numpy as np
import theano
import theano.tensor as T
import sys

class DeepQLearner:
    """
    Deep Q-learning network using Lasagne.
    """

    def __init__(self, l, h, num_outputs, batch_size,):
        self.l = l
        self.h = h
        self.num_outputs = num_outputs
        self.batch_size = batch_size
        self.l_out = self.build_network()
        states = T.tensor4('states', dtype='int8')
        self.states_shared = theano.shared(np.zeros((batch_size, self.l, self.h)))

        embedding_output = lasagne.layers.get_output(self.l_embedding, inputs = states)
        print(str(self.l_embedding.output_shape)) # (32, 10, 10, 32)
        print(str(embedding_output)) # Reshape{5}.0
        full_output = lasagne.layers.get_output(self.l_out, inputs = states) # TypeError: img must be 4D tensor

    def build_network(self):
        """
        Build a simple linear learner.  Useful for creating
        tests that sanity-check the weight update code.
        """
        l = self.l
        h = self.h
        batch_size = self.batch_size

        self.l_in = lasagne.layers.InputLayer(
            shape=(batch_size, l, h)
        )

        self.l_embedding = lasagne.layers.EmbeddingLayer(
            self.l_in,
            input_size=l*h,
            output_size=32,

        )
        l_conv = lasagne.layers.Conv2DLayer(
            self.l_embedding,
            num_filters=32,
            filter_size=(3, 3),
            nonlinearity=lasagne.nonlinearities.rectify
        )
        return l_conv

deepq = DeepQLearner(10, 10, 4, 32)

При запуске выдает:

(32, 10, 10, 32)
Reshape{5}.0
Traceback (most recent call last):
  File "reproduce.py", line 60, in <module>
    deepq = DeepQLearner(10, 10, 4, 32)
  File "reproduce.py", line 31, in __init__
    full_output = lasagne.layers.get_output(self.l_out, inputs = states) # TypeError: img must be 4D tensor
  File "/usr/local/lib/python3.6/dist-packages/lasagne/layers/helper.py", line 198, in get_output
    all_outputs[layer] = layer.get_output_for(layer_inputs, **kwargs)
  File "/usr/local/lib/python3.6/dist-packages/lasagne/layers/conv.py", line 352, in get_output_for
    conved = self.convolve(input, **kwargs)
  File "/usr/local/lib/python3.6/dist-packages/lasagne/layers/conv.py", line 650, in convolve
    **extra_kwargs)
  File "/usr/local/lib/python3.6/dist-packages/theano/tensor/nnet/__init__.py", line 169, in conv2d
    filter_dilation, num_groups, unshared)
  File "/usr/local/lib/python3.6/dist-packages/theano/tensor/nnet/abstract_conv.py", line 644, in conv2d
    return conv_op(input, filters)
  File "/usr/local/lib/python3.6/dist-packages/theano/gof/op.py", line 615, in __call__
    node = self.make_node(*inputs, **kwargs)
  File "/usr/local/lib/python3.6/dist-packages/theano/tensor/nnet/abstract_conv.py", line 2335, in make_node
    raise TypeError('img must be %dD tensor' % (2 + self.convdim))
TypeError: img must be 4D tensor

Может ли кто-нибудь дать мне подсказку, как это сделать? Спасибо

Версия Theano: 1.0.4 + 30.g9016c7ad0 Версия лазаньи: 0.2.dev1

...