tflearn DNN给出零损失

时间:2017-11-11 20:30:52

标签: python-3.x numpy tensorflow neural-network tflearn

我正在使用pandas来提取我的data。为了了解我的data我复制了一个示例数据集...

data = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD'))

产生shape=(100,4) ...

的数据集
    A   B   C   D
0  75  38  81  58
1  36  92  80  79
2  22  40  19  3
   ...    ...

我正在使用tflearn所以我还需要一个目标标签。所以我通过从data中提取一个列然后将其从data变量中删除(我还将所有内容都转换为numpy数组)来创建目标标签...

# Target label used for training
labels = np.array(data['A'].values, dtype=np.float32)

# Reshape target label from (100,) to (100, 1)
labels = np.reshape(labels, (-1, 1))

# Data for training minus the target label.
data = np.array(data.drop('A', axis=1).values, dtype=np.float32)

然后我拿走datalabels并将其反馈到DNN ......

# Deep Neural Network.    
net = tflearn.input_data(shape=[None, 3])
net = tflearn.fully_connected(net, 32)
net = tflearn.fully_connected(net, 32)
net = tflearn.fully_connected(net, 1, activation='softmax')
net = tflearn.regression(net)

# Define model.
model = tflearn.DNN(net)
model.fit(data, labels, n_epoch=10, batch_size=16, show_metric=True)

这似乎应该可行,但我得到的输出如下......

enter image description here

请注意loss仍在0,所以我肯定做错了。我真的不知道我的数据应该是什么形式。我怎样才能让我的培训工作?

1 个答案:

答案 0 :(得分:2)

您的实际输出范围为0到100,而最外层的激活softmax输出范围为[0,1]。你需要解决这个问题。此外,tflearn.regression的默认损失是分类交叉熵,它用于分类问题,在您的方案中没有任何意义。你应该尝试L2损失。您在此设置中获得零错误的原因是您的网络为所有训练示例预测0,如果您在sigmoid cross entropy的公式中拟合该值,则损失确实为零。这是它的公式,其中t [i]表示实际概率(在你的问题中没有意义)和o [i]是预测的概率。

equation

Here更多的理由是为什么默认选择损失函数不适合您的情况