tf.data包含了對數(shù)據(jù)進行讀取温艇、操作秕铛、輸入模型的各種方法桃序。
理解流程
在鳶尾花案例中的train_input_fn喂食函數(shù)中,使用了tf.data對數(shù)據(jù)進行處理:
#針對訓練的喂食函數(shù)
def train_input_fn(features, labels, batch_size):
dataset = tf.data.Dataset.from_tensor_slices((dict(features), labels))
dataset = dataset.shuffle(1000).repeat().batch(batch_size) #每次隨機調整數(shù)據(jù)順序
return dataset
這個train_input_fn輸入函數(shù)后面被train使用:
#開始訓練模型条辟!
batch_size=100
classifier.train(input_fn=lambda:train_input_fn(train_x, train_y,batch_size),
steps=1000)
由此可見,train_input_fn可以把特征數(shù)據(jù)features(train_x)和標簽數(shù)據(jù)labels(train_y)聯(lián)合成一個dataset宏胯,以供分類器的訓練函數(shù)train使用羽嫡。
我們print(train_x):
SepalLength SepalWidth PetalLength PetalWidth
0 6.4 2.8 5.6 2.2
1 5.0 2.3 3.3 1.0
2 4.9 2.5 4.5 1.7
...
print(train_y),左側是序號肩袍,右側是花的類型0杭棵、1、2
0 2
1 1
2 2
...
下面分別介紹train_input_fn的三個參數(shù)
特征數(shù)據(jù)Features
- features:包含單個列表字段的字典dict氛赐,格式如{'feature_name':[]}魂爪;或者pandas.DataFrame對象。
pandas.DataFrame(data,index,columns,dtype,copy)語法
data:dict,numpy ndarray或DataFrame
index,columns:Index或類似數(shù)組
dtype:數(shù)值類型艰管,默認None會進行自動推斷
copy:布爾值滓侍,是否從輸入拷貝
#測試DataFrame
import pandas as pd
import numpy as np
d = {'col1': [1, 2], 'col2': [3, 4]}
df = pd.DataFrame(data=d, dtype=np.int8)
d2=np.random.randint(low=0, high=10, size=(5, 5))
df2 = pd.DataFrame(d2,columns=['a', 'b', 'c', 'd', 'e'])
print(df,'\n',d2,'\n',df2)
輸出可以看到DataFrame的基本樣式:
#df
col1 col2
0 1 3
1 2 4
#d2
[[2 4 6 4 2]
[9 4 5 0 3]
[1 5 1 4 5]
[9 3 8 0 1]
[1 3 0 5 0]]
#df2
a b c d e
0 2 4 6 4 2
1 9 4 5 0 3
2 1 5 1 4 5
3 9 3 8 0 1
4 1 3 0 5 0
實際上鳶尾花案例中的train_x就是pandas.read_csv生成的DataFrame對象
#載入訓練數(shù)據(jù)
train = pd.read_csv(train_path, names=FUTURES, header=0)
train_x, train_y = train, train.pop('Species')
標簽數(shù)據(jù)Labels
標簽數(shù)據(jù)應該是一個數(shù)組,依照特征數(shù)據(jù)的順序為每個樣本example做了標記牲芋。在鳶尾花案例中就是用0粗井、1、2標記了每朵鳶尾花的類型街图。
批次尺寸Batch_size
批次尺寸必須是一個整數(shù)浇衬,對模型訓練中的梯度下降運算效率有影響。建議不要超過樣本數(shù)量餐济,32耘擂,64,128...
切片Slices
在鳶尾花案例中使用了tf.data.Dataset.from_tensor_slices方法絮姆,它得到一個tf.data.Dataset對象:
def train_input_fn(features, labels, batch_size):
dataset = tf.data.Dataset.from_tensor_slices((dict(features), labels))
print(dataset)
...
打印出來得到一個TensorSliceDataset對象,里面包含了特征列名稱和數(shù)值類型:
<TensorSliceDataset
shapes: (
{
SepalLength: (), PetalWidth: (),
PetalLength: (), SepalWidth: ()},
()),
types: (
{
SepalLength: tf.float64, PetalWidth: tf.float64,
PetalLength: tf.float64, SepalWidth: tf.float64},
tf.int64)>
如果我們有個數(shù)據(jù)的形狀shape是(100,28,28),那么就可以把它切成100百個切片醉冤,每個切片是28x28的矩陣秩霍。
操作數(shù)據(jù)
Dataset將按照固定順序進行迭代,每次生成一個元素蚁阳。
然后我們用下面的方法對數(shù)據(jù)進行了處理:
dataset = dataset.shuffle(1000).repeat().batch(batch_size)
shuffle,隨機擾亂數(shù)據(jù)铃绒,1000表示使用的緩存數(shù)量,必須比樣本數(shù)量大才有意義螺捐。
repeat,重復颠悬,達到數(shù)據(jù)尾端然后再返回,如果要限定周期數(shù)量定血,可以添加count參數(shù)赔癌。
batch,批次澜沟,將樣本進行堆疊灾票,比如把100個(28,28)的二維數(shù)據(jù)可以堆疊成(100,28,28)的三維數(shù)據(jù)。
如下茫虽,batch之后print(dataset),輸出中出現(xiàn)了問號刊苍,這是由于反復分批次堆疊處理之后,最后一批的數(shù)量并不確定和之前每批次一樣多濒析。
<TensorSliceDataset
shapes: (
{
SepalLength: (?,), PetalWidth: (?,),
PetalLength: (?,), SepalWidth: (?,)},
(?,)),
types: (
{
SepalLength: tf.float64, PetalWidth: tf.float64,
PetalLength: tf.float64, SepalWidth: tf.float64},
tf.int64)>
張量Tensor
張量是TensorFlow 程序中的主要數(shù)據(jù)結構班缰。張量是 N 維(其中 N 可能非常大)數(shù)據(jù)結構,最常見的是標量悼枢、向量或矩陣埠忘。張量的元素可以包含整數(shù)值、浮點值或字符串值馒索。
Tensor包含兩個屬性:
- 數(shù)據(jù)類型(例如float32, int32, or string等)
- 數(shù)據(jù)形狀(定義數(shù)據(jù)的維數(shù)莹妒,特征數(shù)據(jù)中得到或運算時得到)
Tensor內的每個數(shù)據(jù)元素都具有相同的確定類型。
Tensor的維度又叫做等級rank:
Rank Math entity
0 標量Scalar (只有大小之分)
1 向量Vector (有大小和方向的區(qū)別)
2 矩陣Matrix (數(shù)字組成的表)
3 3-Tensor (數(shù)字立方體)
n n-Tensor (...)
#rank0
mammal = tf.Variable("Elephant", tf.string)
ignition = tf.Variable(451, tf.int16)
floating = tf.Variable(3.14159265359, tf.float64)
its_complicated = tf.Variable(12.3 - 4.85j, tf.complex64)
#rank 1
mystr = tf.Variable(["Hello"], tf.string)
cool_numbers = tf.Variable([3.14159, 2.71828], tf.float32)
first_primes = tf.Variable([2, 3, 5, 7, 11], tf.int32)
its_very_complicated = tf.Variable([12.3 - 4.85j, 7.5 - 6.23j], tf.complex64)
#更高rank
mymat = tf.Variable([[7],[11]], tf.int16)
myxor = tf.Variable([[False, True],[True, False]], tf.bool)
linear_squares = tf.Variable([[4], [9], [16], [25]], tf.int32)
squarish_squares = tf.Variable([ [4, 9], [16, 25] ], tf.int32)
mymatC = tf.Variable([[7],[11]], tf.int32)
表示多張圖片數(shù)據(jù)的rank4張量(數(shù)量X寬X高X顏色)
my_image = tf.zeros([10, 299, 299, 3]) # batch x height x width x color
可以用[n,m]方法獲得張量的特定切片
my_scalar = my_vector[2]
my_scalar = my_matrix[1, 2] #得到的是rank0標量
my_row_vector = my_matrix[2] #得到的是rank1向量
my_column_vector = my_matrix[:, 3] #得到一整列向量
張量的形狀shape是指張量每個元素的維數(shù)绰上。
探索人工智能的新邊界
如果您發(fā)現(xiàn)文章錯誤蜈块,請不吝留言指正鉴腻;
如果您覺得有用,請點喜歡百揭;
如果您覺得很有用爽哎,感謝轉發(fā)~
END