我有二进制输出 - ' 1'或' 0'。
我没有把它编码为一个热点(因为我最初认为没有目的),当我运行我的转换网模型时,我得到了奇怪的结果 - 所有输出都是' 1&# 39;准确度约为57%。
我觉得有些不对劲。
所以我的问题是:我们是否总是需要将标签编码为热门?如果是这样,为什么(在二进制的情况下)?
我的代码:
线{'class': tf.argmax(prediction, 1)
表明应该有多个输出(如矢量),然后我们将一个元素放在一个具有最大概率的向量中 - 这个解释是否正确?所以它让我觉得我应该为二进制输出输出2个标签......
另外,我试图输出行中的实际概率
return {'class': prediction, 'prob': prediction}, loss, train_op
但它似乎没有用,我最终得到的只是[1 1 1 ... 1]
我的转型:
def my_conv_model(x, y):
# 1. form a 4d tensor of shape N x 1 x N_FEATURES x 1
x = tf.reshape(x, [-1, 1, N_FEATURES, 1])
##########################################################################
##### Conv layer 1 #####
conv1 = tf.contrib.layers.convolution2d(inputs=x,
num_outputs=N_FILTERS,
kernel_size=[1, 7],
stride=[1, 1],
padding='VALID')
# 3. Add a RELU for non linearity.
conv1 = tf.nn.relu(conv1)
# 4. Max pooling across output of Convolution+Relu.
pool1 = tf.nn.max_pool(conv1,
ksize=[1, 1, 3, 1],
strides=[1, 1, 3, 1],
padding='SAME')
##########################################################################
##### Conv layer 2 #####
conv2 = tf.contrib.layers.convolution2d(inputs=pool1,
num_outputs=N_FILTERS,
kernel_size=[1, 7],
padding='VALID')
pool2 = tf.nn.max_pool(conv2,
ksize=[1, 1, 2, 1],
strides=[1, 1, 2, 1],
padding='SAME')
last_pool_layer = pool2
last_pool_layer_shape = last_pool_layer.get_shape()
n_cols = (last_pool_layer_shape[2] * last_pool_layer_shape[3]).value
last_pool_layer = tf.reshape(last_pool_layer, [-1, n_cols])
fc_layer = tf.contrib.layers.fully_connected(inputs=pool2,
num_outputs=10,
activation_fn=tf.nn.relu)
last_layer = fc_layer
try:
last_layer_shape = last_layer.get_shape()
print("last_layer_shape", last_layer_shape)
last_layer = tf.reshape(last_layer, [-1, (last_layer_shape[2] * last_layer_shape[3]).value])
print("last_layer_shape", last_layer.get_shape())
exc_info = sys.exc_info()
y = tf.expand_dims(y, 1)
prediction, loss = learn.models.logistic_regression(last_layer, y)
print("prediction", prediction)
prediction = tf.Print(prediction, [prediction], message="This is a: ")
#print(prediction.eval())
train_op = tf.contrib.layers.optimize_loss(
loss=loss,
global_step=tf.contrib.framework.get_global_step(),
optimizer='SGD',
learning_rate=0.001)
#return {'class': tf.argmax(prediction, 1), 'prob': prediction}, loss, train_op
return {'class': prediction, 'prob': prediction}, loss, train_op
答案 0 :(得分:0)
你可能有一个错误,你的fc输入是input = pool2,我认为它们应该是last_pool_layer。
要回答你的是张量流,需要一个热门编码。您可以通过查找logistic_regression的实现并在此之后自行确认。
如果你这样做,你最终会here,你会发现它希望标签符合这种形式。
labels: Tensor, [batch_size, n_classes], labels of the output classes.
这意味着一个热门。如果它不是一个热点,它也会搞砸你试图做的数学运算,通过加权一些类比其他类更多。可能有一些函数可以隐式地将类标签转换为one-hot,但我不知道。