當前我試圖訓練既有複數張量作爲輸入又作爲輸出的網絡。作爲損失函數,我採用輸出和地面真值之間的逐點差異的規範。
當我嘗試最小化損失函數時,張量流的'最小化'函數會報告意外的複數。我發現這很奇怪,因爲我期望tensorflow能夠處理複數的反向支持。另外,我明確地檢查了損失值確實是一個實值張量。
我被卡住的原因是,這個錯誤發生在tensorflows代碼的深處,似乎是基於梯度的類型。在這裏,我很難看到引擎蓋下到底發生了什麼,以及這些梯度計算應該如何發生。任何人都可以幫我弄清楚複雜網絡應該如何用tensorflow進行訓練?使張量流中的復值網絡中的損失最小化
這是一個最小的獨立代碼示例。它只是有一個單一的複合完全連接層,幷包含所有代碼到最小化的功能和它下面的相應的錯誤信息獲取:
import tensorflow as tf
def do_training():
# Create placeholders for potential training-data/labels
train_data_node = tf.placeholder(tf.complex64,
shape=(25, 10),
name="train_data_node")
train_labels_node = tf.placeholder(tf.complex64,
shape=(25, 10),
name="train_labels_node")
# create and initialise the weights
weights = {
'fc_w1': tf.Variable(tf.complex(tf.random_normal([10, 10], stddev=0.01, dtype = tf.float32),
tf.random_normal([10, 10], stddev=0.01, dtype = tf.float32))),
'fc_b1': tf.Variable(tf.complex(tf.random_normal([10]), tf.random_normal([10]))),
}
prediction = model(train_data_node, weights)
loss = tf.real(tf.norm(prediction - train_labels_node))
train_op = tf.train.AdamOptimizer(learning_rate=1.0).minimize(loss)
def model(data, weights):
l1 = tf.matmul(data, weights['fc_w1']) # FC
l1 = l1 + weights['fc_b1']
return l1
和錯誤消息:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/myFolder/training.py", line 23, in do_training
train_op = tf.train.AdamOptimizer(learning_rate=1.0).minimize(loss)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/training/optimizer.py", line 315, in minimize
grad_loss=grad_loss)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/training/optimizer.py", line 392, in compute_gradients
if g is not None and v.dtype != dtypes.resource])
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/training/optimizer.py", line 517, in _assert_valid_dtypes
dtype, t.name, [v for v in valid_dtypes]))
ValueError: Invalid type tf.complex64 for Variable:0, expected: [tf.float32, tf.float64, tf.float16].
編輯: 我嘗試用實值權重替換複數權重。這需要在將這些權重乘以完全連接層之前將這些權重轉換爲複數值。這工作,所以我目前的假設是張量流不支持複雜權重的梯度計算。任何人都可以確認嗎?
是的,看起來像optimizer.py中的'_valid_dtypes'明確排除複雜和整數。您可以嘗試將該檢查註釋掉,看看是否有效。我期待着你會碰到一些沒有實施複雜支持的操作,複雜的支持與浮點數相比是不穩定的32 –