簡體   English   中英

在theano函數的給定參數中切片矩陣

[英]Slicing a matrix in the givens argument of a theano function

我有以下代碼,嘗試將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 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 PARAM,並且僅使用輸入和輸出,因此:

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開始。

theano文檔指出:

givens (可在變量對(Var1, Var2)進行迭代。列表,元組或字典。每對變量中的Var1Var2必須具有相同的Type。)–在計算圖中進行特定替換( Var2替代Var1 )。

教程示例中 ,有一個語句(強調我的意思)

在實踐中,思考的好辦法givens是作為一種機制,使您可以用不同的表達式計算結果為相同的形狀和D型張量替換公式的任何部分。

所以,你無法通過的方式取代由矢量矩陣givens的參數,因為它們不具有相同的形狀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM