首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tensorflow中复值网络中的最小损失

tensorflow中复值网络中的最小损失
EN

Stack Overflow用户
提问于 2017-05-12 09:45:01
回答 1查看 2.5K关注 0票数 3

目前,我正试图训练一个既具有复数张量作为输入又作为输出的网络。作为损失函数,我取输出和地面真理之间的点态差的范数。

当我试图最小化损失函数时,tensorflow的“最小化”函数会抱怨意外的复数。我觉得这很奇怪,因为我期望tensorflow能够处理复数的反向道具。此外,我明确地检查了损失值确实是一个实值张量.

我陷入困境的原因是,错误发生在张量流代码中,并且似乎是基于梯度的类型。在这里,我发现很难看到在引擎盖下到底发生了什么,以及这些梯度计算是如何发生的。有人能帮我弄清楚tensorflow应该如何训练复杂的网络吗?

下面是一个最小的自包含代码示例。它只是有一个复杂的完全连接的层,包含所有的代码,直到最小化函数,下面是我得到的相应的错误消息:

代码语言:javascript
复制
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

以及错误消息:

代码语言:javascript
复制
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不支持复杂权重的梯度计算。有人能证实这一点吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-12 20:21:00

您已经从错误中得到了确认。也是从源代码函数_assert_valid_dtypes使用

代码语言:javascript
复制
  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不能正确处理复杂值的唯一地方。即使像生产这样的计算也有问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43934487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档