机器学习和生物信息学实验室联盟

标题: 使用tensorflow编写MLP分类器 [打印本页]

作者: guojiasheng    时间: 2016-7-26 19:27
标题: 使用tensorflow编写MLP分类器
本帖最后由 guojiasheng 于 2016-8-13 21:28 编辑

                                                                        MLP:多层神经网络
      MLP,算是在ANN里面比较常见的算法。多层神经网络,其实就是三层,输入层、隐层,输出层。不在所谓的深度学习行列之内。
      Tensorflow:是谷歌开源的一个机器学习框架,主要用来做一些深度学习之类,当然我们可以借助平台的API编写普通的那些分类器比如:线性回归、逻辑回归,MLP这样的。
       下面是实验的一些代码,包括数据的读人loadData,学习参数的定义HyperParamsConfig,分类器MLP,分类器的训练classifer():
        可以看到其实只要30行左右的代码,就可以写出MLP算法。
        
        我这边放了相应的训练数据,以及运行输出情况:
     
        0 auc rate: 0.151080259165 loss: 0.690847
        1 auc rate: 0.876808885537 loss: 0.303999
        2 auc rate: 0.876960498924 loss: 0.294305
        3 auc rate: 0.876822668572 loss: 0.288582
        4 auc rate: 0.877036581278 loss: 0.284765
        5 auc rate: 0.877435737977 loss: 0.282044
        6 auc rate: 0.877720771144 loss: 0.28001       

     数据格式大家可以参照代码就知道,第一列为标签,其他列为特征,以“\t"隔开。
1                0        0        0.0        3.43398720449        4.39444915467        0.0        0.0        0.0        48.7500        105.1875        9.6667
1                0        0        1.79175946923        7.50769007782        6.82328612236        2.63905732962        4.42159069547
0                0        0        0.0        2.3978952728        3.55534806149        0.0        0.0        0.0        8.2500        17.6875        2.0000        20.0000        0.7273       

   
  1. import numpy as np
  2. import tensorflow as tf
  3. from sklearn.metrics import roc_auc_score
  4. from sklearn import metrics

  5. from sklearn.cross_validation import KFold


  6. def dense_to_one_hot(labels_dense,num_classes=2):
  7.         """ convert class lables from scalars to one-hot vector"""
  8.         labels_dense = np.asarray(labels_dense)
  9.         num_labels = labels_dense.shape[0]
  10.         index_offset = np.arange(num_labels)*num_classes
  11.         labels_one_hot = np.zeros((num_labels, num_classes))
  12.         labels_one_hot.flat[index_offset + labels_dense.ravel()] = 1
  13.         return labels_one_hot


  14. def kfold(trainData,trainClass,nFold=10):
  15.         skf = KFold(len(trainData),nFold,shuffle=True,random_state=1234)
  16.         kDataTrain = []
  17.         kDataTrainC = []
  18.         kDataTest = []
  19.         kDataTestC = []

  20.         trainData = np.asarray(trainData)
  21.         trainClass = np.asarray(trainClass)
  22.         for train_index,test_index in skf:

  23.                 X_train,X_test = trainData[train_index],trainData[test_index]
  24.                 y_train,y_test = trainClass[train_index],trainClass[test_index]
  25.                 kDataTrain.append(X_train)
  26.                 kDataTrainC.append(y_train)
  27.                 kDataTest.append(X_test)
  28.                 kDataTestC.append(y_test)

  29.         return kDataTrain,kDataTrainC,kDataTest,kDataTestC

  30.        

  31. def load_data(fileName):
  32.         lables = []
  33.         feature = []

  34.         for line in open(fileName):
  35.                 if line.startswith("@") or line == "":
  36.                         continue
  37.                 listV = line.strip().split(",")
  38.                 feature.append(listV[0:-2])
  39.                 lables.append(int(listV[-1]))
  40.         return lables,feature
  41.         #return dense_to_one_hot(lables),np.asarray(feature)


  42. ty,tx = load_data("feature_91.arff")
  43. kDataTrain,kDataTrainC,kDataTest,kDataTestC = kfold(tx,ty)


  44. acc =[]
  45. for index in range(len(kDataTrain)):
  46.         print "cross validation:",index
  47.         ty,tx = kDataTrainC[index],kDataTrain[index]
  48.         testy,testx = kDataTestC[index],kDataTest[index]
  49.         ty = dense_to_one_hot(ty)
  50.         testy = dense_to_one_hot(testy)

  51.         learning_rate = 0.0005
  52.         training_epochs = 500
  53.         batch_size = 100
  54.        

  55.         n_hidden_1 = 300
  56.         n_hidden_2 = 300
  57.         n_input = tx.shape[1]
  58.         n_class = 2

  59.         x = tf.placeholder("float",[None,n_input])
  60.         y = tf.placeholder("float",[None,n_class])


  61.         def mlp(x,weights,biases):
  62.                 layer_1 = tf.add(tf.matmul(x,weights["h1"]),biases["b1"])
  63.                 layer_1 = tf.nn.relu(layer_1)

  64.                 layer_2 = tf.add(tf.matmul(layer_1, weights["h2"]), biases["b2"])
  65.                 layer_2 = tf.nn.relu(layer_2)

  66.                 out_layer = tf.matmul(layer_2,weights['out']) + biases['out']

  67.                 return out_layer


  68.         weights = {
  69.                
  70.                 'h1': tf.Variable(tf.random_normal([n_input,n_hidden_1])),
  71.                 'h2': tf.Variable(tf.random_normal([n_hidden_1,n_hidden_2])),
  72.                 'out': tf.Variable(tf.random_normal([n_hidden_2,n_class]))
  73.         }       

  74.         biases = {
  75.                
  76.                 'b1': tf.Variable(tf.random_normal([n_hidden_1])),
  77.                 'b2': tf.Variable(tf.random_normal([n_hidden_2])),
  78.                 'out':tf.Variable(tf.random_normal([n_class]))

  79.         }


  80.         pred = mlp(x,weights,biases)
  81.         cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred,y))
  82.         optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)

  83.         init = tf.initialize_all_variables()


  84.         with tf.Session() as sess:
  85.                 sess.run(init)
  86.                 for i in range(training_epochs):
  87.                         avg_cost = 0.
  88.                
  89.                         total_batch = int(tx.shape[0]/batch_size)
  90.                        
  91.                         for start,end in zip(range(0,len(tx),batch_size), range(batch_size,len(tx),batch_size)):
  92.                                 _,loss = sess.run([optimizer,cost],feed_dict={x:tx[start:end],y:ty[start:end]})
  93.                                 avg_cost += loss / total_batch
  94.                         #print i,"loss:",avg_cost

  95.                
  96.                 correct_prediction = tf.equal(tf.argmax(pred, 1), tf.argmax(testy, 1))
  97.                 accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
  98.                 result = accuracy.eval({x: testx, y: testy})
  99.                 acc.append(result)
  100.                 print "Accuracy:", result
  101. print "cross validation result"
  102. print "accuracy:",np.mean(acc)
复制代码




作者: zouquan    时间: 2016-7-27 13:15
这个是python代码?服务器里需要有什么包吧?(sklearn?)

另外,不需要自己设定层数,每层节点数?自己就能优化?

输出是啥?混淆矩阵?还是优化的神经网络结构?还是训练的model?
作者: guojiasheng    时间: 2016-7-28 13:15
zouquan 发表于 2016-7-27 13:15
这个是python代码?服务器里需要有什么包吧?(sklearn?)

另外,不需要自己设定层数,每层节点数?自 ...

1.需要numpy , sklearn ,tensorflow
2.我这个就三层,隐藏节点可以自己设置,其他就自己优化。
3.输出目前就是 roc值,其他的也都可以输出,混淆矩阵,网络 或者model。
作者: shixiang    时间: 2016-7-29 22:47
赞赞赞,mark学习
作者: maoyaozong    时间: 2016-8-4 11:39
{:141:}牛逼
作者: guojiasheng    时间: 2016-8-13 21:28
新增代码说明:
     (1)添加了交叉验证默认10fold
   (2)可处理多分类,转换为one-hot格式
     (3)可以输出acc
     (4)训练数据为arff格式
     (5)有两个隐层hidden_layer




欢迎光临 机器学习和生物信息学实验室联盟 (http://123.57.240.48/) Powered by Discuz! X3.2