我有以下代码,我尝试将PCA应用于MNIST数据集。
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
。但是,上述代码会导致以下错误:
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_)
尽管如此,我还是很好奇为什么我的前两种方法不起作用,并且如果有人能指出我可能出错的地方,我会很感激,因为我刚开始使用Theano。
答案 0 :(得分:1)
givens
(可迭代变量(Var1, Var2)
的变量。列表,元组或 字典。每对中的Var1
和Var2
必须具有相同的类型。) - 要在计算图中进行的特定替换(Var2
替换Var1
)。
在tutorial examples中,有声明(强调我的)
在实践中,考虑
givens
的一种好方法是作为一种机制 这允许您用不同的替换公式的任何部分 将计算为相同形状和dtype 的张量的表达式。
所以,你不能通过givens
参数用向量替换矩阵,因为它们没有相同的形状。