我正在使用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 :(得分:2)
您的实际输出范围为0到100,而最外层的激活softmax输出范围为[0,1]。你需要解决这个问题。此外,tflearn.regression的默认损失是分类交叉熵,它用于分类问题,在您的方案中没有任何意义。你应该尝试L2损失。您在此设置中获得零错误的原因是您的网络为所有训练示例预测0,如果您在sigmoid cross entropy的公式中拟合该值,则损失确实为零。这是它的公式,其中t [i]表示实际概率(在你的问题中没有意义)和o [i]是预测的概率。
Here更多的理由是为什么默认选择损失函数不适合您的情况