# Conflicts: # README.md # src/TensorFlowNET.Core/Sessions/_FetchMapper.cstags/v0.9
@@ -1,6 +1,7 @@ | |||
# TensorFlow.NET | |||
TensorFlow.NET provides a .NET Standard binding for [TensorFlow](https://www.tensorflow.org/). It aims to implement the complete Tensorflow API in CSharp which allows .NET developers to develop, train and deploy Machine Learning models with the cross-platform .NET Standard framework. | |||
Here is a simple test | |||
TensorFlow.NET (TF.NET) provides a .NET Standard binding for [TensorFlow](https://www.tensorflow.org/). It aims to implement the complete Tensorflow API in CSharp which allows .NET developers to develop, train and deploy Machine Learning models with the cross-platform .NET Standard framework. | |||
[](https://gitter.im/sci-sharp/community) | |||
[](https://ci.appveyor.com/project/Haiping-Chen/tensorflow-net) | |||
[](https://codecov.io/gh/SciSharp/NumSharp) | |||
@@ -8,7 +9,7 @@ Here is a simple test | |||
[](https://tensorflownet.readthedocs.io/en/latest/?badge=latest) | |||
[](https://996.icu/#/en_US) | |||
TensorFlow.NET is a member project of [SciSharp STACK](https://github.com/SciSharp). | |||
TF.NET is a member project of [SciSharp STACK](https://github.com/SciSharp). | |||
 | |||
@@ -24,14 +25,14 @@ In comparison to other projects, like for instance TensorFlowSharp which only pr | |||
### How to use | |||
Install TensorFlow.NET through NuGet. | |||
Install TF.NET through NuGet. | |||
```sh | |||
PM> Install-Package TensorFlow.NET | |||
``` | |||
If you are using Linux or Mac OS, please download the pre-compiled dll [here](tensorflowlib) and place it in the working folder. This is only need for Linux and Mac OS, and already packed into NuGet for Windows. | |||
Import tensorflow.net. | |||
Import TF.NET. | |||
```cs | |||
using Tensorflow; | |||
@@ -17,10 +17,10 @@ namespace Tensorflow | |||
if (fetch.GetType().IsArray) | |||
return new _ListFetchMapper(fetches); | |||
else | |||
return new _ElementFetchMapper(fetches, (List<object> fetched_vals) => fetched_vals[0]); | |||
return new _ElementFetchMapper(fetches, (List<NDArray> fetched_vals) => fetched_vals[0]); | |||
} | |||
public virtual NDArray build_results(List<object> values) | |||
public virtual NDArray build_results(List<NDArray> values) | |||
{ | |||
var type = values[0].GetType(); | |||
var nd = new NDArray(type, values.Count); | |||
@@ -31,16 +31,12 @@ namespace Tensorflow | |||
nd.SetData(values.Select(x => (float)x).ToArray()); | |||
break; | |||
case "NDArray": | |||
// nd.SetData<NDArray>(values.ToArray()); | |||
//NDArray[] arr = new NDArray[values.Count]; | |||
//for (int i=0; i<values.Count; i++) | |||
NDArray[] arr = values.Select(x => (NDArray)x).ToArray(); | |||
nd = new NDArray(arr); | |||
break; | |||
default: | |||
break; | |||
} | |||
return nd; | |||
} | |||
@@ -33,19 +33,54 @@ namespace TensorFlowNET.Examples | |||
public bool Run() | |||
{ | |||
PrepareData(); | |||
var graph = tf.Graph().as_default(); | |||
tf.train.import_meta_graph("kmeans.meta"); | |||
// Input images | |||
var X = tf.placeholder(tf.float32, shape: new TensorShape(-1, num_features)); | |||
var X = graph.get_operation_by_name("Placeholder").output; // tf.placeholder(tf.float32, shape: new TensorShape(-1, num_features)); | |||
// Labels (for assigning a label to a centroid and testing) | |||
var Y = tf.placeholder(tf.float32, shape: new TensorShape(-1, num_classes)); | |||
var Y = graph.get_operation_by_name("Placeholder_1").output; // tf.placeholder(tf.float32, shape: new TensorShape(-1, num_classes)); | |||
// K-Means Parameters | |||
var kmeans = new KMeans(X, k, distance_metric: KMeans.COSINE_DISTANCE, use_mini_batch: true); | |||
//var kmeans = new KMeans(X, k, distance_metric: KMeans.COSINE_DISTANCE, use_mini_batch: true); | |||
// Build KMeans graph | |||
var training_graph = kmeans.training_graph(); | |||
//var training_graph = kmeans.training_graph(); | |||
var init_vars = tf.global_variables_initializer(); | |||
Tensor init_op = graph.get_operation_by_name("cond/Merge"); | |||
var train_op = graph.get_operation_by_name("group_deps"); | |||
Tensor avg_distance = graph.get_operation_by_name("Mean"); | |||
Tensor cluster_idx = graph.get_operation_by_name("Squeeze_1"); | |||
with(tf.Session(graph), sess => | |||
{ | |||
sess.run(init_vars, new FeedItem(X, full_data_x)); | |||
sess.run(init_op, new FeedItem(X, full_data_x)); | |||
// Training | |||
NDArray result = null; | |||
foreach(var i in range(1, num_steps + 1)) | |||
{ | |||
result = sess.run(new ITensorOrOperation[] { train_op, avg_distance, cluster_idx }, new FeedItem(X, full_data_x)); | |||
if (i % 2 == 0 || i == 1) | |||
print($"Step {i}, Avg Distance: {result[1]}"); | |||
} | |||
var idx = result[2]; | |||
// Assign a label to each centroid | |||
// Count total number of labels per centroid, using the label of each training | |||
// sample to their closest centroid (given by 'idx') | |||
var counts = np.zeros(k, num_classes); | |||
foreach (var i in range(idx.len)) | |||
counts[idx[i]] += mnist.train.labels[i]; | |||
}); | |||
return false; | |||
} | |||
@@ -50,13 +50,9 @@ namespace TensorFlowNET.Examples | |||
with(tf.Session(graph), sess => | |||
{ | |||
var results = sess.run(outTensorArr, new FeedItem(imgTensor, imgArr)); | |||
//NDArray scores = results.Array.GetValue(2) as NDArray; | |||
//floatscores.Data<float>(); | |||
NDArray[] resultArr = results.Data<NDArray>(); | |||
//float[] scores = resultArr[2].Data<float>(); | |||
buildOutputImage(resultArr); | |||
}); | |||
@@ -1,6 +1,7 @@ | |||
using Microsoft.VisualStudio.TestTools.UnitTesting; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Text; | |||
using Tensorflow; | |||
using Buffer = Tensorflow.Buffer; | |||
@@ -20,6 +21,13 @@ namespace TensorFlowNET.UnitTest | |||
var handle = c_api.TF_GetAllOpList(); | |||
var buffer = new Buffer(handle); | |||
var op_list = OpList.Parser.ParseFrom(buffer); | |||
var _registered_ops = new Dictionary<string, OpDef>(); | |||
foreach (var op_def in op_list.Op) | |||
_registered_ops[op_def.Name] = op_def; | |||
// r1.14 added NN op | |||
var op = _registered_ops.FirstOrDefault(x => x.Key == "NearestNeighbors"); | |||
Assert.IsTrue(op_list.Op.Count > 1000); | |||
} | |||