基本张量流分类

2024-10-05 13:16:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在努力理解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之间。在

Normalized vs not normalized

蓝色:标准化数据,红色:上面创建的原始输入数据

批量输入数据。如果所使用的子集足够随机,它可以减少所需的迭代次数,而不会对精度造成太大的损害。在

别忘了层间的激活函数:)


Tags: 数据网络示例datalabelstensorflowmath标签
1条回答
网友
1楼 · 发布于 2024-10-05 13:16:43

输入:

用两个类绘制合成数据。在

enter image description here

上述代码的输出:

所有的输出被归类为一个单一的类,由于类不平衡,准确率高达70%。在

enter image description here


代码问题

  1. 即使定义了两个层,但在这两层之间没有定义激活函数。所以tf.softmax( ((x*w1)+b1) * w2 + b2)压缩到一个层。只有一个超平面试图分离这个输入,而这个超平面位于输入空间之外,这就是为什么所有输入都被分类为一个类。
  2. 错误:Softmax被应用两次:在logits上以及在entropy_loss期间。
  3. 整个输入作为单个批处理而不是mini-batches
  4. 输入需要规范化。

解决上述问题,输出变成:

enter image description here

上面的输出是有意义的,因为模型有两个隐藏层,所以我们有两个超平面试图分离数据。最后一层将这两个超平面组合在一起,以最大限度地减少误差。在


将隐藏层从2增加到3:

enter image description here

通过3个隐藏层,我们得到了3个超平面,我们可以看到最后一个层调整这些超平面来很好地分离数据。在


代码:

# Normalize data
data = (data - np.mean(data)) /np.sqrt(np.var(data))
n_hidden = 3
batch_size = 128

# Feed batch data
def get_batch(inputX, inputY, batch_size):
   duration = len(inputX)
   for i in range(0,duration//batch_size):
     idx = i*batch_size
     yield inputX[idx:idx+batch_size], inputY[idx:idx+batch_size]

# Create the graph    
tf.reset_default_graph()
graph=tf.Graph()
with graph.as_default():
   X = tf.placeholder(tf.float32, [None, 2] )
   layer1 = tf.layers.dense(X, n_hidden, activation=tf.nn.sigmoid)
   layer2 = tf.layers.dense(layer1, 2)
   Y = tf.nn.softmax(layer2)
   y_true = tf.placeholder(tf.int32, [None] )
   loss = tf.losses.sparse_softmax_cross_entropy(logits=layer2, labels=y_true)
   optimizer = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

   accuracy = tf.reduce_mean(tf.cast(tf.equal(tf.argmax(Y, 1),tf.argmax(tf.one_hot(y_true,2), 1)), tf.float32)) 

   # training
   with tf.Session(graph=graph) as session:
      session.run(tf.global_variables_initializer())
      for epoch in range(10):
        acc_avg = 0.
        loss_avg = 0.
        for step in range(10000//batch_size):
           for inputX, inputY in get_batch(data, labels, batch_size):
               _, l, acc = session.run([optimizer,loss,accuracy], feed_dict={X:inputX, y_true:inputY})
           acc_avg += acc
           loss_avg += l
        print("Loss at step %d: %f" % (step, loss_avg*batch_size/10000))
        print("Accuracy %f" % (acc_avg*batch_size/10000))        
   #Get prediction  
   pred = session.run(Y, feed_dict={X:data})

  # Plotting function
  import matplotlib.pylab as plt
  plt.scatter(data[:,0], data[:,1], s=20, c=np.argmax(pred,1),  cmap='jet', vmin=0, vmax=1)
  plt.show()

相关问题 更多 >

    热门问题