У меня есть следующий фрагмент кода, в котором я пытаюсь применить 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_)
Тем не менее, мне любопытно, почему мои первые два подхода не работают, и было бы признательно, если бы кто-нибудь мог указать мне, где я могу ошибиться, так как я просто начинаю с Теано.
Откуда берет «PCA»? – cfh
@cfh Это просто класс, который я реализовал с помощью 'anano' – BitRiver