【问题标题】:tflearn DNN gives zero losstflearn DNN 零损失
【发布时间】:2018-04-24 20:19:33
【问题描述】:

我正在使用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,所以我肯定做错了什么。我真的不知道我的数据应该采用什么形式。我怎样才能让我的训练发挥作用?

【问题讨论】:

  • 您能否提供一个示例数据集,可以针对表现出您所描述症状的完整代码进行空闲运行?
  • 你的意思是“问题”,我在这里没有疑虑。我不做 Pandas 或 NumPy,所以你会想等待有人来回答。既然你提供了足够的东西来复制这个问题……我真的看不出有什么问题,但是其他受过训练的人可能会。

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


【解决方案1】:

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

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

【讨论】:

  • 这很有帮助,谢谢,我做了一些研究,最后用optimizer=sgdloss=mean_square 实现了线性回归,我想我现在意识到softmax 基本上就像sigmoid 函数和而是用于分类问题。
  • 另外我不确定为什么这个问题仍然被否决,我编辑了我的问题,所以我认为不值得投反对票。
猜你喜欢
  • 1970-01-01
  • 2017-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多