KhrulkovV / tt-pytorch

59 stars 15 forks source link

`TTLayer` doesn't work with non-contiguous input matrix #3

Open philip-bl opened 5 years ago

philip-bl commented 5 years ago

Репорчу баг, доставляющий сложности с использованием твоего TTLayer в некоторых моделях (например в Tensor Train GRU).

<ipython-input-38-60c832c24e05> in forward(self, X)
     63             # this is also called d^{(t)}
     64             updated_hidden_state_value = torch.tanh(
---> 65                 self.input_to_updated_hidden_value(X_part)
     66                 + self.hidden_state_to_updated_hidden_value(self.hidden_state * self.reset_gate)
     67             )

~/soft/conda/lib/python3.6/site-packages/torch/nn/modules/module.py in __call__(self, *input, **kwargs)
    487             result = self._slow_forward(*input, **kwargs)
    488         else:
--> 489             result = self.forward(*input, **kwargs)
    490         for hook in self._forward_hooks.values():
    491             hook_result = hook(self, input, result)

~/soft/conda/lib/python3.6/site-packages/t3nsor/layers.py in forward(self, x)
    126             return t3.tt_dense_matmul(weight_t, x_t).transpose(0, 1)
    127         else:
--> 128             return t3.tt_dense_matmul(weight_t, x_t).transpose(0, 1) + self.bias

~/soft/conda/lib/python3.6/site-packages/t3nsor/ops.py in tt_dense_matmul(tt_matrix_a, matrix_b)
     77     # data is (K, j0, ..., jd-2) x jd-1 x 1
     78     data = matrix_b.transpose(0, 1)
---> 79     data = data.view(-1, a_raw_shape[1][-1], 1)
     80 
     81     for core_idx in reversed(range(ndims)):

RuntimeError: invalid argument 2: view size is not compatible with input tensor's size and stride (at least one dimension spans across two contiguous subspaces). Call .contiguous() before .view(). at /opt/conda/conda-bld/pytorch_1549628766161/work/aten/src/THC/generic/THCTensor.cpp:220

Я думаю, он проявляется вот почему:

В forward моей модели подается тензор X размера 32 x 85 x 1131, где 32 - кол-во сэмплов в бэтче, 85 - кол-во кадров (это видео), 1131 - пиксели.

Так вот, в TTLayer моя модель подает, например, X[:, 0, :], потому что сначала она обрабатывает нулевые элементы последовательностей в бэтче, потом первые, и т.д. Соответсвенно X[:, 0, :].is_contiguous() возвращает False.

philip-bl commented 5 years ago

Оказывается, весь TTLayer не дружит с методом .to(device). Один такой фикс не поможет.

philip-bl commented 5 years ago

Как воркэраунд я в своем коде вызываю у матрицы метод contiguous() и результат уже передаю в TTLayer.