theano中怎麼查看TensorVariable的值,在debug時如何跟蹤這樣的變數?

初學theano,在運行別人代碼來學慣用法時,發現TensorVariable的值很難觀察,一些function中的變數也很難跟蹤,我查到share型的可以用get_value()查看變數值,網上搜到有些答案說用.eval(),可是發現仍然不行。舉例:

print conv_out

得到結果:

AbstractConv2d{border_mode="valid", subsample=(1, 1), filter_flip=True, imshp=(256, 1, 100L, 100), kshp=(500, 1, 2, 100)}.0

print conv_out.shape

得到結果:

Shape.0

請問通過什麼方法可以觀察這樣的變數?

在debug程序時,發現設置斷點,function中的一些變數仍然查看不了,請問有什麼好的方法沒有?

感激不盡。


在Theano中,TensorConstant類型變數可以用value屬性獲取其值,TensorSharedVariable類型變數可以用get_value方法和set_value方法獲取和設置其值,而TensorVariable類型變數是沒有值的,無從獲取,只能通過對這個變數進行賦值(evaluate)來取值。

&>&>&> import theano
&>&>&> import theano.tensor as T
&>&>&> import numpy as np

&>&>&> x = T.constant(1)
&>&>&> type(x)
&
&>&>&> x.value
array(1, dtype=int8)

&>&>&> x = theano.shared(1)
&>&>&> type(x)
&
&>&>&> x.get_value()
array(1)
&>&>&> x.set_value(np.array(2))
&>&>&> x.get_value()
array(2)

&>&>&> x = T.scalar()
&>&>&> type(x)
&
&>&>&> y = x ** 2
&>&>&> y.eval({x:2})
array(4.0)

Theano是有名的難調試。至於如何在調試時觀察TensorVariable變數,個人建議在創建TensorVariable時,為其賦以一個獨特的名字,再配合以theano.pp列印。

&>&>&> x = T.scalar()
&>&>&> y = x ** 2
&>&>&> print(x)
&
&>&>&> print(y)
Elemwise{pow,no_inplace}.0
&>&>&> pp(x)
"&"
&>&>&> pp(y)
"(& ** TensorConstant{2})"

&>&>&> x = T.scalar("x")
&>&>&> y = x ** 2
&>&>&> print(x)
x
&>&>&> print(y)
Elemwise{pow,no_inplace}.0
&>&>&> pp(x)
"x"
&>&>&> pp(y)
"(x ** TensorConstant{2})"

以上,希望回答對你有用。如有錯誤,還請各位指正!


這個的話其實官方給的教程有非常清晰的說明。

直接說做法吧:

theano的變數有兩種,一種是 TensorSharedVariable ;另一種是 TensorVariable 變數。

兩種變數用python原來的方法,直接print 或是print .shape是不行的。

一、針對shared類型變數:

第一種變數其實比較方便訪問,使用get_value函數即可(只要import theano就可以)。

舉個例子:

這裡我定義了一個shared類型變數,四維張量,我用get_value就可以訪問了。

二、針對variable類型變數

一般這種類型變數是因變數,在定義時並沒有具體的值,debug時候很難處理。

所以基本邏輯就是,你給出一個臨時自變數,將函數跑一遍,記錄下來這些中間因變數,然後訪問。

theano針對這個問題又搞了一個config庫。你在程序頭需要導入config。

接著需要選擇模式,這一點官方教程中有給不同的模式具體是做什麼的。

Debugging Theano: FAQ and Troubleshooting

你不想了解直接按下面代碼來,這個raise模式下,如果你某個關聯的variable值沒有賦值就會報錯。

接下來,你所有相關的非shared自變數一定要賦值!!!

看我的代碼:

(不要問我為什麼起這樣的變數名,都是為了演示)

XX一個四維變數,YY=XX*XX,ZZ=YY*2

ZZ的值其實比較好訪問的,因為這是函數最終的輸出,代碼中也可以看到,直接令ggg=函數的輸出後再訪問就可以了。但是YY的值在theano中很難訪問,而我們調試時這個值卻相當重要。

所以定義XX後給一個test_value,調試調用時就用tag.test_value來訪問就行了。

至於為什麼要這樣,別問我,我也不懂~~~


首先說明一點,列印TensorVariable變數時,要確定這個變數已經賦值了,而不僅僅是一個符號。

Theano調試技巧 - 知乎專欄 中提到了可以使用 Test Values theano.printing.Print 列印TensorVariable的值。

題主提到了eval()列印方式,下面介紹下我如何使用eval()列印TensorVariable的值。

直接看代碼:

import theano
import theano.tensor as T
import numpy as np

x = theano.shared(np.array([2,3,5]))
y = theano.shared(np.array([1,3,0]))
print(x.get_value())
print(y.get_value())
z = x + y
print(type(z))
print(z.eval())
z = T.dot(x,y)
print(z.eval())

列印結果:

剛剛接觸theano, 了解得很片面。 以上如有錯誤,請各位指正!


推薦閱讀:

能否使用區塊鏈的算力來解決深度學習訓練?
目前,人工智慧語音在說中文時的語氣感覺上還比較機械,怎樣使人工智慧語音的語氣更自然一些?

TAG:自然語言處理 | Python入門 | 深度學習DeepLearning | 卷積神經網路CNN | Theano |