2016-08-05 54 views
0

我有這段代碼,它可以計算我的convnet輸出預測的softmax函數。Tensorflow softmax函數返回一個熱門編碼陣列

pred = conv_net(x, weights, biases, keep_prob, batchSize) 

softmax = tf.nn.softmax(pred) 

我的預測陣列是形狀[batch_size時,number_of_classes] = [128,6] 從該陣列的例子是行...

[-2.69500896e+08 4.84445800e+07 1.99136800e+08 6.12981480e+07 
2.33545440e+08 1.19338824e+08] 

的運行SOFTMAX函數I將得到後結果是一個熱編碼數組...

[ 0 0 0 0 1 0 ] 

我會認爲這是因爲我正在採取非常大的值的指數。我只是想知道如果我做錯了什麼,或者在應用softmax函數之前應該先縮放我的值。我的損失函數是

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, y)) 

,我與亞當優化

optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost) 

我的網絡最小化,這是能夠學習就好了。

我應用softmax函數的推理是獲取測試數據上每個類的概率值。

編輯

這似乎解決這些我SOFTMAX功能我要補充的標準化和規範化非常大的值。我已經添加了我的convnet的設計代碼,在正規化和正常化的地方提供任何幫助都非常棒。

# Create model 
def conv_net(x, weights, biases, dropout, batchSize): 

# Reshape input picture 
x = tf.reshape(x, shape=[-1, 150, 200, 1]) 
x = tf.random_crop(x, size=[batchSize, 128, 192, 1]) 

# Convolution Layer 1 
conv1 = conv2d(x, weights['wc1'], biases['bc1']) 
# Max Pooling (down-sampling) 
conv1 = maxpool2d(conv1, k=2) 

# Convolution Layer 2 
conv2 = conv2d(conv1, weights['wc2'], biases['bc2'])  
# Max Pooling (down-sampling) 
conv2 = maxpool2d(conv2, k=2) 

# Convolution Layer 3 
conv3 = conv2d(conv2, weights['wc3'], biases['bc3']) 
# Max Pooling (down-sampling) 
conv3 = maxpool2d(conv3, k=2) 

# Convolution Layer 4 
conv4 = conv2d(conv3, weights['wc4'], biases['bc4']) 
# Max Pooling (down-sampling) 
conv4 = maxpool2d(conv4, k=2) 

# Convolution Layer 5 
conv5 = conv2d(conv4, weights['wc5'], biases['bc5']) 
# Max Pooling (down-sampling) 
conv5 = maxpool2d(conv5, k=2) 

# Fully connected layer 
# Reshape conv5 output to fit fully connected layer input 
fc1 = tf.reshape(conv5, [-1, weights['wd1'].get_shape().as_list()[0]]) 
fc1 = tf.add(tf.matmul(fc1, weights['wd1']), biases['bd1']) 
fc1 = tf.nn.relu(fc1) 

# Apply Dropout 
fc1 = tf.nn.dropout(fc1, dropout) 

# Output, class prediction 
out = tf.add(tf.matmul(fc1, weights['out']), biases['out']) 

return out 

回答

0

你有一些正規化的嚴重需要。您的輸出大約爲10^8。通常,我們處理的數量要小得多。如果你添加更多的正則化,你的分類器不會對所有的東西都保持一定的確定性,並且它不會給出看起來像單一編碼的輸出。

+0

我也是有類似的問題,如果你能回答詳細說明會喜歡。我可以處理編程,但對於數學來說相對較新,對我來說這是非常先進的。在我的情況下,張量器遍佈於指數的位置,因爲我正在進行大嵌入加權張量的嵌入式查找。我的問題是,我將如何去正規化?它似乎不像增加regularizer = l2 ....對嵌入權重矩陣的變量定義有所幫助。所以當你對這個原始提問者作出迴應時,你會很樂意聽到你的意思。 – schone

+0

Softmax是一個指數。如果輸入中有一個數字是其他數字的100倍,那麼在輸出中它將會比其他數字大100倍。如果你正確地進行L2正規化,那麼你所有的數字都會變小,你不會看到這個問題。 – Aaron

1

可以發生多個原因的獨熱的編碼陣列問題:

  • 重量初始化太大(嘗試以較小的規模進行初始化的權重,如STDDEV = 1E-2)
  • 添加正規化您的損失函數對於所有的權重EJ:

    cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true,logits=y_conv)+beta*tf.nn.l2_loss(W_conv1) +beta*tf.nn.l2_loss(W_conv2) +beta*tf.nn.l2_loss(W_fc1)+beta*tf.nn.l2_loss(W_fc2))

  • 添加輟學

  • 結合差一些L2/L1正則化技術