2016-08-05 55 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正则化技术