Python Tensorflow,共享变量定义的放置

Python Tensorflow,共享变量定义的放置,python,tensorflow,Python,Tensorflow,我对张量流模型的定义有疑问。 我正在实现一个非常特殊的神经网络模型,在这个模型中,我需要获得不同输入的输出电平值,以计算损失函数 因此,我用如下函数定义了神经网络的层: def g(input_x,....): ###...Convolutional and Fully Connected Layers...### # Last FC Layer with tf.name_scope("output"): W = tf.Variable(tf.truncated_normal([num_

我对张量流模型的定义有疑问。 我正在实现一个非常特殊的神经网络模型,在这个模型中,我需要获得不同输入的输出电平值,以计算损失函数

因此,我用如下函数定义了神经网络的层:

def g(input_x,....):
###...Convolutional and Fully Connected Layers...###
# Last FC Layer
with tf.name_scope("output"):
    W = tf.Variable(tf.truncated_normal([num_hidden_units, num_classes], stddev=0.05), name="W")
    b = tf.Variable(tf.constant(0.1, shape=[num_classes]), name="b")
    scores = tf.nn.xw_plus_b(fc_2_output, W, b, name="output")
return scores
with tf.Graph().as_default():
    session_conf = tf.ConfigProto(
        allow_soft_placement=FLAGS.allow_soft_placement,
        log_device_placement=FLAGS.log_device_placement)
    sess = tf.Session(config=session_conf)
    with sess.as_default():
         ###definition of other variables, constants and placeholders###

         ###weird loss function with scores from different inputs###
         loss_function = tf.reduce_mean(alpha1 * weights_ll * tf.nn.softmax_cross_entropy_with_logits(logits=g(input1), labels=labels1) \
                        + cu1 * tf.nn.softmax_cross_entropy_with_logits(logits=g(input2), labels=g(input1) \
                        + cv1 * tf.nn.softmax_cross_entropy_with_logits(logits=g(input1), labels=labels2))) \
                        + ... + ...
        optimizer = tf.train.AdamOptimizer(1e-3).minimize(loss_function, global_step=global_step)
           ##...training steps and such...##
然后在我的模型中,我有这样的东西:

def g(input_x,....):
###...Convolutional and Fully Connected Layers...###
# Last FC Layer
with tf.name_scope("output"):
    W = tf.Variable(tf.truncated_normal([num_hidden_units, num_classes], stddev=0.05), name="W")
    b = tf.Variable(tf.constant(0.1, shape=[num_classes]), name="b")
    scores = tf.nn.xw_plus_b(fc_2_output, W, b, name="output")
return scores
with tf.Graph().as_default():
    session_conf = tf.ConfigProto(
        allow_soft_placement=FLAGS.allow_soft_placement,
        log_device_placement=FLAGS.log_device_placement)
    sess = tf.Session(config=session_conf)
    with sess.as_default():
         ###definition of other variables, constants and placeholders###

         ###weird loss function with scores from different inputs###
         loss_function = tf.reduce_mean(alpha1 * weights_ll * tf.nn.softmax_cross_entropy_with_logits(logits=g(input1), labels=labels1) \
                        + cu1 * tf.nn.softmax_cross_entropy_with_logits(logits=g(input2), labels=g(input1) \
                        + cv1 * tf.nn.softmax_cross_entropy_with_logits(logits=g(input1), labels=labels2))) \
                        + ... + ...
        optimizer = tf.train.AdamOptimizer(1e-3).minimize(loss_function, global_step=global_step)
           ##...training steps and such...##
训练是有效的,但如果不运行太长时间,我会得到奇怪的结果,我想知道g函数中定义的权重是否正在训练,或者它们有点超出优化器的范围

不幸的是,我仍然在学习很多关于tensorflow的知识,我现在还没有TensorBoard的结果

我只需要从经验丰富的人那里了解一下,使用python函数作为输出来定义这样的模型是否合法


非常感谢您阅读本文

您似乎没有使用

sess.run(tf.global_variables_initializer())

除此之外,如果不了解模型和代码,我们无法真正确定模型是否可行。

正如我所说,在损失函数中,我使用了不同输入的分数(网络的输出值),并使用交叉熵函数进行比较

tf.nn.softmax_cross_entropy_with_logits(logits, labels, name=None)
这个函数计算logit的softmax,但它自然不会计算标签的softmax,因此,为了正确比较不同输入的分数,我需要用tf.nn.softmax()函数包装“标签”,如下所示:(注意最后一个术语)

如果您对我为什么需要做这样的事情感到好奇,并且您对深度学习感兴趣,我邀请您阅读这篇关于神经图形机的有趣论文:

另外,这个模型还有一个大问题,我不共享变量,所以在实践中使用这个损失函数就像为损失函数的每个项训练多个网络


幸运的是,TensorFlow网站上有一个关于共享变量的教程:

Hi,将模型定义为python函数很好。这不存在访问问题。如果有任何问题,那可能是因为失去了功能。请显示您得到的奇怪结果的类型。损耗是否在减少?损耗正在减少为-1e+15的大负值,但精度没有增加,这是一个二元分类问题,平均值为0.5(随机猜测)。您是否尝试使用简单损耗函数(一组输入)?在这种情况下,精度是否会发生变化?非常缓慢,但确实如此。但这可能是由于模型的复杂性(卷积神经网络)。我想我只能等着瞧了。无论如何,这个建议非常有用,因为它帮助我排除了损失函数有问题的可能性。我们有目的地引入了实验半监督学习过程的偏差。但是,简化损失函数(将其简化为仅受监督的部分)表明,它保持在更合理的值中。当然,变量正在初始化,否则我根本无法训练它。整个代码都是在线的,但我认为最重要的部分实际上都在那里:)