如何在 Tensorflow 中用 Logistic 层替换 Softmax 输出层?
Posted
技术标签:
【中文标题】如何在 Tensorflow 中用 Logistic 层替换 Softmax 输出层?【英文标题】:How to replace Softmax ouput Layer with Logistic Layer in Tensorflow? 【发布时间】:2016-07-07 07:52:28 【问题描述】:我的工作需要一点帮助。现在,我使用 Softmax 层作为神经网络中分类分数的输出层。但是,我需要在输出层用逻辑层替换 Softmax 层。我有一些属于多个类的输入。 Softmax 显示所有类的概率,并将该类分配给最高概率,并且很难确定一个阈值来一次预测多个类。而在逻辑函数的情况下,每个神经元将显示一个介于 (0-1) 之间的数字,在这种情况下我可以决定一个阈值。 这是我的代码:
2层网络初始化
# Parameters
training_epochs = 10#100
batch_size = 64
display_step = 1
batch = tf.Variable(0, trainable=False)
regualarization = 0.009
# Network Parameters
n_hidden_1 = 250 # 1st layer num features
n_hidden_2 = 250 # 2nd layer num features
n_input = model.layer1_size # Vector input (sentence shape: 30*10)
n_classes = 12 # Sentence Category detection total classes (0-11 categories)
#History storing variables for plots
loss_history = []
train_acc_history = []
val_acc_history = []
# tf Graph input
x = tf.placeholder("float", [None, n_input])
y = tf.placeholder("float", [None, n_classes])
#Strings
trainingString = "\n\nTraining Accuracy and Confusion Matrix:"
validationString = "\n\nValidation set Accuracy and Confusion Matrix:"
testString = "\n\nTest set Accuracy and Confusion Matrix:"
goldString = "\n\nGold set Accuracy and Confusion Matrix:"
# Create model
def multilayer_perceptron(_X, _weights, _biases):
#Single Layer
#layer_1 = tf.nn.relu(tf.add(tf.matmul(_X, _weights['h1']), _biases['b1']))
#return tf.matmul(layer_1, weights['out']) + biases['out']
##2 layer
#Hidden layer with RELU activation
layer_1 = tf.nn.relu(tf.add(tf.matmul(_X, _weights['h1']), _biases['b1']))
#Hidden layer with RELU activation
layer_2 = tf.nn.relu(tf.add(tf.matmul(layer_1, _weights['h2']), _biases['b2']))
return tf.matmul(layer_2, weights['out']) + biases['out']
# Store layers weight & bias
weights =
##1 Layer
#'h1': w2v_utils.weight_variable(n_input, n_hidden_1),
#'out': w2v_utils.weight_variable(n_hidden_1, n_classes)
##2 Layer
'h1': w2v_utils.weight_variable(n_input, n_hidden_1),
'h2': w2v_utils.weight_variable(n_hidden_1, n_hidden_2),
'out': w2v_utils.weight_variable(n_hidden_2, n_classes)
biases =
##1 Layer
#'b1': w2v_utils.bias_variable([n_hidden_1]),
#'out': w2v_utils.bias_variable([n_classes])
##2 Layer
'b1': w2v_utils.bias_variable([n_hidden_1]),
'b2': w2v_utils.bias_variable([n_hidden_2]),
'out': w2v_utils.bias_variable([n_classes])
# Construct model
pred = multilayer_perceptron(x, weights, biases)
# Define loss and optimizer
#learning rate
# Optimizer: set up a variable that's incremented once per batch and
# controls the learning rate decay.
learning_rate = tf.train.exponential_decay(
0.02*0.01, # Base learning rate.
batch * batch_size, # Current index into the dataset.
X_train.shape[0], # Decay step.
0.96, # Decay rate.
staircase=True)
#L2 regularization
l2_loss = tf.add_n([tf.nn.l2_loss(v) for v in tf.trainable_variables()])
#Softmax loss
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, y))
#Total_cost
cost = cost+ (regualarization*0.5*l2_loss)
# Adam Optimizer
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost,global_step=batch)
# Initializing the variables
init = tf.initialize_all_variables()
print "Network Initialized!"
我们如何修改这个网络,使每个输出神经元的概率在 (0-1) 之间?
【问题讨论】:
我很困惑。所以不同的是你将每个概率发送到 sigmoid 然后选择一个阈值,而不是直接对概率进行阈值化? 现在,我得到了 softmax 概率。但是,我想要 sigmoid 层,所以每个神经元都会返回 0-1 的概率。 Softmax 返回所有类的概率分布,最高的将被选为输入标签。但是,我有多个标签,我需要一个阈值来找出这些标签。在 sigmoidal 的情况下,我会明确设置一个阈值,例如高于 0.5,所有类都属于输入吗?有意义吗? 我的理解是你得到一个分布,你从中获取 argmax 进行分类。我看到您想放宽问题定义,以便获得多个正类。如果您不喜欢任意阈值,一种方法就是对输出进行排名并选择前 N 个。它也很重要你的分布看起来如何。如果您的输出始终给出两个 0.4 和其他 0.0X(或任何类似多模式的),则选择顶部组或阈值 0.2。如果你通过 sigmoid 传递它们,之后你会做同样的事情,但它们不必加到 1,这更难解释。 在训练期间使用sigmoid_cross_entropy_with_logits
而不是softmax_cross_entropy_with_logits
,并在推理期间通过sigmoid
传递您的pred
变量
雅罗斯拉夫的结果不好,似乎只预测了一类:/
【参考方案1】:
换行:
# Construct model
pred = multilayer_perceptron(x, weights, biases)
到
# Construct model
model pred = tf.nn.sigmoid(multilayer_perceptron(x, weights, biases))
【讨论】:
以上是关于如何在 Tensorflow 中用 Logistic 层替换 Softmax 输出层?的主要内容,如果未能解决你的问题,请参考以下文章