У меня возникли проблемы с получением действительной модели с базой 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