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.。

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