using Newtonsoft.Json;
using NumSharp.Core;
using System;
using System.Collections.Generic;
using System.Text;
using Tensorflow;
namespace TensorFlowNET.Examples
{
///
/// A linear regression learning algorithm example using TensorFlow library.
/// https://github.com/aymericdamien/TensorFlow-Examples/blob/master/examples/2_BasicModels/linear_regression.py
///
public class LinearRegression : Python, IExample
{
private NumPyRandom rng = np.random;
public void Run()
{
var graph = tf.Graph().as_default();
// Parameters
float learning_rate = 0.01f;
int training_epochs = 1000;
int display_step = 10;
// Training Data
var train_X = np.array(3.3f, 4.4f, 5.5f, 6.71f, 6.93f, 4.168f, 9.779f, 6.182f, 7.59f, 2.167f,
7.042f, 10.791f, 5.313f, 7.997f, 5.654f, 9.27f, 3.1f);
var train_Y = np.array(1.7f, 2.76f, 2.09f, 3.19f, 1.694f, 1.573f, 3.366f, 2.596f, 2.53f, 1.221f,
2.827f, 3.465f, 1.65f, 2.904f, 2.42f, 2.94f, 1.3f);
var n_samples = train_X.shape[0];
// tf Graph Input
var X = tf.placeholder(tf.float32);
var Y = tf.placeholder(tf.float32);
// Set model weights
//var rnd1 = rng.randn();
//var rnd2 = rng.randn();
var W = tf.Variable(-0.06f, name: "weight");
var b = tf.Variable(-0.73f, name: "bias");
var mul = tf.multiply(X, W);
var pred = tf.add(mul, b);
// Mean squared error
var sub = pred - Y;
var pow = tf.pow(sub, 2.0f);
var reduce = tf.reduce_sum(pow);
var cost = reduce / (2.0f * n_samples);
// radient descent
// Note, minimize() knows to modify W and b because Variable objects are trainable=True by default
var grad = tf.train.GradientDescentOptimizer(learning_rate);
var optimizer = grad.minimize(cost);
//tf.train.export_meta_graph(filename: "linear_regression.meta.bin");
// import meta
// var new_saver = tf.train.import_meta_graph("linear_regression.meta.bin");
var text = JsonConvert.SerializeObject(graph, new JsonSerializerSettings
{
Formatting = Formatting.Indented
});
/*var cost = graph.OperationByName("truediv").output;
var pred = graph.OperationByName("Add").output;
var optimizer = graph.OperationByName("GradientDescent");
var X = graph.OperationByName("Placeholder").output;
var Y = graph.OperationByName("Placeholder_1").output;
var W = graph.OperationByName("weight").output;
var b = graph.OperationByName("bias").output;*/
// Initialize the variables (i.e. assign their default value)
var init = tf.global_variables_initializer();
// Start training
with(tf.Session(graph), sess =>
{
// Run the initializer
sess.run(init);
// Fit all training data
for (int epoch = 0; epoch < training_epochs; epoch++)
{
foreach (var (x, y) in zip(train_X, train_Y))
{
sess.run(optimizer,
new FeedItem(X, x),
new FeedItem(Y, y));
var rW = sess.run(W);
}
// Display logs per epoch step
/*if ((epoch + 1) % display_step == 0)
{
var c = sess.run(cost,
new FeedItem(X, train_X),
new FeedItem(Y, train_Y));
var rW = sess.run(W);
Console.WriteLine($"Epoch: {epoch + 1} cost={c} " +
$"W={rW} b={sess.run(b)}");
}*/
}
Console.WriteLine("Optimization Finished!");
});
}
}
}