Browse Source

input multiple pictures for Image Recognition Inception.

tags/v0.9
Oceania2018 6 years ago
parent
commit
a38bd5d0b2
8 changed files with 100 additions and 69 deletions
  1. BIN
      data/shasta-daisy.jpg
  2. +3
    -23
      docs/source/LogisticRegression.md
  3. BIN
      docs/source/_static/logistic-regression/1557035393445.png
  4. +0
    -0
      docs/source/_static/sigmoid.png
  5. +4
    -4
      src/TensorFlowNET.Core/TensorFlowNET.Core.csproj
  6. +42
    -35
      test/TensorFlowNET.Examples/ImageRecognitionInception.cs
  7. +5
    -4
      test/TensorFlowNET.Examples/Program.cs
  8. +46
    -3
      test/TensorFlowNET.Examples/Text/NER/BiLstmCrfNer.cs

BIN
data/shasta-daisy.jpg View File

Before After
Width: 400  |  Height: 300  |  Size: 70 kB

+ 3
- 23
docs/source/LogisticRegression.md View File

@@ -6,31 +6,11 @@ Logistic regression is a statistical analysis method used to predict a data valu

逻辑回归是一种统计分析方法,用于根据已有得观察数据来预测未知数据。逻辑回归模型通过分析一个或多个现有自变量之间的关系来预测从属数据变量。

The dependent variable of logistics regression can be two-category or multi-category, but the two-category is more common and easier to explain. So the most common use in practice is the logistics of the two classifications.
The dependent variable of logistics regression can be two-category or multi-category, but the two-category is more common and easier to explain. So the most common use in practice is the logistics of the two classifications. An example used by TensorFlow.NET is a hand-written digit recognition, which is a multi-category.

逻辑回归的因变量可以是二分类的,也可以是多分类的,但是二分类的更为常用,也更加容易解释。
逻辑回归的因变量可以是二分类的,也可以是多分类的,但是二分类的更为常用,也更加容易解释。 TensorFlow.NET用的例子是一个手写数字识别,它是一个多分类的问题。


Logistics regression corresponds to a hidden status p through the function trumpetp = S(ax+b), then determine the value of the dependent
variable according to the size of p and 1-p.The function S here is the Sigmoid function:
S(t)=1/(1+e^(-t)
By changing t to ax+b, you can get the parameter form of the logistic regression model:
P(x;a,b) = 1 / (1 + e^(-ax+b))

logistic回归通过函数S将ax+b对应到一个隐状态p,p = S(ax+b),然后根据p与1-p的大小决定因变量的值。这里的函数S就是Sigmoid函数:
S(t)=1/(1+e^(-t)
将t换成ax+b,可以得到逻辑回归模型的参数形式:
P(x;a,b) = 1 / (1 + e^(-ax+b))

![image](https://github.com/SciEvan/TensorFlow.NET/tree/master/docs/source/sigmoid.png)

sigmoid函数的图像

By the function of the function S, we can limit the output value to the interval [0, 1],
p(x) can then be used to represent the probability p(y=1|x), the probability that y is divided into 1 group when an x occurs.

通过函数S的作用,我们可以将输出的值限制在区间[0, 1]上,p(x)则可以用来表示概率p(y=1|x),即当一个x发生时,y被分到1那一组的概率
Softmax regression allows us to handle ![1557035393445](_static\logistic-regression\1557035393445.png) where K is the number of classes.


The full example is [here](https://github.com/SciSharp/TensorFlow.NET/blob/master/test/TensorFlowNET.Examples/LogisticRegression.cs).

BIN
docs/source/_static/logistic-regression/1557035393445.png View File

Before After
Width: 149  |  Height: 27  |  Size: 2.3 kB

docs/source/sigmoid.png → docs/source/_static/sigmoid.png View File


+ 4
- 4
src/TensorFlowNET.Core/TensorFlowNET.Core.csproj View File

@@ -5,7 +5,7 @@
<AssemblyName>TensorFlow.NET</AssemblyName>
<RootNamespace>Tensorflow</RootNamespace>
<TargetTensorFlow>1.14.0</TargetTensorFlow>
<Version>0.7.0</Version>
<Version>0.8.0</Version>
<Authors>Haiping Chen</Authors>
<Company>SciSharp STACK</Company>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
@@ -17,15 +17,15 @@
<PackageTags>TensorFlow, NumSharp, SciSharp, MachineLearning, TensorFlow.NET, C#</PackageTags>
<Description>Google's TensorFlow full binding in .NET Standard.
Docs: https://tensorflownet.readthedocs.io</Description>
<AssemblyVersion>0.7.0.0</AssemblyVersion>
<PackageReleaseNotes>Changes since v0.6:
<AssemblyVersion>0.8.0.0</AssemblyVersion>
<PackageReleaseNotes>Changes since v0.7:

Add XOR example.
Add KMeans example.
Add Object Detection example.
Add Word2Vec example.</PackageReleaseNotes>
<LangVersion>7.2</LangVersion>
<FileVersion>0.7.0.0</FileVersion>
<FileVersion>0.8.0.0</FileVersion>
</PropertyGroup>

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">


test/TensorFlowNET.Examples/ImageRecognition.cs → test/TensorFlowNET.Examples/ImageRecognitionInception.cs View File

@@ -1,27 +1,33 @@
using NumSharp;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.IO.Compression;
using Console = Colorful.Console;
using System.Linq;
using System.Net;
using System.Text;
using Tensorflow;
using System.Drawing;

namespace TensorFlowNET.Examples
{
public class ImageRecognition : Python, IExample
/// <summary>
/// Inception v3 is a widely-used image recognition model
/// that has been shown to attain greater than 78.1% accuracy on the ImageNet dataset.
/// The model is the culmination of many ideas developed by multiple researchers over the years.
/// </summary>
public class ImageRecognitionInception : Python, IExample
{
public int Priority => 7;
public bool Enabled { get; set; } = true;
public string Name => "Image Recognition";
public string Name => "Image Recognition Inception";
public bool ImportGraph { get; set; } = false;


string dir = "ImageRecognition";
string dir = "ImageRecognitionInception";
string pbFile = "tensorflow_inception_graph.pb";
string labelFile = "imagenet_comp_graph_label_strings.txt";
string picFile = "grace_hopper.jpg";

public bool Run()
{
@@ -29,41 +35,39 @@ namespace TensorFlowNET.Examples

var labels = File.ReadAllLines(Path.Join(dir, labelFile));
var files = Directory.GetFiles(Path.Join(dir, "img"));
foreach (var file in files)
{
var tensor = ReadTensorFromImageFile(file);

var graph = new Graph().as_default();
//import GraphDef from pb file
graph.Import(Path.Join(dir, pbFile));
var graph = new Graph().as_default();
//import GraphDef from pb file
graph.Import(Path.Join(dir, pbFile));

var input_name = "input";
var output_name = "output";

var input_name = "input";
var output_name = "output";
var input_operation = graph.OperationByName(input_name);
var output_operation = graph.OperationByName(output_name);

var input_operation = graph.OperationByName(input_name);
var output_operation = graph.OperationByName(output_name);
var result_labels = new List<string>();
var sw = new Stopwatch();

var idx = 0;
float propability = 0;
with(tf.Session(graph), sess =>
with(tf.Session(graph), sess =>
{
foreach (var file in files)
{
sw.Restart();

// load image file
var tensor = ReadTensorFromImageFile(file);
var results = sess.run(output_operation.outputs[0], new FeedItem(input_operation.outputs[0], tensor));
var probabilities = results.Data<float>();
for (int i = 0; i < probabilities.Length; i++)
{
if (probabilities[i] > propability)
{
idx = i;
propability = probabilities[i];
}
}
});

Console.WriteLine($"{picFile}: {labels[idx]} {propability}");
return labels[idx].Equals("military uniform");
}

return false;
results = np.squeeze(results);
int idx = np.argmax(results);

Console.WriteLine($"{file.Split(Path.DirectorySeparatorChar).Last()}: {labels[idx]} {results[idx]} in {sw.ElapsedMilliseconds}ms", Color.Tan);

result_labels.Add(labels[idx]);
}
});
return result_labels.Contains("military uniform");
}

private NDArray ReadTensorFromImageFile(string file_name,
@@ -72,7 +76,7 @@ namespace TensorFlowNET.Examples
int input_mean = 117,
int input_std = 1)
{
return with(tf.Graph().as_default(), graph =>
return with(tf.Graph(), graph =>
{
var file_reader = tf.read_file(file_name, "file_reader");
var decodeJpeg = tf.image.decode_jpeg(file_reader, channels: 3, name: "DecodeJpeg");
@@ -102,6 +106,9 @@ namespace TensorFlowNET.Examples
Directory.CreateDirectory(Path.Join(dir, "img"));
url = $"https://raw.githubusercontent.com/tensorflow/tensorflow/master/tensorflow/examples/label_image/data/grace_hopper.jpg";
Utility.Web.Download(url, Path.Join(dir, "img"), "grace_hopper.jpg");

url = $"https://raw.githubusercontent.com/SciSharp/TensorFlow.NET/master/data/shasta-daisy.jpg";
Utility.Web.Download(url, Path.Join(dir, "img"), "shasta-daisy.jpg");
}
}
}

+ 5
- 4
test/TensorFlowNET.Examples/Program.cs View File

@@ -4,6 +4,7 @@ using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Reflection;
using Tensorflow;
using Console = Colorful.Console;

namespace TensorFlowNET.Examples
@@ -12,16 +13,18 @@ namespace TensorFlowNET.Examples
{
static void Main(string[] args)
{
var assembly = Assembly.GetEntryAssembly();
var errors = new List<string>();
var success = new List<string>();
var disabled = new List<string>();
var examples = assembly.GetTypes()
var examples = Assembly.GetEntryAssembly().GetTypes()
.Where(x => x.GetInterfaces().Contains(typeof(IExample)))
.Select(x => (IExample)Activator.CreateInstance(x))
.OrderBy(x => x.Priority)
.ToArray();

Console.WriteLine($"TensorFlow v{tf.VERSION}", Color.Yellow);
Console.WriteLine($"TensorFlow.NET v{Assembly.GetAssembly(typeof(TF_DataType)).GetName().Version}", Color.Yellow);

var sw = new Stopwatch();
foreach (IExample example in examples)
{
@@ -30,7 +33,6 @@ namespace TensorFlowNET.Examples

Console.WriteLine($"{DateTime.UtcNow} Starting {example.Name}", Color.White);

try
{
if (example.Enabled || args.Length > 0) // if a specific example was specified run it, regardless of enabled value
@@ -55,7 +57,6 @@ namespace TensorFlowNET.Examples
Console.WriteLine(ex);
}

Console.WriteLine($"{DateTime.UtcNow} Completed {example.Name}", Color.White);
}



+ 46
- 3
test/TensorFlowNET.Examples/Text/NER/BiLstmCrfNer.cs View File

@@ -1,10 +1,15 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using Tensorflow;

namespace TensorFlowNET.Examples
{
/// <summary>
/// Bidirectional LSTM-CRF Models for Sequence Tagging
/// https://github.com/guillaumegenthial/tf_ner/tree/master/models/lstm_crf
/// </summary>
public class BiLstmCrfNer : Python, IExample
{
public int Priority => 13;
@@ -13,15 +18,53 @@ namespace TensorFlowNET.Examples
public bool ImportGraph { get; set; } = false;

public string Name => "bi-LSTM + CRF NER";
HyperParams @params = new HyperParams();

public bool Run()
{
PrepareData();
return true;
}

public void PrepareData()
{
if (!Directory.Exists(HyperParams.DATADIR))
Directory.CreateDirectory(HyperParams.DATADIR);

if (!Directory.Exists(@params.RESULTDIR))
Directory.CreateDirectory(@params.RESULTDIR);

if (!Directory.Exists(@params.MODELDIR))
Directory.CreateDirectory(@params.MODELDIR);

if (!Directory.Exists(@params.EVALDIR))
Directory.CreateDirectory(@params.EVALDIR);
}

public bool Run()
private class HyperParams
{
return true;
public const string DATADIR = "BiLstmCrfNer";
public string RESULTDIR = Path.Combine(DATADIR, "results");
public string MODELDIR;
public string EVALDIR;

public int dim = 300;
public float dropout = 0.5f;
public int num_oov_buckets = 1;
public int epochs = 25;
public int batch_size = 20;
public int buffer = 15000;
public int lstm_size = 100;
public string words = Path.Combine(DATADIR, "vocab.words.txt");
public string chars = Path.Combine(DATADIR, "vocab.chars.txt");
public string tags = Path.Combine(DATADIR, "vocab.tags.txt");
public string glove = Path.Combine(DATADIR, "glove.npz");

public HyperParams()
{
MODELDIR = Path.Combine(RESULTDIR, "model");
EVALDIR = Path.Combine(MODELDIR, "eval");
}
}
}
}

Loading…
Cancel
Save