亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

全部開發者教程

TensorFlow 入門教程

使用 TensorFlow 加載 CSV 數據

在機器學習相關的任務之中,我們最常用的數據集合的格式就是 CSV 格式了,因此我們不僅僅要對CSV格式文件有所了解,同時也要學會如何在 TensorFlo w之中使用 CSV 數據。

1. 認識 CSV 數據格式

CSV 文件,全稱叫做“逗號分隔值文件”,文件后綴為“.csv”,它是一種表格文件;與 Excel 等文件不同的是,它是以純文本表示的表格文件,而單元格之間用逗號分隔,因此被稱作逗號分隔值文件。

CSV 文件大體可以分為兩個部分:

  • 列名部分;
  • 數據部分。

比如以下CSV文件:

      a   b   c           # 列名部分
0    1   'a'   89         # 數據部分
1    3   'f'   88
2    8   'g'   99

該 CSV 文件一共包含三條數據,每條數據包括 a、b、c 三個字段,而其中 a 和 c 字段是整數,而 b 字段是字符串。

在實際的應用之中,一般的 CSV 數據會包含很多冗余的數據,我們會根據自己的需要來選擇我們所需要的數據字段,從而進行下一步的工作。

2. 如何在 TensorFlow 之中使用 CSV 數據

要在 TensorFlow 之中使用 CSV 數據進行訓練的話,我們大致需要經過三個步驟:

  • 獲取 CSV 數據文件;
  • 將 csv 文件數據構建為 TensorFlow 中的 dataset 格式;
  • 對數據集合進行進一步的處理以便符合模型輸入的需求。

2.1 獲取 CSV 數據文件

這一步中我們要首先獲取到數據文件,獲取的方式各不相同。

如果要使用 TensorFlow 內部的函數 API 進行網絡 CSV 數據文件的獲取,則我們可以通過以下 API 來實現數據集合的獲?。?/p>

file_path = tf.keras.utils.get_file("data.csv", DATA_URL)

其中第一個參數表示的是獲取的數據文件所保存的名字,而第二個參數 DATA_URL 表示的是網絡 CSV 文件的地址。同時該函數會將本地保存文件的目錄返回。

2.2 將 csv 文件數據構建為 TensorFlow 中的 tf.dataset 格式

在這一步之中,我們需要使用到 TensorFlow 中的 API 函數來將 csv 格式的數據轉化為 TensorFlow 可以理解的數據形式,具體來說,我們可以通過以下API實現:

dataset = tf.data.experimental.make_csv_dataset(
      file_path, batch_size, label_name, na_value, num_epochs
    )

該API之中的幾個參數需要我們有所了解:

  • file_path:CSV數據文件的路徑;
  • batch_size:我們要劃分數據集合的批次大小;
  • label_name:我們要進行預測的列;
  • na_value:該API會將文件中的空白值替換為 na_value ;
  • num_epochs:重復讀取該數據集合的數量,通常設置為 1,因為我們只需要讀取一遍數據集即可。

2.3 對數據集合進行進一步的處理以便符合模型輸入的需求

在該步驟之中,我們會對數據進行預處理,我們常見的預處理包括:

  • 過濾掉無用數據;
  • 指定數據的規模;
  • 指定該數據中的離散值與連續值;
  • 將離散值離散化。

這些數據的預處理方法我們會在后面的示例中實踐到。

3. CSV文件數據處理示例

在該示例之中,我們會采用公開數據集合:泰坦尼克生存數據集。該數據集合以CSV格式保存,同時也被 TensorFlow 納入為內置數據集,因此使用較為方便。

該數據集合中包含了每個乘客的基本信息,比如名字、性別、年齡等,同時也包含了改乘客是否生還。我們所訓練的模型就是要根據乘客的基本信息來判斷改乘客最終是否生還。

import tensorflow as tf

# 獲取數據集
train_path = tf.keras.utils.get_file("train.csv",
            "https://storage.googleapis.com/tf-datasets/titanic/train.csv")
valid_path = tf.keras.utils.get_file("eval.csv",
            "https://storage.googleapis.com/tf-datasets/titanic/eval.csv")

# 通過CSV文件構建數據集
train_data = tf.data.experimental.make_csv_dataset(train_path, batch_size=32,
        label_name='survived', na_value="?", num_epochs=1,
        ignore_errors=True )
valid_data = tf.data.experimental.make_csv_dataset(valid_path, batch_size=32,
        label_name='survived', na_value="?", num_epochs=1,
        ignore_errors=True )

# 定義離散列并進行處理
caetogries = {'sex': ['male', 'female'],
    'class' : ['First', 'Second', 'Third'],
    'deck' : ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'],
    'embark_town' : ['Cherbourg', 'Southhampton', 'Queenstown'],
    'alone' : ['y', 'n']}
categorical_columns = []
for feature, vocab in caetogries.items():
    cat_col = tf.feature_column.categorical_column_with_vocabulary_list(
        key=feature, vocabulary_list=vocab)
    categorical_columns.append(tf.feature_column.indicator_column(cat_col))

# 定義連續列
numerical_names = {'age',
    'n_siblings_spouses',
    'parch',
    'fare'}
numerical_columns = []
for feature in numerical_names:
    num_col = tf.feature_column.numeric_column(feature)
    numerical_columns.append(num_col)

# 定義模型
model = tf.keras.Sequential([
    tf.keras.layers.DenseFeatures(categorical_columns + numerical_columns),
    tf.keras.layers.Dense(256, activation='relu'),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dense(1, activation='sigmoid'),
])

model.compile(
    loss='binary_crossentropy',
    optimizer='adam',
    metrics=['accuracy'])

# 模型訓練
model.fit(train_data, epochs=20)

# 模型評估
model.evaluate(valid_data)

在該示例之中,我們首先獲取了 CSV 數據集合并且構建了 dataset。然后我們便進行了至關重要的一步,我們對于離散數據和連續數據進行了預處理。

對于離散數據,我們進行了以下幾步處理:

  • 定義離散列以及其可能的值(我們稱作字典);
  • 使用 tf.feature_column.categorical_column_with_vocabulary_list 這個函數 API 構建 TensorFlow 能夠識別的離散列;
  • 將所有的離散列合在一起以待后面使用。

對于連續數據,我們同樣進行了以下幾步處理:

  • 定義連續列;
  • 使用 tf.feature_column.numeric_column 這個函數 API 構建 TensorFlow 能夠識別的連續列;
  • 將所有的連續列合在一起以待后面使用。

最后在模型的第一層,我們添加了一個特征的預處理層,因為我們輸入的特征有的是連續值,有些是離散值,因此我們需要該層進行特征的預處理。

最后我們得到的輸出為:

Epoch 1/20
20/20 [==============================] - 0s 2ms/step - loss: 0.7948 - accuracy: 0.6459
......
Epoch 19/20
20/20 [==============================] - 0s 2ms/step - loss: 0.4619 - accuracy: 0.8022
Epoch 20/20
20/20 [==============================] - 0s 2ms/step - loss: 0.4661 - accuracy: 0.7990
9/9 [==============================] - 0s 2ms/step - loss: 0.4571 - accuracy: 0.7841
[0.45707935094833374, 0.7840909361839294]

于是我們可以看到,我們的模型最終在測試集合上達到了78.4%的準確率。

4. 小結

在該節課之中,我們學習了 CSV 的數據文件格式,同時了解了在 TensorFlow 之中如何處理該格式的數據。同時,我們也使用泰坦尼克數據集進行了實踐,最終達到了一個不錯的效果。

圖片描述