我有这段代码计算来自我的 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