.Net 9下使用Tensorflow.net---DNN_Keras
.Net 9下使用Tensorflow.net---DNN_Keras
- 1、创建应用,导入依赖
- 2、编写代码
- 1)添加引用
- 2)创建基础对象
- 3)初始化数据集
- 4)重点步骤:创建 Keras下的DNN模型
- 5)训练模型得到评估值
- 6)结果输出
这个例子依然采用dnn的模型。但是依赖于 keras来实现,
整体的步骤还是如此:
一、数据加载,预处理
二、选择网络训练模型(本例使用 Eager的 DNN)
三、定义损失函数、优化函数
四、训练模型且通过优化函数优化网络权重参数
五、评估结果
1、创建应用,导入依赖
这个和 .Net 9下使用Tensorflow.net—DNN_Eager 中操作一样,不再赘述
2、编写代码
1)添加引用
using Tensorflow;
using Tensorflow.Keras.Engine;
using Tensorflow.Keras.Layers;
using Tensorflow.Operations.Initializers;
using Tensorflow.Keras.Optimizers;
//using NumSharp;
using static Tensorflow.Binding;
using static Tensorflow.KerasApi;
2)创建基础对象
IModel _model;
LayersApi _layers=new LayersApi();
3)初始化数据集
keras的API很简洁,能很清楚看到,初始化数据分为:
1、加载数据集
2、整理训练集(动作分为:数据集维度整理,归一化数据格式整理)
3、整理测试集
public void FNN()
{
var (x_train, y_train, x_test, y_test) = keras.datasets.mnist.load_data();//下载或加载本地MNIST
x_train = x_train.reshape((60000, 784))/255f;
x_test = x_test.reshape((10000, 784)) / 255f;
}
4)重点步骤:创建 Keras下的DNN模型
public void FNN()
{
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);
//搭建keras模型
_model = keras.Model(inputs, outputs,name:"mymnist_model");
_model.summary();
//将Keras DNN模型编译成 TensorFlow的静态图
_model.compile(loss: keras.losses.SparseCategoricalCrossentropy(from_logits: true),
optimizer: keras.optimizers.RMSprop(),
metrics: new[] { "accuracy" });
}
说明:
DNN模型是前馈网络神经模型,是一个多层的结构,每一个层中神经元和下一个层的神经元是全连接的。
本例中注意内容:
1、采用的 Keras的Functional API的方式来创建模型,该方式 下通过 加载数据集,指定输入 隐藏 输出层的创建模型方式。该方式的好处是 可以搭建任意结构的神经网络,本例创建的是一个两层的DNN神经网络模型。
2、主要是通过Keras的 Dense函数来 创建每层,该函数创建的是一个全连接层,其中重要参数:
a、神经元数量: 整数,表示该层的输出空间维度(即该层神经元的数量)。
b、激活函数:这个函数的作用是对处理结果进行非线性变换。是整个神经网络计算不再是单纯的线性运算(如果没有激活函数,那么整个神经网络无非就是 矩阵的相加或者相乘)。有了激活函数之后,可以将输入或者上一层的输出经过非线性变换后更加接近求解,影响反向梯度传播。
常用的激活函数包括 ‘relu’、‘sigmoid’、‘tanh’ 等,sigmod和tanh前面介绍过了,此处使用relu,表达式为:
其实可以看出,该函数可以有效的实现 激活函数对于 梯度及稀疏性的要求。
3、通过keras.Model的方法,可以直接创建模型
5)训练模型得到评估值
public void FNN()
{
//使用输入数据和标签来训练模型
_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");
}
6)结果输出
可以看到,终端最终的书结果 符合DNN的模型,准确率也在上升,是比较合理的训练结果