图像做到瓶颈了,换深度学习了。
如同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.。