zoukankan      html  css  js  c++  java
  • keras做DNN

    输入的数据集是10000行,31645列,其中前31644是特征,最后一列是标签值。训练集和测试集格式是一样的。

    特征值都是0,1形式,表示有还是没有这个特征,标签值是0,1形式,2分类。

    import keras
    import tensorflow as tf
    from keras.models import Sequential
    from keras.layers import Dense, Activation
    from keras.models import Sequential
    from keras.layers import Dense, Dropout, Activation
    from keras.layers import Embedding
    from keras.layers import LSTM

    #*******************#########################**********************************************************
    #++++++++++++$$$$$***********************************************
    #*****************************************************************************************

    #带标签数据训练
    # Keras以Numpy数组作为输入数据和标签的数据类型。训练模型一般使用fit函数

    # for a single-input model with 2 classes (binary):
    #dese后面的数字表示输出的数据的维数,只有一个add,一个激活函数,认为网络只有一层,那么dense后面的数字必须是要输出的类别数,
    #如果中间有几层网络,那么每一个dense后面试输出为下一层的网络神经元个数,但是最后一个add的dense后面的数字必须是输出的类别数。

    model = Sequential()
    model.add(Dense(20, input_dim=31644, activation='sigmoid')) #把dense=1改为20
    model.add(Dropout(0.5))
    model.add(Dense(10,activation='relu')) #没有input 表示隐层神经元
    model.add(Dropout(0.5))
    model.add(Dense(1,activation='sigmoid')) #输出1维,表示是输出层神经元

    model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['accuracy'])

    # generate dummy data
    import numpy as np

    def meke_sample(p):
       data=[]
       label=[]
       f_tain=open("/Users/zhangb/Desktop/学习研究/测试样本/"+p,'r')
       for i in f_tain.readlines():
            lt=i.strip().split(',')
            data.append([int(x) for x in lt[0:-1]])
            label.append([int(lt[-1])])
        f_tain.close()
        data2=np.array(data)
        label2=np.array(label)
        return [data2,label2]

    train_sample=meke_sample("train")
    test_sample=meke_sample("test")

    train_data=train_sample[0]
    train_label=train_sample[1]

    test_data=test_sample[0]
    test_label=test_sample[1]


    #定义混淆矩阵,左边是预测值,上面是实际值 从左到右,从上到下 依次为a,b,c,d表示
    def confusion_mat(test_label,predicts):
          test_calss=[int(x) for x in (list(test_label))] #传入的是数组,转成数字列表
          pred_class=[int(x) for x in (list(predicts))]
          a,b,c,d=0,0,0,0
          for i in range(len(test_calss)):
              if pred_class[i]==1 and test_calss[i]==1 :
                     a +=1
              elif pred_class[i]==1 and test_calss[i]==0 :
                     b +=1
              elif pred_class[i]==0 and test_calss[i]==1 :
                      c +=1
              elif pred_class[i]==0 and test_calss[i]==0 :
                      d +=1
          precision_1=a/(a+b+0.0)
          precision_0=d/(c+d+0.0)
          recall_1=a/(a+c+0.0)
          recall_0=d/(d+b+0.0)
          precision=(a+d)/(a+b+c+d+0.0)
          f1=2*precision_1*recall_1/(precision_1+recall_1)
          f0=2*precision_0*recall_0/(precision_0+recall_0)
          return [[a,b],[c,d],[precision_1,precision_0,recall_1,recall_0,precision,f1,f0]]

    #
    #print label
    model.fit(train_data, train_label, nb_epoch=80, batch_size=32)
    score = model.evaluate(test_data, test_label, batch_size=32) #得到损失值和准确率
    print score
    pred=model.predict_classes(test_data) #得到预测值 是数组
    #print pred

    confusion=confusion_mat(test_label,pred)
    precision_1=confusion[2][0]
    precision_0=confusion[2][1]
    recall_1=confusion[2][2]
    recall_0=confusion[2][3]
    precision=confusion[2][4]
    f1=confusion[2][5]
    f0=confusion[2][6]
    print confusion[0]
    print confusion[1]
    print 'precision_1 :'+ str(precision_1) + ' precision_0:' +str(precision_0)
    print 'recall_1: '+str(recall_1)+' recall_0: '+ str(recall_0)
    print 'precision:' +str(precision)
    print 'f1: '+str(f1) + 'f0: '+str(f0)
    #print ret
    #print score

  • 相关阅读:
    第九章、查找
    opencv- python使用
    opencv初入
    初入
    第四章、数学问题
    数据结构
    分享一个SQLSERVER脚本
    详解SQL语句的集合运算
    数据库权限分配探讨
    数据库分区分表以及读写分离
  • 原文地址:https://www.cnblogs.com/zhangbojiangfeng/p/6362936.html
Copyright © 2011-2022 走看看