第四章:新版tensorflow入門,處理數據集

1、概述

tensorflow對於數據的格式有着特殊的要求,另外所需要的數據量也是巨大,同樣會有批量梯度下降這樣的需求。爲了保證數據的隨機性,我們有時候還需要隨機化數據分佈。這樣數據預處理就變得十分的關鍵。tensorflow提供了一系列的方法來幫助我們完成這樣的工作。

2、數據源

在真實的人工智能場景中,數據源主要有兩種:

  • 從 Numpy 數組中讀取內存中的數據。
  • 從 csv 文件中讀取行。

在數據量在可接受的範圍內,可以使用第一種方法。如果數據量十分龐大,將其加載到內存當中變得非常困難,此時可以選擇從csv文件中逐行的讀取數據。

3、從內存中讀取數據

可以採用numpy或者pandas方式將數據度渠道內存到內存當中,進行後續操作。在第一章中使用pandas的read_csv方法讀取數據。請參照下面代碼

import pandas as pd
import tensorflow as tf
CSV_COLUMN_NAMES = ['SepalLength','SepalWidth','PetalLength', 'PetalWidth', 'Species']
data_train=pd.read_csv('iris_test.csv',names=CSV_COLUMN_NAMES,header=0)
data_test=pd.read_csv('iris_training.csv',names=CSV_COLUMN_NAMES,header=0)
data_train.head()

使用head()方法查看數據情況


將特徵(feature)與標記(label)分開

train_x, train_y = data_train, data_train.pop('Species')
test_x, test_y = data_test, data_test.pop('Species')
train_x.head()

特徵列效果如下:


標記列效果如下:


  • 切片

數據讀入之後的第一個動作就是要切片,tf.data.Dataset.from_tensor_slices 函數接受一個數組並返回表示該數組切片的 tf.data.Dataset

請參照下面代碼:

tf.data.Dataset.from_tensor_slices(dict(train_x))

輸出效果如下:


同時可以加入特徵和標記的數據對,請參照下面代碼:

tf.data.Dataset.from_tensor_slices((dict(train_x),train_y))

輸出效果如下:


  • 操作

目前的數據只會按照數據的原始順序每次生成一條數據,所以可以採用,shuffle 打亂數據,使用repeat 重複生成數據,採用batch生成小批量數據 請參照一下代碼:

fetch_data = tf.data.Dataset.from_tensor_slices((dict(train_x),train_y))
print(fetch_data)
fetch_data = fetch_data.shuffle(1000).repeat().batch(100)
print(fetch_data)
輸出效果如下圖所示:

4、從csv文件中逐行讀取數據

  • 構建 Dataset

我們先構建一個 TextLineDataset 對象來實現一次讀取文件中的一行數據。然後,我們調用 skip方法來跳過文件的第一行,如果此行包含標題,而非樣本,具體的操作視具體情況而定。

請參照如下代碼:

ds = tf.data.TextLineDataset('iris_training.csv').skip(1)

ds是以文本流的形式逐行讀取數據,下面編寫一個函數來解析每一行

ds = tf.data.TextLineDataset('iris_training.csv').skip(1)
# 指定csv文件的列名
COLUMNS = ['SepalLength', 'SepalWidth',
           'PetalLength', 'PetalWidth',
           'label']
# 指定csv各個字段的默認值
FIELD_DEFAULTS = [[0.0], [0.0], [0.0], [0.0], [0]]
def _parse_line(line):
    # 將每一行解析到對應的字段當中
    fields = tf.decode_csv(line, FIELD_DEFAULTS)
    # 將字段值與列名組成一個字典
    features = dict(zip(COLUMNS,fields))
    #將特徵值與標記列分開
    label = features.pop('label')
    return features, label
ds = ds.map(_parse_line)
print(ds)

輸出結果如下圖所示:


剩下的處理過程與之前的步驟一致,這裏不在贅述


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章