2.5 tensorflow2.3--變數Variable宣告和初始化
自己開發了一個股票智慧分析軟體,功能很強大,需要的點選下面的連結獲取:
https://www.cnblogs.com/bclshuai/p/11380657.html
1.1 變數Variable
1.1.1 變數的宣告和使用
變數,它和佔位符的不同是它在定義時需要賦值,而且它的數值是可以在圖的計算過程中隨時改變的。因此,佔位符通常用作圖的輸入(即訓練資料),而變數用作圖中可以被“訓練”或“學習”的那些tensor,例如y=ax+b中的a和b。
通過變數類Variable來定義,使用之前需要初始化。想要將所有圖變數進行集體初始化時應該使用tf.global_variables_initializer,或者單個初始化。
_init_(self,
initial_value=None,#初始值,張量或者能轉化為張量的python物件
trainable=None,#True時,GradientTape梯度帶自動觀察這個變數的使用
validate_shape=True,是否驗證初始值的shape,True驗證,False不驗證
caching_device=None,可選填的裝置字串描述符,需要快取讀時設定,預設為變數裝置
name=None,
variable_def=None,
dtype=None,
import_scope=None,
constraint=None,
synchronization=VariableSynchronization.AUTO,
aggregation=VariableAggregation.NONE,
shape=None):
rand_t=tf.random.uniform([50,50],0,10,seed=0)#建立隨機常量陣列50行50列,最大值為10,最小值為0,隨機種子是0。以這個矩陣陣列作為變數的初始值。
t_a=tf.Variable(rand_t)
t_b= tf.Variable(rand_t)
r = tf.Variable(tf.random_normal([20, 10], stddev=0.35)) #以標準差0.35的正太分佈初始化一個形狀為[20,10]的張量
z = tf.Variable(tf.zeros([20])) #定義變數,一個形狀為[20]的張量, 裡面的元素值全部為0.
#sess.run(tf.global_variables_initializer()) #所有變數初始化
sess.run(x.initializer) #單個變數初始化
1.1.2 變數的初始化
(1)常量宣告變數並初始化
tensorflow所有的變數在使用前都需要初始化。
下面這條語句用常量1賦值聲明瞭變數,但是沒有初始化。
import tensorflow as tf
ss = tf.compat.v1.Session()
d60 = tf.Variable(1, dtype=tf.float32, name='number1')
如果呼叫下面的語句,則會報錯,因為變數d60沒有初始化
d61 = tf.tan(d60)
print(ss.run(d61))
所以我們需要顯示初始化變數d60,才能輸出正確的資料。
ss.run(d60.initializer)
d61 = tf.tan(d60)
print(ss.run(d61))#輸出1.557
d60是定義的變數,而initializer是變數的初始化操作通過tensorflow的Session來執行這個操作,我們可以print(d60.initializer)來檢視這個操作是什麼?操作中包含了變數的d60的名稱,作為輸入,還有d60的型別。ss.run(d60.initializer)的作用就是執行變數d60的初始化操作,來初始化變數d60。感覺這個有點麻煩。
name: "number1/Assign"
op: "AssignVariableOp"
input: "number1"
input: "number1/Initializer/initial_value"
attr {
key: "dtype"
value {
type: DT_FLOAT
}
}
(2)變數宣告變數並初始化
宣告一個變數d62,以變數d60賦值。
d60 = tf.Variable(1, dtype=tf.float32, name='number1')
ss.run(d60.initializer)
d62 = tf.Variable(d60, dtype=tf.float32)#
d63=tf.tan(d62)
同樣我們還要執行變數d62的初始化操作來初始化變數d62,否則執行d63還是會報錯。同樣d60的初始化操作ss.run(d60.initializer)仍然不能省略,否則會報錯。
print(ss.run(d62.initializer))
print(ss.run(d63)) 上面d60初始化要加,否則會報錯。
補充資訊:
如果要省略ss.run(d60.initializer)這一句,宣告變數d62時,可以採用下面的宣告方式
d62 = tf.Variable(d60.initialized_value(), dtype=tf.float32)
我們看看initialized_value函式的說明,意思就是返回初始化後的變數值。初始化另外一個變數時,使用這個來代替變數本身。
def initialized_value(self):
"""Returns the value of the initialized variable.
You should use this instead of the variable itself to initialize another
variable with a value that depends on the value of this variable.
但是使用這個函式,會有下面的警告。意思就是這個函式是tensorflow1.0的,後續可能會被廢棄。建議使用tensorflow2.0的函式read_value.
WARNING:tensorflow:From D:/Project/python/tensorflow/venv/src/caculate.py:72: Variable.initialized_value (from tensorflow.python.ops.variables) is deprecated and will be removed in a future version.
Instructions for updating:
Use Variable.read_value. Variables in 2.X are initialized automatically both in eager and graph (inside tf.defun) contexts.
用tensorflow2.0的函式read_value來初始化另外一個變數。2.X中得到變數都是自動初始化。改成read_value()
d62 = tf.Variable(d60.read_value(), dtype=tf.float32)
d63=tf.tan(d62.read_value())
print(d63)
報如下錯誤,本地的容器不存在或者變數未初始化,所以導致了失敗。
Error while reading resource variable number1 from Container: localhost. This could mean that the variable was uninitialized. Not found: Container localhost does not exist.
需要加上初始化語句才行
init_op = tf.compat.v1.global_variables_initializer()
print(ss.run(init_op))