TF2初始教程
本节我们学习一些TensorFlow的基本使用方法,包括使用TensorFlow构建神经网络来对MNIST数据集进行划分以及学习一下数据的加载方法。
使用TensorFlow对MNIST数据集进行划分
首先,我们加载MNIST数据集,同时将数据映射到$ [0, 1] $上:
1 | import tensorflow as tf |
接下来将各层堆叠起来,来搭建tf.keras.Sequential模型:
1 | model = tf.keras.models.Sequential([ |
接下来我们将已经搭建的模型进行编译:
1 | model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', |
接下来,训练并且验证模型:
1 | model.fit(X_train, y_train, epochs=5) |
得到的结果如下:
1 | Train on 60000 samples |
现在,我们得到的照片分类器的准确率已经达到了98%。相较于之前我们实现的分类器,这个分类器的准确率更加优良。
对Fashion MNIST数据集划分
这一节我们会构建一个神经网络模型来区分关于衣物的图片,首先导入我们需要的库:
1 | import tensorflow as tf |
接下来导入Fashion MNIST数据集,这个数据集包含了共70000张10个类别的图片,每个图片用$ 28 \times 28 $的矩阵来表示。我们将60000张图片用作是训练,10000章图片用作是评估。代码如下:
1 | fashion_mnist = keras.datasets.fashion_mnist |
该数据集的类标对应关系如下:
| Label | Class |
|---|---|
| 0 | T-shirt/top |
| 1 | Trouser |
| 2 | Pullover |
| 3 | Dress |
| 4 | Coat |
| 5 | Sandal |
| 6 | Shirt |
| 7 | Sneaker |
| 8 | Bag |
| 9 | Ankle boot |
我们可以构建一个列表,来映射相应类标对应的类别:
1 | class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', |
下面我们看一下训练集中的第一张图片:
1 | plt.figure() |
得到的图像如下:

接下来我们需要进行特征缩放:
1 | train_images = train_images / 255.0 |
然后,看一下训练集中的前25张图片:
1 | # first 25 pic |
图像如下:

至此,我们来构建并且编译模型:
1 | # build model |
然后,训练这个模型:
1 | model.fit(train_images, train_labels, epochs=10) |
运行结果如下:
1 |
|
接下来,我们看一下模型在评估集上面的准确率:
1 | test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2) |
可以发现我们的模型在评估集上面的准确率比在训练集上面的准确率低,说明我们的模型过拟合了。
接下来,我们来进行预测:
1 | predictions = model.predict(test_images) |
可以发现一个预测的结果是一个包含10个数字的数组,数字代表着这张图片属于某个类标的可信度。同样可以使用argmax函数来得到最高可信度对应的类标:
1 | np.argmax(predictions[0]) |
同样的,当我们需要对单独一个未知的数据进行预测的时候,需要将其转换为$ (n,28,28) $的shape:
1 | img = test_images[1] |
接下里就可以进行预测了:
1 | predictions_single = model.predict(img) |
相应的类标如下:
1 | np.argmax(predictions_single[0]) |
加载CSV数据
本节学习如何将CSV文件加载到tf.data.Dataset中,将要使用的是泰坦尼克号乘客的数据,模型会根据乘客的年龄,性别,票务舱和是否独立旅行等特征来预测乘客生还的可能性。
首先,导入必要的库:
1 | import functools |
接下来,下载数据文件:
1 | TRAIN_DATA_URL = "https://storage.googleapis.com/tf-datasets/titanic/train.csv" |
同时设置一下numpy的输出设置,让他的输出精度是3位:
1 | np.set_printoptions(precision=3, suppress=True) |
首先,来看一下CSV文件的前面几行:
1 | !head {train_file_path} |
得到的输出如下:
1 | survived,sex,age,n_siblings_spouses,parch,fare,class,deck,embark_town,alone |
可以发现,CSV文件的每列都有一个列名。dataset构造函数会自动识别这些列名。如果某个CSV文件不包含列名,我们可以自己手动设置:
1 |
|
这个示例使用了所有的列,当然我们也可以只使用某些选中的列:
1 |
|
对于包含模型需要预测的值的列是需要显式指定的:
1 | LABEL_COLUMN = 'survived' |
现在从文件中读取CSV数据并创建dataset:
1 | def get_dataset(file_path): |
dataset中的每个条目都是一个批次,用一个元组表示(多个样本,多个标签)。样本中的数据组织形式是以列为主的张量,每个条目中包含的元素个数就是批次大小(本例中是12)。
我们首先获取第一个条目的数据:
1 | examples, labels = next(iter(raw_train_data)) # 第一个批次 |
输出:
1 | EXAMPLES: |
接下来,我们进行数据的预处理。
CSV数据中有些列是分类的列,也就是这些列中的值只能在有限的集合中取值。使用tf.feature_columnAPI创建一个tf.feture_column.indicator_column集合,集合中每个元素对应着一个分类的列。我们先将其转换:
1 | CATEGORIES = { |
得到的输出如下:
1 | [IndicatorColumn(categorical_column=VocabularyListCategoricalColumn(key='sex', vocabulary_list=('male', 'female'), dtype=tf.string, default_value=-1, num_oov_buckets=0)), |
这是后续构建模型时处理输入数据的一部分。
而对于连续数据,我们需要将其进行标准化,写一个函数标准化这些值,然后将这些值改造成2维德张量:
1 | def process_continuous_data(mean, data): |
现在创建一个数值列的集合。tf.feature_columns.numeric_column API 会使用 normalizer_fn 参数。在传参的时候使用 functools.partial,functools.partial 由使用每个列的均值进行标准化的函数构成。
1 | MEANS = { |
接下来创建预处理层:
1 | preprocessing_layer = tf.keras.layers.DenseFeatures(categorical_columns+numerical_columns) |
然后基于预处理层构建并编译模型:
1 | model = tf.keras.Sequential([ |
接下来,我们就可以实例化和训练模型:
1 | train_data = raw_train_data.shuffle(500) |
训练完成后,我们可以在测试集上检查准确性:
1 | test_loss, test_accuracy = model.evaluate(test_data) |
可以发现,该模型的预测准确率是81%。