Tensorflowsharp从入门到放弃(一)——安装和教程复刻

图像做到瓶颈了,换深度学习了。

如同opencv基于c++的我不会最后用了Emgucv一样,Tensorflow我也是不会python和c++,最后决定用Tensorflowsharp(以后用TF#缩写了)。和Opencv与Emgucv一样的问题,TF教程漫天飞了,但TF#外面只有简单的介绍和已经训练好的识别,路漫漫我又来踏这第一步了,不知道能坚持多久。

安装就一句话:新建项目(我还是只习惯winform)- 打开 VS的工具,找到Nuget,控制台输入:Install-Package TensorFlowSharp -Version 1.11.0

以下是今天的复写内容,原作者是写的控制台,所以显示的部分代码和部分变量名(主要是e)修改了以一下。

TF#里的一些常用定义基本如下了:常量,变量,占位符,矩阵。

tips:64位,framewo4.6.1以上请不要忘了

tips:如教程,能用运算函数就用运算函数,不要自己+-*\

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using TensorFlow;

namespace TFLesson
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 01 HelloWorld
        /// </summary>
        private void button1_Click(object sender, EventArgs e)
        {
            // 创建图
            var g = new TFGraph();

            // 定义常量
            var a = g.Const(2);
            var b = g.Const(3);

            // 加法和乘法运算
            var add = g.Add(a, b);
            var mul = g.Mul(a, b);

            // 创建会话
            var sess = new TFSession(g);

            // 计算加法
            var result1 = sess.GetRunner().Run(add).GetValue();
            this.textBox1.Text= "a+b="+ result1.ToString();

            // 计算乘法
            var result2 = sess.GetRunner().Run(mul).GetValue();
            this.textBox1.Text +="\r\n"+ "a*b=" + result2.ToString();

            // 关闭会话
            sess.CloseSession();
        }

        /// <summary>
        /// 02 使用占位符
        /// </summary>
        private void button2_Click(object sender, EventArgs e)
        {
            // 创建图
            var g = new TFGraph();

            // 创建占位符,以便在运行时赋值
            var x = g.Placeholder(TFDataType.Float); // 1
            var y = g.Placeholder(TFDataType.Float); // 2
            var z = g.Placeholder(TFDataType.Float); // 3

            // 进行各种数学运算
            var a = g.Add(x, y);
            var b = g.Mul(a, z);
            var c = g.Pow(b, g.Const(2.0f)); // 注意:一定要保证数据类型相同,否则报错
            var d = g.Div(c, x);
            var f = g.Sqrt(d);

            // 定义会话
            var sess = new TFSession(g);

            // 给占位符赋值并运行图
            var result = sess.GetRunner()
                .AddInput(x, 1.0f) // 注意:一定要保证数据类型相同,否则报错
                .AddInput(y, 2.0f)
                .AddInput(z, 3.0f)
                .Run(f).GetValue();

            // 输出结果
            // sqrt(((1+2)*3)^2/1) = 9
            this.textBox1.Text ="f="+ result.ToString();
          
        }

        /// <summary>
        /// 03 使用变量
        /// </summary>
        private void button3_Click(object sender, EventArgs e)
        {
            // 创建图
            var g = new TFGraph();

            // 定义操作,用于初始化变量
            TFOperation init;

            // 定义值,用于保存变量的值
            TFOutput value;

            // 定义一个变量,初始值为1.5
            var a = g.Variable(g.Const(1.5), out init, out value);

            // 定义一个常量,表示每次循环变量增加值
            var inc = g.Const(0.5);

            // 定义一个操作,将变量a的值value加上inc,然后赋值给a
            var update = g.AssignVariableOp(a, g.Add(value, inc));

            // 会话
            var sess = new TFSession(g);

            // 变量使用前一定要初始化
            sess.GetRunner().AddTarget(init).Run();

            for (var i = 0; i < 5; i++)
            {
                // 每次执行更新操作,都取出value的值存放到result中
                // Fetch可以一次取出多个值
                var result = sess.GetRunner().Fetch(value).AddTarget(update).Run();

                // 输出每次循环变量的值
                this.textBox1.Text += "\r\n" + "result" +i.ToString()+":"+ result[0].GetValue();
                //Console.WriteLine("result {0}:{1}", i, result[0].GetValue());
            }
        }

        /// <summary>
        /// 04 变量初始化
        /// </summary>
        private void button4_Click(object sender, EventArgs e)
        {
            // 创建图
            var g = new TFGraph();

            // 创建状态,用于输出操作状态
            TFStatus status = new TFStatus();

            // 定义变量
            var a = g.VariableV2(TFShape.Scalar, TFDataType.Double);
            var initA = g.Assign(a, g.Const(1.0));

            var b = g.VariableV2(new TFShape(99), TFDataType.Int32);
            var initB = g.Assign(b, g.Range(g.Const(1), g.Const(100)));

            // 创建会话
            var sess = new TFSession(g);
            var runner = sess.GetRunner();

            // 初始化变量,并输出操作状态
            runner.AddTarget(initA.Operation, initB.Operation).Run(status);
            this.textBox1.Text=status.StatusCode.ToString();

            // 并输出计算状态和计算结果
            var result = runner.Fetch(a, b).Run();
            this.textBox1.Text += "\r\n" + result[0].GetValue().ToString();
            this.textBox1.Text += "\r\n" + string.Join(",", (int[])result[1].GetValue());

        }

        /// <summary>
        /// 05 使用矩阵
        /// </summary>
        private void button5_Click(object sender, EventArgs e)
        {
            // 创建图
            var g = new TFGraph();

            // 创建占位符,占位符将由xValue矩阵填充
            var x = g.Placeholder(TFDataType.Int32);
            var xValue = new int[,]
            {
                { 0, 1 },
                { 2, 3 }
            };

            // 创建常量
            var a = g.Const(2);
            var b = g.Const(new int[,]
            {
                { 1, 1 },
                { 1, 1 }
            });
            var c = g.Const(new int[,]
            {
                { 1, 0 },
                { 0, 1 }
            });

            // 矩阵乘以常数
            var d = g.Mul(x, a);

            // 两个矩阵相加
            var h = g.Add(d, b);

            // 矩阵乘以矩阵
            var f = g.MatMul(h, c);

            // 创建会话
            var sess = new TFSession(g);

            // 计算矩阵f的值,并把结果保存到result中
            var result = (int[,])sess.GetRunner()
                .AddInput(x, xValue)
                .Fetch(f).Run()[0].GetValue();

            // 输出矩阵f
            for (var i = 0; i < xValue.GetLength(0); i++)
            {
                for (var j = 0; j < xValue.GetLength(1); j++)
                {
                    this.textBox1.Text += "\t"+result[i, j].ToString();
                }
                this.textBox1.Text+= "\r\n";
            }
        }
    }
}

 

初开博客,目的合作 交流,QQ:273651820.。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章