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)
輸出結果如下圖所示:
剩下的處理過程與之前的步驟一致,這裏不在贅述