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)
然后我将 data
和 labels
送入 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] 是预测概率。
Here 更能说明为什么默认选择的损失函数不适合您的情况
我正在使用 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)
然后我将 data
和 labels
送入 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] 是预测概率。
Here 更能说明为什么默认选择的损失函数不适合您的情况