Tensorflow-datasets-數據集

tf.data包含了對數據進行讀取、操作、輸入模型的各種方法。


理解流程

鳶尾花案例中的train_input_fn喂食函數中,使用了tf.data對數據進行處理:

#針對訓練的喂食函數
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) #每次隨機調整數據順序
    return dataset

這個train_input_fn輸入函數后面被train使用:

#開始訓練模型!
batch_size=100
classifier.train(input_fn=lambda:train_input_fn(train_x, train_y,batch_size),
                 steps=1000)

由此可見,train_input_fn可以把特征數據features(train_x)和標簽數據labels(train_y)聯合成一個dataset,以供分類器的訓練函數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的三個參數


特征數據Features

  • features:包含單個列表字段的字典dict,格式如{'feature_name':[]};或者pandas.DataFrame對象。

pandas.DataFrame(data,index,columns,dtype,copy)語法
data:dict,numpy ndarray或DataFrame
index,columns:Index或類似數組
dtype:數值類型,默認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對象

#載入訓練數據
train = pd.read_csv(train_path, names=FUTURES, header=0)
train_x, train_y = train, train.pop('Species')

標簽數據Labels

標簽數據應該是一個數組,依照特征數據的順序為每個樣本example做了標記。在鳶尾花案例中就是用0、1、2標記了每朵鳶尾花的類型。


批次尺寸Batch_size

批次尺寸必須是一個整數,對模型訓練中的梯度下降運算效率有影響。建議不要超過樣本數量,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對象,里面包含了特征列名稱和數值類型:

<TensorSliceDataset
    shapes: (
        {
          SepalLength: (), PetalWidth: (),
          PetalLength: (), SepalWidth: ()},
        ()),
    types: (
        {
          SepalLength: tf.float64, PetalWidth: tf.float64,
          PetalLength: tf.float64, SepalWidth: tf.float64},
        tf.int64)>

如果我們有個數據的形狀shape是(100,28,28),那么就可以把它切成100百個切片,每個切片是28x28的矩陣。


操作數據

Dataset將按照固定順序進行迭代,每次生成一個元素。
然后我們用下面的方法對數據進行了處理:

    dataset = dataset.shuffle(1000).repeat().batch(batch_size) 

shuffle,隨機擾亂數據,1000表示使用的緩存數量,必須比樣本數量大才有意義。
repeat,重復,達到數據尾端然后再返回,如果要限定周期數量,可以添加count參數。
batch,批次,將樣本進行堆疊,比如把100個(28,28)的二維數據可以堆疊成(100,28,28)的三維數據。
如下,batch之后print(dataset),輸出中出現了問號,這是由于反復分批次堆疊處理之后,最后一批的數量并不確定和之前每批次一樣多。

<TensorSliceDataset
    shapes: (
        {
          SepalLength: (?,), PetalWidth: (?,),
          PetalLength: (?,), SepalWidth: (?,)},
        (?,)),

    types: (
        {
          SepalLength: tf.float64, PetalWidth: tf.float64,
          PetalLength: tf.float64, SepalWidth: tf.float64},
        tf.int64)>

張量Tensor

張量是TensorFlow 程序中的主要數據結構。張量是 N 維(其中 N 可能非常大)數據結構,最常見的是標量、向量或矩陣。張量的元素可以包含整數值、浮點值或字符串值。

Tensor包含兩個屬性:

  • 數據類型(例如float32, int32, or string等)
  • 數據形狀(定義數據的維數,特征數據中得到或運算時得到)

Tensor內的每個數據元素都具有相同的確定類型。
Tensor的維度又叫做等級rank:

Rank Math entity
0 標量Scalar (只有大小之分)
1 向量Vector (有大小和方向的區別)
2 矩陣Matrix (數字組成的表)
3 3-Tensor (數字立方體)
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)

表示多張圖片數據的rank4張量(數量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是指張量每個元素的維數。


張量的形狀、層級、維度

探索人工智能的新邊界

如果您發現文章錯誤,請不吝留言指正;
如果您覺得有用,請點喜歡;
如果您覺得很有用,感謝轉發~


END

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容