我正在努力理解tensorflow,我找不到不依赖MNIST数据集的好的基本示例。我尝试为一些公共数据集创建一个分类nn,它们提供许多(未知)特性,并为每个样本创建一个标签。有一家公司提供了大约90种音频分析功能,并以出版年份为标签。(https://archive.ics.uci.edu/ml/datasets/yearpredictionmsd)
不用说,我没能训练网络,我也没法理解所提供的特性。在
我现在正在尝试生成人工数据,并尝试围绕它训练一个网络。数据是成对的数字(位置),如果该位置位于围绕任意点(5,5)的半径r的圆内,则标签为1。在
numrows=10000
circlex=5
circley=5
circler=3
data = np.random.rand(numrows,2)*10
labels = [ math.sqrt( math.pow(x-circlex, 2) + math.pow(y-circley, 2) ) for x,y in data ]
labels = list( map(lambda x: x<circler, labels) )
如果尝试了网络形状、参数、优化器、学习率等的多种组合(我承认数学在这一点上并不强大),但要么没有收敛,要么很糟糕(上次测试的准确率为70%)。在
当前版本(标签转换为一个\u热编码[1,0]和[0,1](外部、内部)。在
^{pr2}$本例中的准确度约为70%(损失约为0.6)。在
问题是。。。我做错什么了?在
我把问题原原原本本地问了。我学到的主要经验:
规范化输入数据。平均值应在0左右,范围在-1和1之间。在
蓝色:标准化数据,红色:上面创建的原始输入数据
批量输入数据。如果所使用的子集足够随机,它可以减少所需的迭代次数,而不会对精度造成太大的损害。在
别忘了层间的激活函数:)
输入:
用两个类绘制合成数据。在
上述代码的输出:
所有的输出被归类为一个单一的类,由于类不平衡,准确率高达70%。在
代码问题
tf.softmax( ((x*w1)+b1) * w2 + b2)
压缩到一个层。只有一个超平面试图分离这个输入,而这个超平面位于输入空间之外,这就是为什么所有输入都被分类为一个类。Softmax
被应用两次:在logits
上以及在entropy_loss
期间。mini-batches
。解决上述问题,输出变成:
上面的输出是有意义的,因为模型有两个隐藏层,所以我们有两个超平面试图分离数据。最后一层将这两个超平面组合在一起,以最大限度地减少误差。在
将隐藏层从2增加到3:
通过3个隐藏层,我们得到了3个超平面,我们可以看到最后一个层调整这些超平面来很好地分离数据。在
代码:
相关问题 更多 >
编程相关推荐