项目开发环境为Visual Studio 2019 + .Net 5

创建新项目后首先通过Nuget引入相关包:

SciSharp.TensorFlow.Redist是Google提供的TensorFlow开发库,是采用C语言开发的动态链接库(DLL);

TensorFlow.NET采用C#语言对C语言的库进行封装,提供.NET调用接口;

TensorFlow.Keras是一个高级工具类,对建模和训练过程进行封装,提供简便接口。

通过下列语句对库进行引用:

using Tensorflow;

using Tensorflow.NumPy;

using static Tensorflow.Binding;

using static Tensorflow.KerasApi;

下面展示一些TensorFlow.NET的基本类型操作:

       /// <summary>
/// 构建张量
/// </summary>
private void Base_Constant()
{
//通过基本类型构建张量
var c1 = tf.constant(3); // int
var c2 = tf.constant(1.0f); // float
var c3 = tf.constant(2.0); // double
var c4 = tf.constant("Hello Tensorflow.Net!"); // string Console.WriteLine(c1);
Console.WriteLine(c2);
Console.WriteLine(c3);
Console.WriteLine(c4); //通过多维数值构建张量
int[,] arr = new int[,] { { 1, 2, 3 }, { 4, 5, 6 } };
var nd = np.array(arr);
var tensor = tf.constant(nd);
Console.WriteLine(tensor); //构建全0或全1张量
var tensor0 = tf.constant(np.zeros(new Shape(2, 3)));
var tensor1 = tf.constant(np.ones(new Shape(2, 3)));
Console.WriteLine(tensor0);
Console.WriteLine(tensor1); var tensor_0 = tf.zeros(new Shape(2, 3));
var tensor_1 = tf.ones(new Shape(2, 3));
Console.WriteLine(tensor_0);
Console.WriteLine(tensor_1);
} /// <summary>
/// 张量运算
/// </summary>
private void Base_Operator()
{
var a = tf.constant(2.0f);
var b = tf.constant(3.0f);
var c = tf.constant(5.0f); // 基本运算,可以采+ - * / 等运算符
var add = tf.add(a, b);
var sub = tf.subtract(a, b);
var mul = tf.multiply(a, b);
var div = tf.divide(a, b); print($"{(float)a} + {(float)b} = {(float)add}");
print($"{(float)a} - {(float)b} = {(float)sub}");
print($"{(float)a} * {(float)b} = {(float)mul}");
print($"{(float)a} / {(float)b} = {(float)div}"); // 求平均、求和
var mean = tf.reduce_mean(tf.constant(new[] { a, b, c }));
var sum = tf.reduce_sum(tf.constant(new[] { a, b, c }));
print("mean =", mean.numpy());
print("sum =", sum.numpy()); // 矩阵相乘
var matrix1 = tf.constant(new float[,] { { 1, 2, 3 }, { 3, 4, 5 } });
var matrix2 = tf.constant(new float[,] { { 3, 4 }, { 5, 6 }, { 7, 8 } });
var product1 = tf.matmul(matrix1, matrix2);
print("product1 =", product1.numpy());
} /// <summary>
/// 生成随机数张量
/// </summary>
private void Base_Random()
{
var t1 = tf.random.normal(new Shape(10));
var t2 = tf.random.uniform(new Shape(2, 5));
var t3 = tf.random.uniform(new Shape(2, 5), 1, 100); Console.WriteLine($"t1={t1.numpy()}");
Console.WriteLine($"t2={t2.numpy()}");
Console.WriteLine($"t3={t3.numpy()}"); t1 = tf.random.normal(new Shape(100), mean: 0.5f, stddev: 2);
var mean = tf.reduce_mean(t1);
var max = tf.reduce_max(t1);
var min = tf.reduce_min(t1);
Console.WriteLine($"mean={mean.numpy()},max={max.numpy()},min={min.numpy()}");
}

上述代码基本都比较简单,基本一看就能懂,有几处需要解释一下:

1、平常我们在生成随机数时,一般都是平均分布,但机器学习的数据更多趋向正态分布,所以采用normal生成随机数,mean表示中心点,stddev表示分布范围;

2、从表面看tf的框架似乎提供了一套可以进行矩阵运算的Math库,但实际并非如此,tf框架的核心是可以计算运算的梯度,这个问题我们后面再讲;

3、tf有两个版本,V1版和V2版本,如果要使用V1版本语法,需要在代码之前加一句:tf.compat.v1.disable_eager_execution();

相对的,V2版本为:tf.enable_eager_execution();由于默认为V2版本,所以这行代码可以省略不写。

本系列的所有代码均采用V2版本。官方提供的样例里有大量V1版本代码,有一些V2版没有提供的功能,可能不得不采用V1版代码实现。

【参考资料】

TensorFlow教程:TensorFlow快速入门教程

【项目源码】

Git: https://gitee.com/seabluescn/tf_not.git

项目名称:SayHello

目录:TensorFlow.NET机器学习入门系列目录

TensorFlow.NET机器学习入门【1】开发环境与类型简介的更多相关文章

  1. TensorFlow.NET机器学习入门【0】前言与目录

    曾经学习过一段时间ML.NET的知识,ML.NET是微软提供的一套机器学习框架,相对于其他的一些机器学习框架,ML.NET侧重于消费现有的网络模型,不太好自定义自己的网络模型,底层实现也做了高度封装. ...

  2. TensorFlow.NET机器学习入门【8】采用GPU进行学习

    随着网络越来约复杂,训练难度越来越大,有条件的可以采用GPU进行学习.本文介绍如何在GPU环境下使用TensorFlow.NET. TensorFlow.NET使用GPU非常的简单,代码不用做任何修改 ...

  3. TensorFlow.NET机器学习入门【2】线性回归

    回归分析用于分析输入变量和输出变量之间的一种关系,其中线性回归是最简单的一种. 设: Y=wX+b,现已知一组X(输入)和Y(输出)的值,要求出w和b的值. 举个例子:快年底了,销售部门要发年终奖了, ...

  4. TensorFlow.NET机器学习入门【3】采用神经网络实现非线性回归

    上一篇文章我们介绍的线性模型的求解,但有很多模型是非线性的,比如: 这里表示有两个输入,一个输出. 现在我们已经不能采用y=ax+b的形式去定义一个函数了,我们只能知道输入变量的数量,但不知道某个变量 ...

  5. TensorFlow.NET机器学习入门【4】采用神经网络处理分类问题

    上一篇文章我们介绍了通过神经网络来处理一个非线性回归的问题,这次我们将采用神经网络来处理一个多元分类的问题. 这次我们解决这样一个问题:输入一个人的身高和体重的数据,程序判断出这个人的身材状况,一共三 ...

  6. TensorFlow.NET机器学习入门【5】采用神经网络实现手写数字识别(MNIST)

    从这篇文章开始,终于要干点正儿八经的工作了,前面都是准备工作.这次我们要解决机器学习的经典问题,MNIST手写数字识别. 首先介绍一下数据集.请首先解压:TF_Net\Asset\mnist_png. ...

  7. TensorFlow.NET机器学习入门【6】采用神经网络处理Fashion-MNIST

    "如果一个算法在MNIST上不work,那么它就根本没法用:而如果它在MNIST上work,它在其他数据上也可能不work". -- 马克吐温 上一篇文章我们实现了一个MNIST手 ...

  8. TensorFlow.NET机器学习入门【7】采用卷积神经网络(CNN)处理Fashion-MNIST

    本文将介绍如何采用卷积神经网络(CNN)来处理Fashion-MNIST数据集. 程序流程如下: 1.准备样本数据 2.构建卷积神经网络模型 3.网络学习(训练) 4.消费.测试 除了网络模型的构建, ...

  9. PHP入门教程-开发环境搭建

    1.PHP简介: PHP是能让你生成动态网页的工具之一.PHP网页文件被当作一般HTML网页文件来处理并且在编辑时你可以用编辑HTML的常规方法编写PHP. 2.学习需要基础: a.HTML b.Ja ...

随机推荐

  1. [第四篇] PostGIS:“我让PG更完美!”

    概要 本篇文章主要分为几何图形处理函数.仿生变换函数.聚类函数.边界分析函数.线性参考函数.轨迹函数.SFCGAL 函数.版本函数这八部分. Geometry Processing ST_Buffer ...

  2. Python 3 快速入门 1 —— 数据类型与变量

    本文假设你已经有一门面向对象编程语言基础,如Java等,且希望快速了解并使用Python语言.本文对重点语法和数据结构以及用法进行详细说明,同时对一些难以理解的点进行了图解,以便大家快速入门.一些较偏 ...

  3. SpringCloud微服务实战——搭建企业级开发框架(二十七):集成多数据源+Seata分布式事务+读写分离+分库分表

    读写分离:为了确保数据库产品的稳定性,很多数据库拥有双机热备功能.也就是,第一台数据库服务器,是对外提供增删改业务的生产服务器:第二台数据库服务器,主要进行读的操作. 目前有多种方式实现读写分离,一种 ...

  4. Codeforces 739D - Recover a functional graph(二分图匹配)

    Codeforces 题面传送门 & 洛谷题面传送门 首先假设我们已经填好了所有问号处的值怎样判断是否存在一个合法的构造方案,显然对于一种方案能够构造出合法的基环内向森林当且仅当: \(\fo ...

  5. 【基因组组装】HiC挂载Juicebox纠错补充

    目录 1. 主要纠错类型 misjoins translocations inversions chromosome boundaries 2. 其他有用操作 撤销与反撤销 移到边角料 1. 主要纠错 ...

  6. mac 下 如何在同一窗口打开多个终端并实现快捷键切换

    相信大家编代码的时候都会遇到,每次需要在头文件,库文件和源码文件中编代码的时候,总是需要在几个文件中切换来切换去的,而且一个文件就一个终端窗口,每次都要用鼠标点来点去,非常麻烦,所以如果能把这几个文件 ...

  7. Excel-给出指定数值的日期 date()

    DATE函数 函数名称:DATE 主要功能:给出指定数值的日期. 使用格式:DATE(year,month,day) 参数说明:year为指定的年份数值(小于9999):month为指定的月份数值(可 ...

  8. 码上来战!探索“智”感生活,HMS Core线上Codelabs挑战赛第4期开始!

    HMS Core线上Codelabs挑战赛第4期正式开始!我们向所有实践力超强.创新力满满的开发者发出邀请,用你的超级"码"力,解锁更多应用价值! 生活里,我们被手机"秒 ...

  9. 半天做完的数据报表,YonBuilder只要十几分钟,0代码开发

    进入数字化时代,拍脑袋的决策方式显然不靠谱,一切要靠数据说话.与信息化时代相比,数字化时代的企业对数据的应用更广泛.更深入.为了应对激烈的市场竞争,企业经营决策者们对数据的依赖度越来越高,企业各个业务 ...

  10. Tomcat类加载机制和JAVA类加载机制的比较

    图解Tomcat类加载机制    说到本篇的tomcat类加载机制,不得不说翻译学习tomcat的初衷.    之前实习的时候学习javaMelody的源码,但是它是一个Maven的项目,与我们自己的 ...