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
fillna(df.mean())
資料中有空值,採用每一行的平均值進行填充。- 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的卷積神經網路語句分類的模型。 本文提出的模型在一系列文字分類任務(如情感分析