我在工作中需要一些帮助。目前,我在神经网络中使用Softmax层作为输出层来获取分类分数。但是,我需要在输出层将Softmax层替换为Logistic层。我有一些输入属于多个类别。Softmax显示了所有类别的概率,并将类别分配给最高概率的类别,这使得难以决定一个阈值来同时预测多个类别。而在使用Logistic函数的情况下,每个神经元将显示一个介于0到1之间的数字,我可以在这个情况下决定一个阈值。以下是我的代码:
2层网络初始化
# 参数
training_epochs = 10#100
batch_size = 64
display_step = 1
batch = tf.Variable(0, trainable=False)
regualarization = 0.009
# 网络参数
n_hidden_1 = 250 # 第一层特征数量
n_hidden_2 = 250 # 第二层特征数量
n_input = model.layer1_size # 向量输入(句子形状:30*10)
n_classes = 12 # 句子类别检测总类别(0-11类别)
# 用于绘图的历史存储变量
loss_history = []
train_acc_history = []
val_acc_history = []
# tf图形输入
x = tf.placeholder("float", [None, n_input])
y = tf.placeholder("float", [None, n_classes])
# 字符串
trainingString = "\n\n训练准确率和混淆矩阵:"
validationString = "\n\n验证集准确率和混淆矩阵:"
testString = "\n\n测试集准确率和混淆矩阵:"
goldString = "\n\n黄金集准确率和混淆矩阵:"
# 创建模型
def multilayer_perceptron(_X, _weights, _biases):
# 单层
#layer_1 = tf.nn.relu(tf.add(tf.matmul(_X, _weights['h1']), _biases['b1']))
#return tf.matmul(layer_1, weights['out']) + biases['out']
# 2层
# 带RELU激活的隐藏层
layer_1 = tf.nn.relu(tf.add(tf.matmul(_X, _weights['h1']), _biases['b1']))
# 带RELU激活的隐藏层
layer_2 = tf.nn.relu(tf.add(tf.matmul(layer_1, _weights['h2']), _biases['b2']))
return tf.matmul(layer_2, weights['out']) + biases['out']
# 存储层的权重和偏置
weights = {
# 1层
#'h1': w2v_utils.weight_variable(n_input, n_hidden_1),
#'out': w2v_utils.weight_variable(n_hidden_1, n_classes)
# 2层
'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层
#'b1': w2v_utils.bias_variable([n_hidden_1]),
#'out': w2v_utils.bias_variable([n_classes])
# 2层
'b1': w2v_utils.bias_variable([n_hidden_1]),
'b2': w2v_utils.bias_variable([n_hidden_2]),
'out': w2v_utils.bias_variable([n_classes])}
# 构建模型
pred = multilayer_perceptron(x, weights, biases)
# 定义损失和优化器
# 学习率
# 优化器:设置一个变量,每批次递增一次,并控制学习率衰减。
learning_rate = tf.train.exponential_decay(
0.02*0.01, # 基础学习率。
batch * batch_size, # 当前数据集索引。
X_train.shape[0], # 衰减步长。
0.96, # 衰减率。
staircase=True)
# L2正则化
l2_loss = tf.add_n([tf.nn.l2_loss(v) for v in tf.trainable_variables()])
# Softmax损失
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, y)) # 总成本
cost = cost+ (regualarization*0.5*l2_loss)
# Adam优化器
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost,global_step=batch)
# 初始化变量
init = tf.initialize_all_variables()
print "网络已初始化!"
我们如何修改这个网络,使每个输出神经元的概率在0到1之间?
回答:
只需更改以下行:
# 构建模型
pred = multilayer_perceptron(x, weights, biases)
改为
# 构建模型
model pred = tf.nn.sigmoid(multilayer_perceptron(x, weights, biases))