首页 文章

如何定义一个TensorFlow图,其中不同的dim和多个不同的dim层的多个输入到一个层?

提问于
浏览
0

设置每个图层的名称后,下面的我的代码运行良好 .

=================== old ===============

如何使用不同dim的多个输入定义TensorFlow图?例如,我的输入(X1,X2,X3)具有不同的暗淡(d1,d2,d3) . 如何定义一个多输入层结合不同大小的hidden-1层,然后将三个hidden-1层组合到hidden-2层,然后用一个输出层?谢谢大家!我尝试了一些这样的代码:model_fn(features,labels,mode,params):

input_layers = [tf.feature_column.input_layer(features=features, feature_columns=params["feature_columns"][i]) for i, fi in enumerate(FEA_DIM)]
hidden1 = [tf.layers.dense(input_layers[i], H1_DIM[i], tf.nn.selu) for i, _ in enumerate(FEA_DIM)]
hidden1_c = tf.concat(hidden1, -1, "concat")
hidden2 = tf.layers.dense( inputs=hidden1_c, units=32, activation=tf.nn.selu, )
predictions = tf.layers.dense(inputs=hidden2, units=NCLASS, activation=tf.nn.softmax)
labels = tf.contrib.layers.one_hot_encoding(labels, NCLASS)
loss = tf.losses.sigmoid_cross_entropy(labels, predictions)
optimizer = tf.train.AdamOptimizer(learning_rate=1)
train_op = optimizer.minimize( loss=loss, global_step=tf.train.get_global_step())
return tf.estimator.EstimatorSpec( mode=mode, loss=loss, train_op=train_op)

但它确实't work: the accuracy is unchange at training time. and the tensorboard'的模型图是(dense_xx是hidden1的张量):
enter image description here

2 回答

  • 0

    最大的问题在于这些方面

    predictions = tf.layers.dense(inputs=hidden2, units=NCLASS, activation=tf.nn.softmax)
    labels = tf.contrib.layers.one_hot_encoding(labels, NCLASS)
    loss = tf.losses.sigmoid_cross_entropy(labels, predictions)
    

    首先,由于你有多个类,你应该使用 softmax_cross_entropy ,或者更好, sparse_softmax_cross_entropy 来免除一个热门编码 .

    其次, softmax_cross_entropysigmoid_cross_entropy 的输入应该是非标准化分数,所以 activation=tf.nn.softmax 是错误的 . 所有深度学习框架都将softmax / sigmoid与交叉熵一步组合在一起,因为组合操作具有更好的性能和数值稳定性,因此您不应该首先自己计算softmax .

    第三,你的学习率太高了 . 在大多数情况下,甚至0.0025仍然太高 . 你应该从0.001开始,然后从那里上下调整 .

    最后,我不明白为什么你先 dense 然后 concat . 为什么不连接所有功能然后一起转换?

  • 1

    有关如何连接图层,请提供完整的运行代码示例:

    input_layers = [tf.feature_column.input_layer(features=features, feature_columns=params["feature_columns"][i]) for i, fi in enumerate(FEA_DIM)]
    hidden1 = [tf.layers.dense(input_layers[i], H1_DIM[i], tf.nn.selu, name="h_1_%s" % i,
                kernel_regularizer=tf.contrib.layers.l1_l2_regularizer(scale_l1=1e-3, scale_l2=1e-2), kernel_initializer=tf.truncated_normal_initializer(stddev=1.0/math.sqrt(H1_DIM[i]+FEA_DIM[i]))
                ) for i, _ in enumerate(FEA_DIM)]
    hidden1_c = tf.concat(hidden1, -1, "concat")
    hidden2 = tf.layers.dense(inputs=hidden1_c, units=128, activation=tf.nn.selu, name="h_2",
            kernel_regularizer=tf.contrib.layers.l2_regularizer(scale=1e-2), kernel_initializer=tf.truncated_normal_initializer(stddev=1.0/math.sqrt(128+H1_DIM[i])))
    predictions = tf.layers.dense(inputs=hidden2, units=NCLASS, activation=None, kernel_regularizer=tf.contrib.layers.l2_regularizer(scale=1e-2), kernel_initializer=tf.truncated_normal_initializer(stddev=0.1), name="output")
    

相关问题