tflearn DNN 给出零损失

tflearn DNN gives zero loss

我正在使用 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)

这看起来应该可行,但我得到的输出如下...

注意 loss 保持在 0,所以我肯定做错了什么。我真的不知道我的数据应该采用什么形式。我怎样才能让我的训练发挥作用?

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

equation

Here 更能说明为什么默认选择的损失函数不适合您的情况