2015-05-25 6 views
0

У меня есть следующий фрагмент кода, в котором я пытаюсь применить PCA к набору данных MNIST.Нарезка матрицы в аргументе givens функции anano

X_train, y_train = mnist.data[:60000]/255., mnist.target[:60000] 

X_train, y_train = shuffle(X_train, y_train) 
X_train, y_train = X_train[:5000], y_train[:5000] 

pca = PCA(M=2) 

X = T.matrix('X', dtype='float64') 
i = T.scalar() 
j = T.scalar() 

# Theano function which fits the model to the 
# data i.e. applies dimensionality reduction 
transform = theano.function(
    inputs=[i, j], 
    outputs=pca.transform(X), 
    givens={ 
     X: X_train[(y_train == i) + (y_train == j)] 
    } 
) 

X_transformed = transform(i, j) 
y_ = y_train[(y_train == i) + (y_train == j)] 

Как видно в приведенном выше коде, я пытаюсь заменить X с ломтиком тренировочного набора данных в givens Params. Приведенный выше код, однако, приводит к следующей ошибке:

TypeError: Cannot convert Type TensorType(float64, vector) (of Variable <TensorType(float64, vector)>) into Type TensorType(float64, matrix). You can try to manually convert <TensorType(float64, vector)> into a TensorType(float64, matrix). 

Что означает, что я пытаюсь назначить вектор в матрицу, которая не является поведением, я бы ожидать (я два раза проверил с помощью NumPy). Я также попробовал другой подход, в котором я индексировал набор данных обучения X_train с массивом булевых напрямую, вместо того, чтобы использовать индексы, выполняет сами кусочки, но это также не сработало.

X_train, y_train = mnist.data[:60000]/255., mnist.target[:60000] 

X_train, y_train = shuffle(X_train, y_train) 
X_train, y_train = X_train[:5000], y_train[:5000] 

pca = PCA(M=2) 

X = T.matrix('X', dtype='float64') 
bool_arr = T.vector() 

# Theano function which fits the model to the 
# data i.e. applies dimensionality reduction 
transform = theano.function(
    inputs=[i, j], 
    outputs=pca.transform(X), 
    givens={ 
     X: X_train[bool_arr] 
    } 
) 

X_transformed = transform((y_train == i) + (y_train == j)) 
y_ = y_train[(y_train == i) + (y_train == j)] 

Что дает следующее сообщение об ошибке:

IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices 

Единственный подход, который сделал работа с использованием пренебрегая givens параметров, и, используя только входы и выходы, как таковые:

X = T.matrix('X', dtype='float64') 

# Theano function which fits the model to the 
# data i.e. applies dimensionality reduction 
transform = theano.function(
    inputs=[X], 
    outputs=pca.transform(X), 
) 

X_ = X_train[(y_train == i) + (y_train == j)] 
y_ = y_train[(y_train == i) + (y_train == j)] 

X_transformed = transform(X_) 

Тем не менее, мне любопытно, почему мои первые два подхода не работают, и было бы признательно, если бы кто-нибудь мог указать мне, где я могу ошибиться, так как я просто начинаю с Теано.

+0

Откуда берет «PCA»? – cfh

+0

@cfh Это просто класс, который я реализовал с помощью 'anano' – BitRiver

ответ

1

В theano documentation состояния:

givens (iterable over pairs (Var1, Var2) of Variables. List, tuple or dict. The Var1 and Var2 in each pair must have the same Type.) – specific substitutions to make in the computation graph (Var2 replaces Var1).

И в tutorial examples, есть заявление (курсив мой)

In practice, a good way of thinking about the givens is as a mechanism that allows you to replace any part of your formula with a different expression that evaluates to a tensor of same shape and dtype.

Таким образом, вы не можете заменить матрицу на вектор с помощью givens поскольку они не имеют одинаковой формы.

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