日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

tensorflow教程 开始——数据集:快速了解 tf.data

發(fā)布時間:2025/3/20 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 tensorflow教程 开始——数据集:快速了解 tf.data 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

參考文章:數(shù)據(jù)集:快速了解

數(shù)據(jù)集:快速了解

tf.data

  • 從 numpy 數(shù)組讀取內(nèi)存數(shù)據(jù)。
  • 逐行讀取 csv 文件。

基本輸入

學習如何獲取數(shù)組的片段,是開始學習 tf.data 最簡單的方式。

Premade Estimators

def train_input_fn(features, labels, batch_size):"""一個用來訓練的輸入函數(shù)"""# 將輸入值轉(zhuǎn)化為數(shù)據(jù)集。dataset = tf.data.Dataset.from_tensor_slices((dict(features), labels))# 混排、重復、批處理樣本。dataset = dataset.shuffle(1000).repeat().batch(batch_size)# 返回數(shù)據(jù)集return dataset

下面我們來對這個函數(shù)做更仔細的分析。

參數(shù)

這個函數(shù)一共需要三個參數(shù)。如果一個參數(shù)的期望類型是 “array” (數(shù)組),那么它將可以接受幾乎所有可以用 numpy.array 來轉(zhuǎn)化為數(shù)組的值。我們可以看到只有一個例外:tuple,它對 Datasets 有特殊的含義。

  • features:一個形如 {‘feature_name’:array} 的數(shù)據(jù)字典(或者是 DataFrame),它包含了原始的輸入特征。
  • labels:一個包含每個樣本的 label 的數(shù)組。
  • batch_size:一個指示所需批量大小的整數(shù)。

在 premade_estimator.py 中,我們使用 iris_data.load_data() 函數(shù)來檢索虹膜數(shù)據(jù)。
你可以運行該函數(shù),并按如下方式解壓結(jié)果:

import iris_data# 獲取數(shù)據(jù) train, test = iris_data.load_data() features, labels = train

然后用像下面這樣的一行代碼,將數(shù)據(jù)傳遞給 input 函數(shù):

batch_size=100 iris_data.train_input_fn(features, labels, batch_size)

讓我們來具體看看 train_input_fn() 函數(shù)。

(數(shù)組)片段

TF Layers 教程:構(gòu)建卷積神經(jīng)網(wǎng)絡

返回這個 Dataset 的代碼如下所示:

train, test = tf.keras.datasets.mnist.load_data() mnist_x, mnist_y = trainmnist_ds = tf.data.Dataset.from_tensor_slices(mnist_x) print(mnist_ds)

張量

<TensorSliceDataset shapes: (28,28), types: tf.uint8>

上述的 Dataset 表示數(shù)組的簡單集合,但數(shù)據(jù)集比這更復雜。Dataset 可以透明地處理任何嵌套的字典或元組組合(或者 namedtuple)。

例如,將 irls 的 features 轉(zhuǎn)換為標準 python 字典之后,你可以將數(shù)組字典轉(zhuǎn)換為字典的 Dataset,如下所示:

dataset = tf.data.Dataset.from_tensor_slices(dict(features)) print(dataset) <TensorSliceDatasetshapes: {SepalLength: (), PetalWidth: (),PetalLength: (), SepalWidth: ()},types: {SepalLength: tf.float64, PetalWidth: tf.float64,PetalLength: tf.float64, SepalWidth: tf.float64} >

張量

iris 的第一行 train_input_fn 使用相同的功能,但是增加了一層結(jié)構(gòu)。它創(chuàng)建了一個包含 (features_dict, label) 數(shù)據(jù)對的數(shù)據(jù)集。

以下代碼表明,標簽是類型為 int64 的標量:

# 將輸入轉(zhuǎn)化為數(shù)據(jù)集。 dataset = tf.data.Dataset.from_tensor_slices((dict(features), labels)) print(dataset) <TensorSliceDatasetshapes: ({SepalLength: (), PetalWidth: (),PetalLength: (), SepalWidth: ()},()),types: ({SepalLength: tf.float64, PetalWidth: tf.float64,PetalLength: tf.float64, SepalWidth: tf.float64},tf.int64)>

操作

目前,Dataset 會按照固定順序遍歷數(shù)據(jù)一次,且一次只能生成一個元素。在可以用于訓練之前,它需要進一步的處理。幸運的是,tf.data.Dataset 類提供了方法來讓數(shù)據(jù)為訓練作出更好的準備。train_input_fn 的下一行代碼就利用了幾個這樣的方法:

# 樣本的混排、重復、批處理。 dataset = dataset.shuffle(1000).repeat().batch(batch_size)

tf.data.Dataset.shuffle

tf.data.Dataset.repeat

tf.data.Dataset.batch

print(mnist_ds.batch(100)) <BatchDatasetshapes: (?, 28, 28),types: tf.uint8>

注意,因為最后一個批次將會有比較少的元素,因此數(shù)據(jù)集的批量大小是不確定的。

在 train_input_fn 中,批處理之后,數(shù)據(jù)集 包含元素們的一維向量,這些一維向量的前面部分是:

print(dataset) <TensorSliceDatasetshapes: ({SepalLength: (?,), PetalWidth: (?,),PetalLength: (?,), SepalWidth: (?,)},(?,)),types: ({SepalLength: tf.float64, PetalWidth: tf.float64,PetalLength: tf.float64, SepalWidth: tf.float64},tf.int64)>

返回

此時,Dataset 包含 (features_dict, labels) 對。這是 train 和 evaluate 方法所期望的格式,因此 input_fn 將返回數(shù)據(jù)集。

在使用 predict 方法時,可以/應該省略 labels。

讀取 CSV 文件

tf.data

如下對 iris_data.maybe_download 函數(shù)的調(diào)用,將會在必要的時候下載數(shù)據(jù),并返回結(jié)果文件的路徑:

import iris_data train_path, test_path = iris_data.maybe_download()

iris_data.csv_input_fn 函數(shù)包括了一個用 Dataset 解析 csv 文件的替代方案。

讓我們來看看如何構(gòu)建一個兼容 Estimator 的、可以讀取本地文件的輸入函數(shù)。

建立 Dataset

tf.data.Dataset.skip

ds = tf.data.TextLineDataset(train_path).skip(1)

建立一個 csv 行解析器

我們從建立一個可以解析一行的函數(shù)開始。

tf.decode_csv

tf.decode_csv

# 描述文本列的元數(shù)據(jù) COLUMNS = ['SepalLength', 'SepalWidth','PetalLength', 'PetalWidth','label'] FIELD_DEFAULTS = [[0.0], [0.0], [0.0], [0.0], [0]] def _parse_line(line):# 將行解碼到 fields 中fields = tf.decode_csv(line, FIELD_DEFAULTS)# 將結(jié)果打包成字典features = dict(zip(COLUMNS,fields))# 將標簽從特征中分離label = features.pop('label')return features, label

解析多行

tf.data.Dataset.map

這個 map 方法接受一個 map_func 參數(shù),這個參數(shù)描述了 Dataset 中的每一個元素應該如何被轉(zhuǎn)化。

tf.data.Dataset.map

因此,為了在多行數(shù)據(jù)被從 csv 文件中讀取出來的時候解析它們,我們?yōu)?map 方法提供 _parse_line 函數(shù):

ds = ds.map(_parse_line) print(ds) <MapDataset shapes: ({SepalLength: (), PetalWidth: (), ...},()), types: ({SepalLength: tf.float32, PetalWidth: tf.float32, ...},tf.int32)>

現(xiàn)在,數(shù)據(jù)集中包含的是 (features, label) 數(shù)據(jù)對,而不是簡單的字符串標量了。

iris_data.csv_input_fn 函數(shù)的余下部分和 Basic input 中介紹的 iris_data.train_input_fn 函數(shù)相同。

實踐

這個函數(shù)可以作為 iris_data.train_input_fn 的替代。它可以像如下這樣,來給 estimator 提供數(shù)據(jù):

train_path, test_path = iris_data.maybe_download()# 所有的輸入都是數(shù)字 feature_columns = [tf.feature_column.numeric_column(name)for name in iris_data.CSV_COLUMN_NAMES[:-1]]# 構(gòu)建 estimator est = tf.estimator.LinearClassifier(feature_columns,n_classes=3) # 訓練 estimator batch_size = 100 est.train(steps=1000,input_fn=lambda : iris_data.csv_input_fn(train_path, batch_size))

Estimator 期望 input_fn 沒有任何參數(shù)。要解除這個限制,我們使用 lambda 來捕獲參數(shù)并提供預期的接口。

總結(jié)

為了從不同的數(shù)據(jù)源中便捷的讀取數(shù)據(jù),tf.data 模塊提供了類和函數(shù)的集合。除此之外,tf.data 有簡單并且強大的方法,來應用各種標準和自定義轉(zhuǎn)換。

現(xiàn)在你已經(jīng)基本了解了如何為 Estimator 高效的獲取數(shù)據(jù)。(作為擴展)接下來可以思考如下的文檔:

  • 創(chuàng)建定制化 Estimator
  • 底層 API 編程介紹
  • 數(shù)據(jù)導入

總結(jié)

以上是生活随笔為你收集整理的tensorflow教程 开始——数据集:快速了解 tf.data的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。