在theano函数

时间:2015-05-25 12:56:24

标签: python slice pca theano

我有以下代码,我尝试将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。

1 个答案:

答案 0 :(得分:1)

theano documentation州:

  

givens(可迭代变量(Var1, Var2)的变量。列表,元组或   字典。每对中的Var1Var2必须具有相同的类型。) -   要在计算图中进行的特定替换(Var2替换   Var1)。

tutorial examples中,有声明(强调我的)

  

在实践中,考虑givens的一种好方法是作为一种机制   这允许您用不同的替换公式的任何部分   将计算为相同形状和dtype 的张量的表达式。

所以,你不能通过givens参数用向量替换矩阵,因为它们没有相同的形状。