如何定义一个TensorFlow图形,其中多个不同暗淡的输入和多个不同的昏暗层组合到一个层?

时间:2018-01-19 14:35:47

标签: tensorflow

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

=================== 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)

但它确实有效:准确性在训练时间是不变的。 而tensorboard的模型图是(dense_xx是hidden1的张量): enter image description here

2 个答案:

答案 0 :(得分:1)

最大的问题在于这些行

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 :(得分:0)

关于如何连接图层,给出完整的运行代码示例:

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")