【Tensorflow之数据处理】Tensorflow加载CSV数据,实现分类数据和连续数据自动输入到神经网络

文章修改至 https://tensorflow.google.cn/tutorials/load_data/csv

设置和获得数据

import需要的库:

  • functools:适合于高阶函数,作用于或返回其他函数的函数,一般来说,对于该模块,任何可调用对象都可以视为一个函数
  • numpy:矩阵处理
  • tensorflow_datasets:
  • pandas:数据分析
import functools
import numpy as np
import tensorflow as tf
import tensorflow_datasets as tfds
import pandas as pd

获得数据

# 指定数据的所在地
TRAIN_DATA_URL = "https://storage.googleapis.com/tf-datasets/titanic/train.csv"
TEST_DATA_URL = "https://storage.googleapis.com/tf-datasets/titanic/eval.csv"

# 从相应的所在地下载数据,并获得下载数据所在的路径
train_file_path = tf.keras.utils.get_file("train.csv", TRAIN_DATA_URL)
test_file_path = tf.keras.utils.get_file("eval.csv", TEST_DATA_URL)
# numpy输出时,只保留到元素的小数点后3位,并且当数值小于当前精度时,则丢弃小数点后超过精度的值
np.set_printoptions(precision=3, suppress=True)

加载数据

打印最后5行CSV文件信息,了解文件的格式,其中“survived”为标签列

raw_dataset = pd.read_csv(train_file_path,na_values="?")
dataset = raw_dataset.copy()
dataset.tail()

【Tensorflow之数据处理】Tensorflow加载CSV数据,实现分类数据和连续数据自动输入到神经网络_第1张图片正如你看到的那样,CSV 文件的每列都会有一个列名。dataset 的构造函数会自动识别这些列名。如果你使用的文件的第一行不包含列名,那么需要将列名通过字符串列表传给 make_csv_dataset 函数的 column_names 参数。

# 对于包含模型需要预测的值的列是你需要显式指定的。
LABEL_COLUMN = 'survived'
LABELS = [0, 1]

def get_dataset(file_path):
    dataset = tf.data.experimental.make_csv_dataset(
        file_path,
        batch_size=12,
        label_name=LABEL_COLUMN,
        na_value="?",
        num_epochs=1,
        ignore_errors=True
    )
    return dataset

raw_train_data = get_dataset(train_file_path)
raw_test_data = get_dataset(test_file_path)

tf.data.experimental.make_csv_dataset()中参数:

  • file_path:文件路径
  • batch_size:将数据按照batch_size大小来划分为一组
  • label_name:指定标签列的列名
  • na_value:将NA/NaN指定为额外的字符串
  • num_epochs:指定重复此数据集的次数的整型数。如果没有,则永久地遍历数据集。
  • ignore_errors:True则忽略错误,例如忽略空行,否则将报错

dataset的构成形式:

  • dataset 中的每个条目都是一个批次,用一个元组(多个样本数据的字典,多个标签)表示。
  • 其中样本数据字典将特征名(列名)映射到tensor向量(包含列中的数据),其中标签是一个tensor,包括上面指定的label_name列的值。
  • 样本中的数据组织形式是以列为主的张量(而不是以行为主的张量),每个tensor中包含的元素个数就是批次大小(这个示例中是 12)
# next():从迭代器中返回下一项
# iter():从对象中返回迭代器
examples, labels = next(iter(raw_test_data)) # 第一个批次
print("EXAMPLES: \n", examples["fare"], "\n")
print("LABELS: \n", labels)

【Tensorflow之数据处理】Tensorflow加载CSV数据,实现分类数据和连续数据自动输入到神经网络_第2张图片

数据预处理

分类数据

CSV 数据中的有些列是分类的列。也就是说,这些列只能在有限的集合中取值。

使用 tf.feature_column API 创建一个 tf.feature_column.indicator_column 集合,每个 tf.feature_column.indicator_column 对应一个分类的列。

CATEGORIES = {
    '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 CATEGORIES.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))
# 你刚才创建的内容
categorical_columns

【Tensorflow之数据处理】Tensorflow加载CSV数据,实现分类数据和连续数据自动输入到神经网络_第3张图片这将是后续构建模型时处理输入数据的一部分。

连续数据

连续数据需要标准化。

写一个函数标准化这些值,然后将这些值改造成 2 维的张量。

def process_continuous_data(mean, data):
    # 标准化数据
    data = tf.cast(data, tf.float32) * 1/(2*mean)
    return tf.reshape(data, [-1, 1])

现在创建一个数值列的集合。tf.feature_columns.numeric_column API 会使用 normalizer_fn 参数。在传参的时候使用 functools.partial,functools.partial 由使用每个列的均值进行标准化的函数构成。

MEANS = {
    'age' : 29.631308,
    'n_siblings_spouses' : 0.545455,
    'parch' : 0.379585,
    'fare' : 34.385399
}

numerical_columns = []

for feature in MEANS.keys():
    num_col = tf.feature_column.numeric_column(
        feature, 
        normalizer_fn=functools.partial(process_continuous_data, MEANS[feature]))
    numerical_columns.append(num_col)
# 你刚才创建的内容。
numerical_columns

【Tensorflow之数据处理】Tensorflow加载CSV数据,实现分类数据和连续数据自动输入到神经网络_第4张图片这里使用标准化的方法需要提前知道每列的均值。如果需要计算连续的数据流的标准化的值可以使用 TensorFlow Transform。

创建预处理层

将这两个特征列的集合相加,并且传给 tf.keras.layers.DenseFeatures 从而创建一个进行预处理的输入层。

preprocessing_layer = tf.keras.layers.DenseFeatures(
    categorical_columns+numerical_columns)

构建模型

从 preprocessing_layer 开始构建 tf.keras.Sequential。

model = tf.keras.Sequential([
    preprocessing_layer,
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(1, activation='sigmoid'),
])

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

训练、评估和预测

现在可以实例化和训练模型。

train_data = raw_train_data.shuffle(500)
test_data = raw_test_data
model.fit(train_data, epochs=20)

当模型训练完成的时候,你可以在测试集 test_data 上检查准确性

test_loss, test_accuracy = model.evaluate(test_data)

print('\n\nTest Loss {}, Test Accuracy {}'.format(test_loss, test_accuracy))

你可能感兴趣的:(tensorflow学习)