1. 程式人生 > >TF-day6 CNN簡單分類

TF-day6 CNN簡單分類

主要內容:

  • 何為CNN
  • code

二、程式碼及解析

import tensorflow as tf
import pandas as pd
import numpy as np
from sklearn.cross_validation import train_test_split
from imblearn.over_sampling import SMOTE
from sklearn.metrics import classification_report

1. 獲取資料

##獲取資料
def get_data(argv=None):
    df = pd.read_excel('/home/xp/下載/jxdc/專案評分表last.xls')
    df_feature = df.iloc[:, 2:].fillna(df.mean())
    # print(df_feature.shape)  ##(449,70)
    df_label = df.iloc[:, 1]

    ##樣本均衡
    smote = SMOTE('auto')
    x_sample, y_sample = smote.fit_sample(df_feature, df_label)
    # print(x_sample.shape)    ##(690,70)
    # print(y_sample.shape)    ##(690,)

    ##轉換為one-hot向量
    X = x_sample  #均衡後的輸入
    # X = df_feature  #不均衡的輸入
    Y = []
    for i in y_sample:
    # for i in df_label:
        if i == 'A':
            Y.append([1, 0, 0, 0])
        elif i == 'B':
            Y.append([0, 1, 0, 0])
        elif i == 'C':
            Y.append([0, 0, 1, 0])
        else:
            Y.append([0, 0, 0, 1])
    # train(X,Y)
    return X,Y
  1. fillna(df.mean())資料中有空值,採用每一行的平均值進行填充。
  2. one-hot向量:
    為什麼要將樣本標籤轉換為one-hot向量呢,因為在訓練神經網路就是讓損失函式變小,其中交叉熵tf.nn.softmax_cross_entropy_with_logits的輸入是兩個概率分佈,one-hot向量可以看作是一個概率分佈。

2.前向傳播

##前向傳播
INPUT_NODE = 70
OUTPUT_NODE = 4

IMAGE_LONGTH = 70
IMAGE_WIDTH = 1
NUM_CHANNELS = 1
NUM_LABELS = 4

##第一層卷積層的尺寸和深度
CONV1_DEEP = 16
CONV1_SIZE_L = 4
CONV1_SIZE_W = 1

##第二層卷積層的尺寸和深度
CONV2_DEEP = 32
CONV2_SIZE_L = 2
CONV2_SIZE_W = 1

##全連線層的節點個數
FC_SIZE = 128
def inference(input_tensor,train,regularizer):
    ###通過使用不同的名稱空間來隔離不同層的變數。不需要擔心重名的問題
    ##第一層:卷積層1
    with tf.variable_scope("layer1-conv1"):
        conv1_weights = tf.get_variable("weight",[CONV1_SIZE_L,CONV1_SIZE_W,NUM_CHANNELS,CONV1_DEEP],initializer=tf.truncated_normal_initializer(stddev=0.1))
        conv1_biases = tf.get_variable("bias",[CONV1_DEEP],initializer=tf.constant_initializer(0.1))
    conv1 = tf.nn.conv2d(input_tensor,conv1_weights,strides=[1,2,1,1],padding='SAME')
    relu1 = tf.nn.relu(tf.nn.bias_add(conv1,conv1_biases))

卷積層:對應節點的加權和
1. 採用tf.variable_scope()進行變數管理,因為神經網路變數太多了,這樣就不用擔心命名很容易重複了。
2. 過濾器:conv1_weight,Tensor(“layer1-conv1/weight:0”, shape=(4, 1, 1, 16), dtype=float32_ref)
name:’layer1-conv1/weight:0’
shape是四維,第一、二維是過濾器尺寸,第三維表示當前層的深度,第四維表示過濾器的深度。
3. strides: 不同維度上的步長,第一維和最後一維只能是1,因為卷積層的步長只對長和寬有效。
4. padding:’SAME’表示全新增0填充,’VALID’表示不

    ##第二層:池化層
    with tf.name_scope("layer2-pool1"):
        pool1 = tf.nn.max_pool(relu1,ksize=[1,3,1,1],strides=[1,2,1,1],padding="SAME")
        # pool1 = tf.nn.avg_pool(relu1,ksize=[1,3,1,1],strides=[1,2,1,1],padding="SAME")

池化層:縮小矩陣的尺寸,從而減小最後全連結層的引數/既可以加快計算速度,也有防止過擬合的作用。
1. 最大池化層:max pooling 、平均池化層:average pooling
2. ksize:第一維和最後一維只能是1,這意味著池化層的過濾器是不可以跨樣本和跨節點深度的。

    ##第三層:卷積層
    with tf.variable_scope("layer3-conv2"):
        conv2_weights = tf.get_variable("weight",[CONV2_SIZE_L,CONV2_SIZE_W,CONV1_DEEP,CONV2_DEEP],initializer=tf.truncated_normal_initializer(stddev=0.1))
        conv2_biases = tf.get_variable("bias",[CONV2_DEEP],initializer=tf.constant_initializer(0.1))
    conv2 = tf.nn.conv2d(pool1,conv2_weights,strides=[1,2,1,1],padding='SAME')
    relu2 = tf.nn.relu(tf.nn.bias_add(conv2,conv2_biases))

    ##第四層:池化層
    with tf.name_scope('layer4-pool2'):
        pool2 = tf.nn.max_pool(relu2,ksize=[1,2,1,1],strides=[1,3,1,1],padding='SAME')
    ##第五層:全連線層
    pool_shape = pool2.get_shape().as_list()
    ##計算講矩陣拉直之後的向量長度,pool_shape[0]為batch中的資料個數
    nodes = pool_shape[1]*pool_shape[2]*pool_shape[3]    # nodes:96
    reshaped = tf.reshape(pool2,[-1,nodes])   ###BATCH_SIZE必須是已知的值???

    with tf.variable_scope('layers-fc1'):
        fc1_weights = tf.get_variable("weight",[nodes,FC_SIZE],initializer=tf.truncated_normal_initializer(stddev=0.1))
        if regularizer != None:                
            tf.add_to_collection("losses",regularizer(fc1_weights))
        fc1_biases = tf.get_variable("bias",[FC_SIZE],initializer=tf.constant_initializer(0.1))

        fc1 = tf.nn.relu(tf.matmul(reshaped,fc1_weights) + fc1_biases)
        if train:
            fc1 = tf.nn.dropout(fc1,0.5)  
    ##第六層:softmax層
    with tf.variable_scope("layer6-fc2"):
        fc2_weights = tf.get_variable('weight',[FC_SIZE,NUM_LABELS],initializer=tf.truncated_normal_initializer(stddev=0.1))
        if regularizer != None:
            tf.add_to_collection('losses',regularizer(fc2_weights))
        fc2_biases = tf.get_variable('bias',[NUM_LABELS],initializer=tf.constant_initializer(0.1))
        logit = tf.matmul(fc1,fc2_weights) +fc2_biases
    return logit

softmax層:
1. 這一層與全連線層全不過少了dropout

3. 訓練資料

BATCH_SIZE = 100
LEARNING_RATE_BASE = 0.8
LEARNING_RATE_DECAY = 0.96
REGULARAZTION_RATE = 0.001
TRAINING_STEPS = 4000
MOVING_AVERAGE_DECAY = 0.99

##模型儲存路徑和檔名
MODEL_SAVE_PATH = "/home/panxie/PycharmProjects/ML/jxdc/code/cnnclassify/model.ckpt"
# MODEL_NAME = "model.ckpt"

##訓練神經網路
def train(X,Y):
    x = tf.placeholder(tf.float32, [None,IMAGE_LONGTH, IMAGE_WIDTH,NUM_CHANNELS],name='x_input')
    y_ = tf.placeholder(tf.float32, [None, OUTPUT_NODE], name='y-input')

    regularizer = tf.contrib.layers.l2_regularizer(REGULARAZTION_RATE)

    y = inference(x,0.5,regularizer)
    ##這裡y*1,方便給y命名
    b = tf.constant(value=1, dtype=tf.float32)
    y = tf.multiply(y, b, name='y')

    ##定義訓練輪數,並指定為不可訓練的引數
    global_step = tf.Variable(0, trainable=False)
    variable_average = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY, global_step)
    variable_average_op = variable_average.apply(tf.trainable_variables())

    ##交叉熵和正則化項
    cross_entroy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=y, labels=y_))
    loss = cross_entroy + tf.add_n(tf.get_collection('losses'))

    ##學習率的設定,指數衰減法
    learning_rate = 0.01
    # learning_rate = tf.train.exponential_decay(learning_rate,global_step=global_step,decay_steps=100,decay_rate=0.9,staircase=True)
    # learning_rate = tf.train.exponential_decay(learning_rate,global_step=global_step,decay_steps=1,decay_rate=0.96,staircase=False)

    ###優化演算法
    train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss, global_step=global_step)

    ###每過一邊資料要更新神經網路的引數,又要更新每一個引數的滑動平均值。
    with tf.control_dependencies([train_step,variable_average_op]):
        train_op = tf.no_op(name='train')

    ##準確率計算
    correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))  ###argmax返回的是索引
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

    ##初始化Tensorflow持久化類
    saver = tf.train.Saver()
    # saver.export_meta_graph("/home/pan-xie/PycharmProjects/ML/jxdc/code/cnnclassify/model.deda.json",as_text=True)
    with tf.Session() as sess:
        tf.global_variables_initializer().run()

        for i in range(TRAINING_STEPS):

            trainX, validationX, trainY, validationY = train_test_split(X, Y, test_size=0.25, random_state=0)

            data_size = len(trainX)
            start = (i * BATCH_SIZE) % data_size
            end = min(start + BATCH_SIZE,data_size)
            # if (end < data_size):
            #     xs = trainX[start:end]
            #     ys = trainY[start:end]
            # else:
            #     xs = [trainX.tolist()[start:end].append(j) for j in trainX[0:(end-data_size)]]
            #     ys = [trainY[start:end].append(j) for j in trainY[0:(end-data_size)]]

            ###訓練資料
            xs_train_reshape = np.reshape(trainX[start:end], (-1, IMAGE_LONGTH, IMAGE_WIDTH, NUM_CHANNELS))
            train_feed = {x:xs_train_reshape,y_:trainY[start:end]}

            ##驗證資料集
            xs_valid_reshape = np.reshape(validationX, (-1, IMAGE_LONGTH, IMAGE_WIDTH, NUM_CHANNELS))
            validiation_feed = {x: xs_valid_reshape, y_: validationY}

            _,loss_value,step,accuracy_train = sess.run([train_op,loss,global_step,accuracy],feed_dict=train_feed)

            loss_valid,acc_valid = sess.run([loss,accuracy],feed_dict=validiation_feed)

            # if i %500 == 0:
            #     print("After %d training steps,""loss and accuracy on training is %g and %g,""loss and accuracy on validiation is %g and %g"%(step,loss_value,accuracy_train,loss_valid,acc_valid))
                # saver.save(sess,os.path.join(MODEL_SAVE_PATH,MODEL_NAME),global_step=global_step)

        trainX, testX, trainY, testY = train_test_split(X, Y, test_size=0.25, random_state=0)
        xs_test_reshape = np.reshape(testX, (-1, IMAGE_LONGTH, IMAGE_WIDTH, NUM_CHANNELS))
        test_feed = {x: xs_test_reshape, y_: testY}

        # 使用測試資料集,檢視分類指標
        target_names = ['A', 'B', 'C', 'D']
        rating_test_ = sess.run(tf.argmax(y_, 1), feed_dict=test_feed)
        test_preds1 = sess.run(tf.argmax(y, 1), feed_dict=test_feed)
        print(classification_report(rating_test_, test_preds1, target_names=target_names))

        saver.save(sess, MODEL_SAVE_PATH)
        # saver.save(sess,os.path.join(MODEL_SAVE_PATH,MODEL_NAME),global_step=global_step)
        sess.close()
         precision    recall  f1-score   support

      A       0.97      0.97      0.97        70
      B       0.73      0.62      0.67        13
      C       0.62      0.45      0.53        22
      D       0.86      0.96      0.90        68

avg / total       0.86      0.87      0.86       173

以A為例:
其中precision表示精確率,測試集中被檢索到的資料中分類正確的樣本數/測試集中被檢索總樣本數
recall表示召回率,測試集中被檢索到的資料中分類正確的樣本數/測試集所有的A類
F1-score值就是精確值和召回率的調和均值,也就是2/F1=1/P+1/R

if __name__=='__main__':
    X,Y = get_data()
    train(X,Y)
    # tf.app.run()

相關推薦

TF-day6 CNN簡單分類

主要內容: 何為CNN code 二、程式碼及解析 import tensorflow as tf import pandas as pd import numpy as np from sklearn.cross_validation imp

深度學習入門專案:用keras構建CNN或LSTM對minist資料集做簡單分類任務

深度學習入門專案:用keras構建CNN或LSTM或RNN對Minist資料集做簡單分類任務 參考keras中文文件 ——keras: 是一個高階神經網路庫,用 Python 語言寫成,可以執行在 TensorFlow 或者 Theano 之上(即以此為後端)。

機器學習入門之python實現圖片簡單分類

numbers org 路徑 圖片分類 jpg animal 入門 res windows 小任務:實現圖片分類 1.圖片素材 python批量壓縮jpg圖片: PIL庫 resize http://blog.csdn.net/u012234115/article/

電腦鼠標的簡單分類

滾輪 哈哈哈 信號 電源 需要 cal 市場 脈沖 ica   之所以要查電腦鼠標分類,是因為鼠標有點小毛病,所以要對癥下藥。。。。哈哈哈哈   機械鼠標(mechanical mouse)又名滾輪鼠標,主要由滾球、輥柱和光柵信號傳感器組成。鼠標通過 ps/2 口或串口與

神經網路實現Mnist資料集簡單分類

本文針對mnist手寫數字集,搭建了四層簡單的神經網路進行圖片的分類,詳細心得記錄下來分享 我是採用的TensorFlow框架進行的訓練 import tensorflow as tf from tensorflow.examples.tutorials.mnist import in

web API種類 常見形式 Web API 的簡單分類總結

常見形式 Web API 的簡單分類總結     一、請求--響應API。 請求--響應類的API的典型做法是,通過基於HTTP的Web伺服器暴露一個/套介面。API定義一些端點,客戶端傳送資料的請求到這些端點,Web伺服器處理這些請求,然後返回響應。響

keras+CNN影象分類

我們的深度學習資料集包括1,191張口袋妖怪影象,(存在於口袋妖怪世界中的動物般的生物,流行的電視節目,視訊遊戲和交易卡系列)。 我們的目標是使用Keras和深度學習訓練卷積神經網路,以識別和分類這些神奇寶貝。 我們將認識到的口袋妖怪包括: Bulbasaur(234影象) Charma

基於Tensorflow的CNN簡單實現

一、概要 基於Tensorflow 1.0+版本實現,利用mnist資料集訓練CNN,達到了99.6%的準確率。 二、CNN結構 1.兩個卷積層、兩個池化層、一個全連線層、一個Dropout層以及一個Softmax層。 2.原始資料為28*28的大小、單通道的圖片。 3.

TensorFlow之tf.keras的文字分類

這段時間在學習TensorFlow,這些都是一些官網上的例子,在這裡和大家分享記錄一下。 此教程使用評論文字將電影評論分類為正面或負面。這是二元或兩類分類的一個例子,這是一種重要且廣泛適用的機器學習問題。 我們將使用包含來自Internet電影資料庫的50

tf.assign()函式簡單解釋

例項程式碼 import tensorflow as tf import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' state = tf.Variabl

常見形式 Web API 的簡單分類總結

一、請求--響應API。 請求--響應類的API的典型做法是,通過基於HTTP的Web伺服器暴露一個/套介面。API定義一些端點,客戶端傳送資料的請求到這些端點,Web伺服器處理這些請求,然後返回響應。響應的格式通常是JSON或XML。 在這種型別的Web API裡,比較流行的是這三種:REST,RP

利用softmax函式對mnist資料集簡單分類

mnist資料集的特點 每一張圖片包含28**28個畫素,我們把這一個陣列展開成一個向量,長度是28*28=784。因此在 MNIST訓練資料集中mnist.train.images 是一個形狀為 [60000, 784] 的張量,第一個維度數字用 來索引圖片

Keras實現CNN文字分類

本文以CAIL司法挑戰賽的資料為例,敘述利用Keras框架進行文字分類的一般流程及基本的深度學習模型。 步驟 1:文字的預處理,分詞->去除停用詞->統計選擇top n的詞做為特徵詞 步驟 2:為每個特徵詞生成I

Keras基於TensorFlow實現的簡單分類問題

神經網路是可以用來模擬分類問題。 首先先說一下什麼是分類問題,分類問題是用於將事物打上一個標籤,通常結果為離散值。例如判斷一個學生是好學生還是壞學生,其結果是離散的,即好學生、壞學生。而回歸問題是給出一個值去逼近正確值。但是分類通常是建立在迴歸之上,例如上面的

CNN文字分類 論文收集

Sequential Short-Text Classification with Recurrent and Convolutional Neural Networks Recurrent Convolutional Neural Networks for

CNN影象分類-經典網路摘要

一、LeNet-5-------1998年  由LeCun在1998年提出,用於手寫數字分類 (1)提出了權重共享、特徵圖的概念 (2)啟用函式:雙曲正切      (3)網路權重初始化:均勻分佈 (4)訓練:BP+SGD 二、AlexNet------2

tf-idf + svm 文字分類

01分類 import pandas as pd from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.linear_model import LogisticRegression

超乾貨|使用Keras和CNN構建分類器(內含程式碼和講解)

摘要: 為了讓文章不那麼枯燥,我構建了一個精靈圖鑑資料集(Pokedex)這都是一些受歡迎的精靈圖。我們在已經準備好的影象資料集上,使用Keras庫訓練一個卷積神經網路(CNN)。為了讓文章不那麼枯燥,

Text-CNN 文字分類

1.簡介 TextCNN 是利用卷積神經網路對文字進行分類的演算法,由 Yoon Kim 在 “Convolutional Neural Networks for Sentence Classification” 一文 (見參考[1]) 中提出. 是2014年

Tensorflow實現的CNN文字分類

翻譯自部落格:IMPLEMENTING A CNN FOR TEXT CLASSIFICATION IN TENSORFLOW 在這篇文章中,我們將實現一個類似於Kim Yoon的卷積神經網路語句分類的模型。 本文提出的模型在一系列文字分類任務(如情感分析