一些進入tf2核心功能與性質之前的前置知識和有些生疏的點,主要為pandas的資料操作及可視化,和Tensorflow 提供的Dataset API,
在建立模型之前,首先需要對資料進行分析,以往的作業就是忽略了資料分析與資料處理的重要性,從而限制了模型性能的上限,后期再發現導致前期的很多作業白做了,在該階段主要使用到的工具就是pandas,
pandas
Pandas的主要資料結構是Series(一維資料)和DataFrame(二維資料),缺失資料表示為NaN
資料結構
Series
用于表示Pandas中的一維資料,常見于DataFrame中的一列,Series是帶標簽的一維陣列,因此同時帶有陣列與字典的特性,可通過pd.Series生成一個Series,data接受字典,多維陣列,標量等作為引數:
s = pd.Series(data, index=index) # index自動生成數值索引,data為標量時index必須指定
Series操作與ndarray類似,由陣列性質支持大多數Numpy函式和索引,切片操作:
s[0] # 索引
s[:3] # 切片
s[s > 1] # 條件索引
s[[1,2,4]] # 批量索引
np.exp(s) # numpy函式計算
s + s # 矢量操作
Series還具有字典性質,類似于固定大小的字典,可進行相似操作:
s['a'] # 索引
s['b'] = 3 # 賦值
s.values # 提取數值,形式為ndarray
DataFrame
DataFrame是pandas中最常用的資料型別,表現為二維表格,可視作Series的容器,DataFrame與Numpy陣列的最大差別在于每一列的資料型別各不相同,由ndarray,series或series字典,結構多維陣列等生成:
s = pd.DataFrame(data, index=index, columns=columns) # index為行標簽,columns為列標簽
DataFrame類似于Series字典,以列屬性為鍵值,具有許多字典的性質:
df['one'] # 索引
df['three'] = df['one'] * df['two'] # 計算賦值
del df['two'] # 洗掉列
df.pop('two') # 彈出列
可分別用index和columns屬性訪問行,列標簽,或loc和iloc屬性選擇行:
df[col] # 選擇列
df.loc[label] # 用標簽選擇行,一般默認是自增數值標簽
df.iloc[index] # 用索引選擇行
df[a:b] # 行切片
df[boolen] # 布爾運算式選擇行
可通過查看DataFrame表格的一部分觀察資料格式等資訊:
df.head() # 前五行資料
df.tail() # 后五行資料
df.shape() # 查看行列維度
DataFrame常用的一系列函式:
df.set_index() # 設定某列為index,取代默認的index
df.dropna() # 洗掉缺失值
df.fillna() # 填充缺失值
df.isna() # 獲取缺失值布爾掩碼
df.diff() # 沿axis的差值,默認沿行
df.query() # 接受布爾運算式,用于過濾dataframe,可直接用字串參考列名
df.mean() # 統計均值,默認axis=0為列,axis=1則按行統計
df.apply() # 資料處理,接受函式對所有dataframe資料進行計算,原資料物件不改變
df.values_count() # 資料統計,多用于離散資料列
df.append() # 追加行
df.groupby() # 按條件分割資料,得到多組資料,可為每組單獨應用函式處理
可視化
主要方法是使用Series或DataFrame上的plot()函式,
# plot()函式主要引數
kind:
'line':折線圖
'bar':條形圖
'hist':直方圖
'box':箱形圖
'pie':餅圖
'area':面積圖
'scatter':散點圖
figsize:
元組,繪圖的大小
legend:
子圖圖例,對繪圖的說明
title:
繪圖示題
通過plot()函式定義如何繪圖后,還可以呼叫plt的各屬性進行進一步的定制:
plt.xlabel = ('x) # 定義橫坐標名稱
plt.ylabel = ('y') # 定義縱坐標名稱
plt.show() # 顯示繪圖
檔案讀寫
# csv檔案,文本資料
pd.read_csv()
pd.to_csv()
# json檔案,文本資料
pd.read_json()
pd.to_json()
# excel檔案,二進制資料
pd.read_excel()
pd.to_excel()
pandas 常用操作
pd.get_dummies() # pandas 實作one-hot encode 方法,對應列屬性組合為獨熱編碼形式
pd.concat() # 按axis拼接,axis=0為按行拼接,axis=1為按列拼接,只會拼接不同行/列
pd.merge() # 連接,默認內連接,還可選擇外連接,左連接,右連接;on引數指定連接鍵
pd.join() # 合并,按照索引進行連接
tf2資料準備
Tensorflow官方推薦的Dataset API,同時支持從硬碟和記憶體讀取資料和相應的處理,
生成
# 從記憶體讀取資料,data可為陣列,矩陣,字典等
dataset = tf.data.Dataset.from_tensor_slices(data)
# 從生成器讀取資料
dataset = tf.data.Dataset.from_generator(generator)
# 讀取TFRecord檔案,dataset中每一元素是一個TFExample
filenames = ["/var/data/file1.tfrecord", "/var/data/file2.tfrecord"]
dataset = tf.data.TFRecordDataset(filenames)
# 讀取文本檔案,輸入檔案串列,Dateset中每一元素對應檔案中的一行,可讀取csv檔案
filenames = ["/var/data/file1.txt", "/var/data/file2.txt"]
dataset = tf.data.TextLineDataset(filenames)
# list_files將路徑Dataset化,可利用路徑在map函式中讀取檔案
dataset = tf.data.Dataset.list_files(./data/cifar2/train/*/*.jpg).map(load_image)
常用操作
# map函式,將Dataset中每個元素視為輸入,函式回傳值作為新的Dateset
dataset = dataset.map(lamda x: x+1)
# batch函式,根據接收的整數值將多個元素組合成batch
dataset = dataset.batch(32)
# shuffle函式,打亂Dataset中資料,引數buffersize表示打亂時的范圍
dataset = dataset.shuffle(buffer_size=1000)
# repeat函式,重復序列多次
dataset = dataset.repeat(5)
# take函式,采樣整數個樣本
dataset.take(5)
# flat_map函式,將dataset中資料映射并壓為一維,順序不變
dataset = dataset.flat_map(map_func)
# filter函式,對Dataset中每一個元素執行過濾方法
dataset = dataset.filter(filter_func)
# zip函式,打包,通常用于打包樣本和對應標簽
dataset = tf.data.Dataset.zip((image_ds,label_ds))
# window函式,每若干元素打包成滑動視窗
dataset = dataset.window(5)
圖片資料
使用Tensorflow原生方法準備圖片資料:
dataset = tf.data.Dataset.list_files("./data/cifar2/train/*/*.jpg") \
.map(load_image, num_parallel_calls=tf.data.experimental.AUTOTUNE) \
.shuffle(buffer_size = 1000).batch(BATCH_SIZE) \
.prefetch(tf.data.experimental.AUTOTUNE)
# list_files()找到所有圖片檔案的路徑,*表示任意字串
# map()函式對其進行處理,并指定num_parallel_calls選項進行并行化預處理
# shuffle()函式每次選擇buffer_size個資料進行打亂,避免記憶體不夠
# batch()函式對資料分組
# prefetch()函式預存資料,提升性能
map函式接受的處理函式,可為lambda匿名函式,lambda函式形式為:
lambda a,b:expression(a,b) # 冒號前的a,b為引數,冒號后為函式的計算運算式
lambda函式回傳一個函式地址,是普通函式的單行簡寫形式
文本資料
文本資料的處理要更加復雜,包括去除停用詞,構建詞典,編碼轉換,序列填充,構建資料管道等等,這里使用到tf.data.Dataset搭配tf.keras.layers.experimental.preprocessing.TextVectorization預處理層
# 加載文本檔案并進行文本清洗,打亂,分批,得到dataset物件
dataset= tf.data.TextLineDataset(filenames = [train_data_path]) \
.map(split_line,num_parallel_calls = tf.data.experimental.AUTOTUNE) \
.shuffle(buffer_size = 1000).batch(BATCH_SIZE) \
.prefetch(tf.data.experimental.AUTOTUNE)
# 預處理層,用于構建詞典,編碼轉換和序列填充
vectorize_layer = TextVectorization(
standardize=clean_text, # 自定義文本清洗方法
split = 'whitespace',
max_tokens=MAX_WORDS-1, #有一個留給占位符
output_mode='int',
output_sequence_length=MAX_LEN)
# 得到純文本,并傳入預處理層中
ds_text = dataset.map(lambda text,label: text)
vectorize_layer.adapt(ds_text)
# 得到整齊的文本向量表示
ds = ds_train_raw.map(lambda text,label:(vectorize_layer(text),label)) \
.prefetch(tf.data.experimental.AUTOTUNE)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/208492.html
標籤:其他
