首页 文章

Tensorflow softmax函数返回单热编码数组

提问于
浏览
1

我有这段代码来计算我的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函数的原因是为了获得测试数据上每个类的概率值 .

EDIT

它似乎修复了我的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

2 回答

  • 0

    单热编码阵列问题可能由于多种原因而发生:

    • 重量初始化太大(尝试用较小的比例初始化权重,如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正则化技术相结合

  • 1

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

相关问题