2017-05-12 59 views
2

當前我試圖訓練既有複數張量作爲輸入又作爲輸出的網絡。作爲損失函數,我採用輸出和地面真值之間的逐點差異的規範。
當我嘗試最小化損失函數時,張量流的'最小化'函數會報告意外的複數。我發現這很奇怪,因爲我期望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]. 

編輯: 我嘗試用實值權重替換複數權重。這需要在將這些權重乘以完全連接層之前將這些權重轉換爲複數值。這工作,所以我目前的假設是張量流不支持複雜權重的梯度計算。任何人都可以確認嗎?

+0

是的,看起來像optimizer.py中的'_valid_dtypes'明確排除複雜和整數。您可以嘗試將該檢查註釋掉,看看是否有效。我期待着你會碰到一些沒有實施複雜支持的操作,複雜的支持與浮點數相比是不穩定的32 –

回答

2

您已經從錯誤中獲得確認。同樣來自source code功能_assert_valid_dtypes使用

def _valid_dtypes(self): 
    """Valid types for loss, variables and gradients. 
    Subclasses should override to allow other float types. 
    Returns: 
     Valid types for loss, variables and gradients. 
    """ 
    return set([dtypes.float16, dtypes.float32, dtypes.float64]) 

這恰恰是錯誤告訴你。

這不是TF不能正確處理複雜值的唯一地方。即使像tf.reduce_prod這樣的計算也有問題。

+0

這解釋了它。我希望這是一個簡單的錯誤(在我的結尾或tensorflows結束)。下一步是嘗試查看是否可以在我需要的幾個地方添加複雜的支持。 – dimpol

相關問題