2017-01-25 10 views
0

私はTensorFlowを使用してバイナリ分類ニューラルネットワークをトレーニングしています。TensorFlowでのcross_entropy計算の2つのバージョンの違い

半年前、私はTensorFlowウェブサイトDeep MNIST for Expertsのチュートリアルに従いました。

今日、両方のコード(チュートリアルと私が書いたコード)を比較すると、クロスエントロピー計算の違いがわかります。私はそれがなぜあるのか分からないという違いがあります。

チュートリアルのように計算され、クロスエントロピーは次のとおりです。

cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y_conv, y_)) 

次のように私のコードに計算がある間:

cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y_conv), reduction_indices=[1])) 

私はTensorflowに新たなんです、私は何かが欠けていると感じます。 Mabeyの違いは、TensorFlowチュートリアルの2つのバージョンの違いですか? 2行の実際の違いは何ですか?

本当にありがとうございます。ありがとう!

チュートリアルから該当するコード:

y_conv = tf.matmul(h_fc1_drop, W_fc2) + b_fc2 
... 
    cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y_conv, y_)) 
    train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy) 
    correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1)) 
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 
    sess.run(tf.global_variables_initializer()) 

マイコード:

# load data 
folds = build_database_tuple.load_data(data_home_dir=data_home_dir,validation_ratio=validation_ratio,patch_size=patch_size) 

# starting the session. using the InteractiveSession we avoid build the entiee comp. graph before starting the session 
sess = tf.InteractiveSession() 

# start building the computational graph 
# the 'None' indicates the number of classes - a value that we wanna leave open for now 
x = tf.placeholder(tf.float32, shape=[None, patch_size**2]) #input images - 28x28=784 
y_ = tf.placeholder(tf.float32, shape=[None, 2]) #output classes (using one-hot vectors) 

# the vriables for the linear layer 
W = tf.Variable(tf.zeros([(patch_size**2),2])) #weights - 784 input features and 10 outputs 
b = tf.Variable(tf.zeros([2])) #biases - 10 classes 

# initialize all the variables using the session, in order they could be used in it 
sess.run(tf.initialize_all_variables()) 

# implementation of the regression model 
y = tf.nn.softmax(tf.matmul(x,W) + b) 

# Done! 

# FIRST LAYER: 
# build the first layer 
W_conv1 = weight_variable([first_conv_kernel_size, first_conv_kernel_size, 1, first_conv_output_channels]) # 5x5 patch, 1 input channel, 32 output channels (features) 
b_conv1 = bias_variable([first_conv_output_channels]) 

x_image = tf.reshape(x, [-1,patch_size,patch_size,1]) # reshape x to a 4d tensor. 2,3 are the image dimensions, 4 is ine color channel 

# apply the layers 
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1) 
h_pool1 = max_pool_2x2(h_conv1) 

# SECOND LAYER: 
# 64 features each 5x5 patch 
W_conv2 = weight_variable([sec_conv_kernel_size, sec_conv_kernel_size, patch_size, sec_conv_output_channels]) 
b_conv2 = bias_variable([sec_conv_output_channels]) 

h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2) 
h_pool2 = max_pool_2x2(h_conv2) 

# FULLY CONNECTED LAYER: 
# 1024 neurons, 8x8 - new size after 2 pooling layers 
W_fc1 = weight_variable([(patch_size/4) * (patch_size/4) * sec_conv_output_channels, fc_vec_size]) 
b_fc1 = bias_variable([fc_vec_size]) 

h_pool2_flat = tf.reshape(h_pool2, [-1, (patch_size/4) * (patch_size/4) * sec_conv_output_channels]) 
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1) 

# dropout layer - meant to reduce over-fitting 
keep_prob = tf.placeholder(tf.float32) 
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob) 

# READOUT LAYER: 
# softmax regression 
W_fc2 = weight_variable([fc_vec_size, 2]) 
b_fc2 = bias_variable([2]) 

y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2) 

# TRAIN AND EVALUATION: 
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y_conv), reduction_indices=[1])) 
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy) 
correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1)) 
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 
sess.run(tf.initialize_all_variables()) 

答えて

3

差が小さいが、かなりsignificativeです。

softmax_cross_entropy_with_logitsは、ロギング(範囲制限なしの実数)を取り、softmax関数に渡してクロスエントロピーを計算します。両方を1つの関数に結合することは、数値精度を向上させるために最適化をいくつか適用することです。

2番目のコードは、クロスエントロピーを直接y_convに適用します。これはsoftmax関数の出力と思われます。これは正確であり、両者は同様の結果をもたらすはずであるが、数値安定性のためsoftmax_cross_entropy_with_logitsが優れている。ソフトマックスの出力ではなくロジットを与えてください。

関連する問題