圖像做到瓶頸了,換深度學習了。
如同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.。