2017-05-12 2 views
2

현재 복소수 값의 텐서가 입력 및 출력 모두 인 네트워크를 학습하려고합니다. 손실 함수로서, 나는 출력과 지상 진리의 pointwise difference의 표준을 취한다.
손실 함수를 최소화하려고 시도 할 때 tensorflow의 '최소화'함수는 예기치 않은 복소수에 대해 불평합니다. 나는 이상한 것을 발견했다. 왜냐하면 나는 tensorflow가 복소수의 등받이를 처리 할 수 ​​있기를 기대했기 때문이다. 또한, 나는 손실 값이 참으로 실제 값을 갖는 텐서임을 명시 적으로 체크했다.
내가 막힌 이유는 tensorflows 코드에서 오류가 발생하고 그라디언트 유형을 기반으로하는 것 같습니다. 여기서 나는 후드 아래에서 정확히 무슨 일이 일어 났는지, 그리고 이러한 그래디언트 계산이 어떻게 일어나야 하는지를 알기가 어렵다. 누가 복잡한 네트워크가 tensorflow로 훈련되어야한다고 생각하는지 알려주는 사람이 있습니까?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]. 

편집 : 복잡한 가중치를 실수 가중치로 대체하려고했습니다. 이렇게하려면 가중치를 완전히 연결된 레이어 내부에 곱하기 전에 해당 가중치를 복잡한 값으로 캐스팅해야합니다. 이것은 작동했기 때문에 현재의 가설은 tensorflow가 복잡한 가중치에 대한 그래디언트 계산을 지원하지 않는다는 것입니다. 아무도 이것을 확인할 수 있습니까?

+0

그래, optimizer.py에서'_valid_dtypes'와 같이 보이면 명시 적으로 복소수와 정수를 제외합니다. 당신은 그 수표에 대해 논평을 시도하고 일이 효과가 있는지 볼 수 있습니다. 나는 당신이 복잡한 지원을 구현하지 않은 운영체제를 공격 할 것으로 예상하고 있으며, 복잡한 지원은 float32와 비교할 때 반점이 있습니다. –

답변

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