tf.data数据集
Contents
tf.data数据集创建
tf.data的核心是tf.data.Dataset类,提供了对数据集的高层封装能力。tf.data.Dataset由一系列的可迭代访问的元素组成,每个元素包含一个或多个张量
数据集的创建主要有以下方式
- tf.data.Dataset.from_tensor_slices
最基础的数据集创建方式,也是最床用和推荐方式 - tf.data.Dataset.from_generator
使用生成器来初始化数据集,可以灵活的处理长度不同的元素 - tf.data.TFRecordDataset
这是一种从TFRecord文件中读取数据的接口 - tf.data.TextLineDataset
适用于文本数据输入的场景 - tf.data.experimental.makecsvdataset
适用于CSV格式数据输入的场景
tf.data数据预处理
- Dataset.batch()数据分批
使用该方法可以将数据划分为固定大小的批次,方便模型训练过程中数据采集Batch的方式计算梯度和更新参数 - Dataset.shuffle()数据乱序
可以将数据的顺序随机打乱,同时组合Dataset.batch()方法,将数据乱序后设置批次,可以消除数据间的顺序关联,在训练师非常常用
Dataset.shuffle()方法的主要参数是buffer_size - Dataset.repeat()数据复制
可以对数据进行复制,他的参数count表示复制的倍数,默认count=-1为无限倍数的赋值 - Dataset.prefetch()数据预取出(并行化策略)
可以进行并行化读取数据,充分利用计算资源,减少CPU数据加载和GPU数据训练时间之间的切换空载时间 - Dataset.map()
Dataset.map(f)对数据集中的每个元素应用函数f(自定义函数Function或Lambda表达式),得到一个新的数据集
tf.data数据使用
- 直接for循环
- Dataset.take()取出部分或全部数据
- 直接输入至Keras使用
TensorFlow.Net Keras模型搭建的3种方式
- Sequential API(序列式API):按层顺序搭建模型
- Functional API(函数式API):函数式API搭建任意结构
- Model Subclassing(模型子类化): 模型子类化搭建自定义模型
优先使用Sequential API进行模型的快速搭建;如果无法满足需求(共享网络层或多输入等),则考虑使用Functional API搭建自定义结构的模型;如果仍然无法满足需求(需要自定义控制训练过程或研发创新想法),则可以考虑Model Subclassing.
Sequential API
是Keras最简单的模型搭建方式,它先顺序地把所有模型层次依次定义,再使用内置的训练循环model.fit对模型进行训练。
但是Sequential API是Layer-by-Layer的,对某些场景的使用略有限制
– 无法共享网络层
– 不能创建多分支结构
– 不能有多个输入
这种方式特别适用于经典网络模型LeNet,AlexNet,VGGNet
var model =keras.Sequential();
model.add(keras.Input(shape: 16));
model.add(keras.layers.Dense(32, activation: keras.activations.Relu));
//现在,模型的输入数值的形状设置为(none,16)
//模型的输出数组的形状设置为(None,32)
//在第一层之后,不需要指定输入的大小,Keras内部会动进行上下文适配
model.add(keras.layers.Dense(32));
Assert.AreEqual((-1, 32), model.output_shape);
Functional API
简单的Sequential API方式有时候不能搭建任意结构的神经网络。为此,Keras提供了Functional API,帮助我们建立更复杂和灵活的模型。Functional API可以处理非线性拓扑、具有共享层的模型和具有多个输入或输出的模型。Functional API的使用方法是将层作为可调用的对象并返回张量,并将输入向量和输出向量提供给Model的inputs和outputs参数。
Functional API有如下功能。
– 定义更复杂的模型
– 支持多输入和多输出
– 可以定义模型分支,如Inception Block 、ResNet Block
– 方便层共享
Functional API方式特别适用于一些复杂的网络模型,如ResNet、GoogleNet/Inception、Xception、SqueezeNet等
Model model;
NDArray x_train,y_train,x_test,y_test;
LayersApi layers = new LayersApi();
(x_train, y_train, x_test, y_test) = keras.datasets.mnist.load_data();
x_train = x_train.reshape((60000,784)) / 255f;
x_test = x_test.reshape((10000, 784)) / 255f;
//搭建模型
var inputs = keras.Input(shape: 784);//输入层
var outputs = layers.Dense(64, activation: keras.activations.Relu).Apply(inputs);//第一个全连接层
outputs = layers.Dense(64, activation: keras.activations.Relu).Apply(outputs);//第二个全连接层
outputs=layers.Dense(10).Apply(outputs);//输出层
model = keras.Model(inputs, outputs, name: "mnist_model");//搭建keras模型
model.summary();//显示模型概况
model.compile(loss: keras.losses.SparseCategoricalCrossentropy(from_logits: true), optimizer: keras.optimizers.RMSprop(), metrics: new[] { "accuracy" });//将keras DNN模型编译成TensorFlow的静态图
//使用输入数据和标签来训练模型
model.fit(x_train,y_train,batch_size:64,epochs: 2,validation_split:0.2f);
//评估模型
model.evaluate(x_test, y_test, verbose: 2);
//序列化保存模型
model.save("mnist_model");
Model Subclassing
通过该模型,可以搭建自定义模型,主要氛围自定义层(可以继承Layer类)、自定义损失函数(可以继承Loss类)和自定义评估函数(可以继承Metric类)
从开发人员角度,这种工作方式先扩展框架定义的模型类,实例化层,再编写模型的正向传播过程。通过Keras Subclassing API支持这种开箱即用的方式。在Keras中,模型类是基本类,可以在此基础上进行任意的自定义操作,对模型的所有部分进行控制
自定义模型需要先集成Tesnorflow.Keras.Engine.Model,再在构造函数中初始化模型所需要的层(可以使用Keras的层或继承Layer进行自定义层),并重载Call()方法进行模型的调用,建立输入和输出之间的函数关系。
//演示用,不能运行
internal class MyModel:Model
{
Layer myLayer1, myLayer2, output;
public MyModel(ModelArgs args): base(args) {
//第一层
myLayer1 = Layer.xxx;
//第二层
myLayer2 = Layer.XXX;
output = Layer.xxx;
}
//配置前向传播逻辑
protected override Tensors Call(Tensors inputs, Tensor state = null, bool? training = null)
{
inputs = myLayer1.Apply(inputs);
inputs = myLayer2.Apply(inputs);
inputs = output.Apply(inputs);
return inputs;
}
}
通过Model Subclassing方式自定义的模型,也可以使用Sequential API或Functional API方式,其中定义的层需要添加get_config方法以序列化组合模型
DNN with Keras
Keras方式的DNN模型搭建流程和Eager方式类似,差异部分主要在于使用Keras的全连接层(Dense层)替代了Eager方式中的“线性变换+激活函数”。
TensorFlow.Net2推荐使用Keras进行模型搭建和训练,Keras是一种高级神经网络API,可以简单、快速和灵活地搭建网络模型。
Keras有两个比较重要的概念:模型(Model)和层(Layer)。层将常用的神经网络层进行封装(全连接层、卷积层、池化层等);模型将各个层进行连接,并封装成一个完整的网络模型。在进行模型调用的时候,使用y_pred=model(x)的形式即可。
Keras在Tensorflow.Keras.Engine.Layer下内置了深度学习中常用的网络层,同时支持继承并自定义层。
Filed under: TensorFlow,人工智能,编程 - @ 2023年4月16日 下午8:17