【问题标题】:Tensorflow softmax function returning one-hot encoded arrayTensorflow softmax 函数返回 one-hot 编码数组
【发布时间】:2016-12-11 09:24:58
【问题描述】:

我有这段代码可以根据我的 convnet 的输出预测计算 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 函数后,我将得到一个热编码数组的结果...

[ 0  0  0  0  1  0 ]

我认为这是因为我采用了非常大的值的指数。我只是想知道我是否做错了什么,或者我是否应该在应用 softmax 函数之前先缩放我的值。我的损失函数是

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

我正在使用 Adam Optimizer 将其最小化

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

【问题讨论】:

    标签: python machine-learning tensorflow deep-learning softmax


    【解决方案1】:

    one-hot 编码数组问题的发生可能有多种原因:

    • 权重初始化太大(尝试以较小的比例初始化权重,例如 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))

    • 添加退出

    • 将 dropout 与一些 L2/L1 正则化技术相结合

    【讨论】:

      【解决方案2】:

      您非常需要一些正则化。您的输出约为 10^8。通常,我们处理的数字要小得多。如果您添加更多正则化,您的分类器将不会对所有内容都如此确定,并且它不会给出看起来像一次性编码的输出。

      【讨论】:

      • 我也有类似的问题,如果您能详细说明答案,我会很高兴。我可以处理编程,但对数学比较陌生,这对我来说非常先进。在我的情况下,张量到处都是指数,因为我正在使用大型嵌入权重张量进行嵌入式查找。我的问题是,我将如何进行正则化?似乎将 regularizer=l2.... 添加到嵌入权重矩阵的变量定义中没有帮助。所以很想听听你在回复这个原始提问者时的意思。
      • Softmax 是幂运算。如果输入中的一个数字比其他数字大 100 倍,那么在输出中它将是 e^100 倍。如果你正确地进行 L2 正则化,那么你所有的数字都会变小,你不会看到这个问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-07
      • 2017-12-09
      • 2021-11-02
      • 2017-11-06
      • 1970-01-01
      • 2018-03-24
      • 2018-03-29
      相关资源
      最近更新 更多