本文章是对tensorflow的理解
tensorflow学习笔记(使用 tf.data 加载 NumPy 数据
本教程提供了一个将数据从 NumPy 数组加载到 tf.data.Dataset 中的示例。 此示例从 .npz( NumPy Zipped Data) 文件加载 MNIST 数据集。
导入模块
import numpy as np
import tensorflow as tf
import tensorflow_datasets as tfds
从 .npz 文件中加载
从网页DATA_URL下载文件,命名为mnist.npz并返回文件保存在计算机中的路径。
DATA_URL = 'https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz'
path = tf.keras.utils.get_file('mnist.npz', DATA_URL)
np.load()用于打开.npz文件。 打开mnist.npz文件,里面有4个数组文件。 查看数组文件下载后的名字,分别将其进行赋值
with np.load(path) as data:
train_examples = data['x_train']
train_labels = data['y_train']
test_examples = data['x_test']
test_labels = data['y_test']
使用 tf.data.Dataset 加载 NumPy 数组
已有一个示例数组和相应的标签数组,将两个数组作为元组传递给 tf.data.Dataset.from_tensor_slices 以创建 tf.data.Dataset。 该函数是dataset核心函数之一,它的作用是把给定的元组、列表和张量等数据进行特征切片。切片的范围是从最外层维度开始的。如果有多个特征进行组合,那么一次切片是把每个组合的最外维度的数据切开,分成一组一组的。
train_dataset = tf.data.Dataset.from_tensor_slices((train_examples, train_labels))
test_dataset = tf.data.Dataset.from_tensor_slices((test_examples, test_labels))
print(train_examples.shape)
print(train_labels.shape)
print(train_dataset)
从结果可以看出,该函数将数据分为了shape为((28,28),())的数据形式,即每一个图片(28x28)对应一个标签。
使用该数据集
打乱和批次化数据集
batch可以理解为计算一次需要输入的样本个数,当BATCH_SIZE过大时,计算量大,所占内存大;BATCH_SIZE过小时,很容易造成相邻两次计算梯度差距很大,甚至方向相反,容易不收敛。
BATCH_SIZE = 64
SHUFFLE_BUFFER_SIZE = 100
原始数据存在一定的分布规律,所以学习曲线不平滑,如果数据量够大的话,打乱后会呈现随机分布,学习后更能体现样本的共性。但是还是要保证特征数据和标签的对应关系
train_dataset = train_dataset.shuffle(SHUFFLE_BUFFER_SIZE).batch(BATCH_SIZE)
test_dataset = test_dataset.batch(BATCH_SIZE)
建立和训练模型
选择模型Sequential。 将tf.keras.layers.Flatte作为输入层,将28x28的数据压为一维数据。 添加隐藏层,确定神经元个数,选择激活函数’relu’。 添加输出层,确定神经元个数,选择激活函数’softmax’。(此案例是对图像进行分类,共10个大类,最后输出图片属于这一类的概率。故神经元个数为10,softmax广泛被使用于多分类场景中)
model = tf.keras.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])
对模型进行编译,选择损失函数(测量模型准确率),优化器(更好更新模型),指标(对模型的评估)。
model.compile(optimizer=tf.keras.optimizers.RMSprop(),
loss=tf.keras.losses.SparseCategoricalCrossentropy(),
metrics=[tf.keras.metrics.SparseCategoricalAccuracy()])
实例化,训练模型。将训练数据馈送给模型,迭代次数为10。 如果epoch数量太少,网络有可能发生欠拟合(即对于定型数据的学习不够充分);如果epoch数量太多,则有可能发生过拟合(即网络对定型数据中的“噪声”而非信号拟合)。
model.fit(train_dataset, epochs=10)
评估准确率。
model.evaluate(test_dataset)
|