2016-02-11 2 views
1

Рассмотрим следующий фрагмент кода:нарезка в Теано преобразует матрицу в вектор

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

batch_shape = (50, 40, 30, 30) 
batch_size = batch_shape[0] 
ncols = batch_shape[1]*batch_shape[2]*batch_shape[3] 
minibatch = theano.tensor.tensor4(name='minibatch', 
            dtype=theano.config.floatX) 
xflat = minibatch.reshape((batch_size,ncols)) 

partition = np.array([1, 2, 3]) 
xsub1 = xflat[:,partition] 

partition = np.array([1]) 
xsub2 = xflat[:,partition] 

print "xsub1.type: ", xsub1.type 
print "xsub2.type: ", xsub2.type 

Если вы запустите ее, вы получите следующий вывод:

xsub1.type: TensorType(float64, matrix) 
xsub2.type: TensorType(float64, col) 

Видимо индексации с массивом длины 1 превращает xsub2 в col вместо матрицы. Как я могу сделать xsub2 матрицей?

ответ

1

A col или "column vector" - это название, которое использует Anano для символической матрицы, которая, как известно, содержит только один столбец. Его можно использовать так же, как матрицу.

Теано часто не знает формы определенного символического тензора, а только его размерности. Однако в некоторых случаях, например, в вопросе, Теано может сделать вывод о том, что тензор имеет особый частный случай формы и иногда может использовать эту информацию для оптимизации вычисления. Вот почему colrow) существуют как особые случаи matrix.

Если вы думаете о форме более типа, то вы увидите, что Theano ведет себя так же, как NumPy:

import theano 
import theano.tensor 
import numpy as np 


def compute(minibatch): 
    xflat = minibatch.reshape((minibatch.shape[0], -1)) 
    partition = np.array([1, 2, 3]) 
    xsub1 = xflat[:, partition] 
    partition = np.array([1]) 
    xsub2 = xflat[:, partition] 
    return xsub1, xsub2 


def compile_theano_version(): 
    minibatch = theano.tensor.tensor4(name='minibatch', dtype=theano.config.floatX) 
    xsub1, xsub2 = compute(minibatch) 
    print xsub1.type, xsub2.type 
    return theano.function([minibatch], [xsub1, xsub2]) 


def numpy_version(minibatch): 
    return compute(minibatch) 


def main(): 
    batch_shape = (50, 40, 30, 30) 
    minibatch = np.random.standard_normal(size=batch_shape).astype(theano.config.floatX) 

    xsub1, xsub2 = numpy_version(minibatch) 
    print xsub1.shape, xsub2.shape 

    theano_version = compile_theano_version() 
    xsub1, xsub2 = theano_version(minibatch) 
    print xsub1.shape, xsub2.shape 


main() 

Это печатает

(50L, 3L) (50L, 1L) 
TensorType(float64, matrix) TensorType(float64, col) 
(50L, 3L) (50L, 1L) 

Так col действительно матрица с одним столбцом и не вектор.

+0

Как бы вы преобразовали из col в матрицу? Я получаю сообщение об ошибке из-за ошибок проверки внутри Theano, которые проверяют, используется ли один и тот же тип переменных в нескольких местах и ​​не позволяют обменять тип (N, 1) col с матрицей (N, 1). – pir

+0

Извините @pir, я больше не работаю с Theano и не знаю ответа на ваш вопрос. Может быть, вы могли бы задать новый вопрос в StackOverflow? –

Смежные вопросы