0

私の仕事で少し助けが必要です。今、私はニューラルネットワークの分類スコアのための出力層としてSoftmax層を使用しています。しかし、Softmaxレイヤーを出力レイヤーのロジスティックレイヤーに置き換える必要があります。私は複数のクラスに属するいくつかの入力を持っています。 Softmaxはすべてのクラスにわたって確率を示しており、そのクラスを最も高い確率で割り当て、閾値を決定して一度に複数のクラスを予測することは困難です。ロジスティック関数の場合、各ニューロンは(0〜1)の間の数を表示し、その場合には閾値を決定することができる。Softmax出力レイヤーをTensorflowのLogisticレイヤーに置き換える方法は?

2層のネットワークの初期化私たちは、各出力ニューロンに(0-1)の間にある確率を持つようにこのネットワークを変更するにはどうすればよい

# 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!" 

:ここに は私のコードですか?

+1

# Construct model pred = multilayer_perceptron(x, weights, biases) 

を。違いは、確率を直接しきい値にするのではなく、各確率をシグモイドに送り、しきい値を選択することです。 – Mai

+0

今、私はsoftmax確率を得ています。しかし、私はシグモイド層が欲しいので、それぞれのニューロンは0-1の確率を返します。 Softmaxはすべてのクラスにわたって確率分布を返しており、最高値は入力のラベルとして選択されます。しかし、私は複数のラベルを持っており、それらを把握するためのしきい値が必要です。 S字状の場合、私は明らかにすべてのクラスが入力に属する0.5以上の閾値を設定するでしょうか?それは理にかなっていますか? –

+0

私は、分類のためにargmaxを取ったディストリビューションを取得することを理解しています。問題定義をリラックスさせて、複数の正のクラスを得ることを望みます。 1つの方法は、出力をランク付けして、任意のしきい値処理が嫌いな場合は上位Nを選択することです。あなたの流通の様子も重要です。あなたの出力が一貫して2つの0.4と他の0.0X(またはマルチモーダルのようなもの)を与えている場合は、トップグループまたはしきい値を0.2で選択します。あなたがシグモイドを通過させると、後で同じことをするでしょうが、1に追加する必要はありません。これは解釈するのが難しいです。 – Mai

答えて

0

だけの行に変更:私は混乱しています

# Construct model 
model pred = tf.nn.sigmoid(multilayer_perceptron(x, weights, biases))