diff --git a/src/TensorFlowNET.Core/APIs/tf.random.cs b/src/TensorFlowNET.Core/APIs/tf.random.cs
new file mode 100644
index 00000000..4ec40d11
--- /dev/null
+++ b/src/TensorFlowNET.Core/APIs/tf.random.cs
@@ -0,0 +1,26 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Tensorflow
+{
+ public static partial class tf
+ {
+ ///
+ /// Outputs random values from a normal distribution.
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static Tensor random_normal(int[] shape,
+ float mean = 0.0f,
+ float stddev = 1.0f,
+ TF_DataType dtype = TF_DataType.TF_FLOAT,
+ int? seed = null,
+ string name = "") => random_ops.random_normal(shape, mean, stddev, dtype, seed, name);
+ }
+}
diff --git a/src/TensorFlowNET.Core/Framework/random_seed.py.cs b/src/TensorFlowNET.Core/Framework/random_seed.py.cs
new file mode 100644
index 00000000..eb2ea386
--- /dev/null
+++ b/src/TensorFlowNET.Core/Framework/random_seed.py.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Tensorflow
+{
+ public class random_seed
+ {
+ public static (int?, int?) get_seed(int? op_seed = null)
+ {
+ return (null, null);
+ }
+ }
+}
diff --git a/src/TensorFlowNET.Core/Graphs/Graph.cs b/src/TensorFlowNET.Core/Graphs/Graph.cs
index a926a57f..79e9fbe5 100644
--- a/src/TensorFlowNET.Core/Graphs/Graph.cs
+++ b/src/TensorFlowNET.Core/Graphs/Graph.cs
@@ -141,10 +141,9 @@ namespace Tensorflow
}
if (String.IsNullOrEmpty(name))
- {
name = op_type;
- }
-
+ // If a names ends with a '/' it is a "name scope" and we use it as-is,
+ // after removing the trailing '/'.
name = name.EndsWith("/") ? ops._name_from_scope_name(name) : unique_name(name);
var node_def = ops._NodeDef(op_type, name, device: "", attrs: attrs);
diff --git a/src/TensorFlowNET.Core/Operations/OpDefLibrary.cs b/src/TensorFlowNET.Core/Operations/OpDefLibrary.cs
index 76dd318a..62b4821a 100644
--- a/src/TensorFlowNET.Core/Operations/OpDefLibrary.cs
+++ b/src/TensorFlowNET.Core/Operations/OpDefLibrary.cs
@@ -14,7 +14,7 @@ namespace Tensorflow
{
public Operation _apply_op_helper(string op_type_name, string name = "", dynamic args = null)
{
- var keywords = ConvertToDict(args);
+ Dictionary keywords = ConvertToDict(args);
var g = ops.get_default_graph();
var op_def = g.GetOpDef(op_type_name);
@@ -42,7 +42,8 @@ namespace Tensorflow
var attrs = new Dictionary();
var inputs = new List();
var input_types = new List();
-
+ dynamic values = null;
+
return Python.with(new ops.name_scope(name), scope =>
{
var inferred_from = new Dictionary();
@@ -53,7 +54,17 @@ namespace Tensorflow
foreach (var input_arg in op_def.InputArg)
{
var input_name = input_arg.Name;
- var values = keywords[input_name];
+
+ if (keywords.ContainsKey(input_name))
+ values = keywords[input_name];
+ else if (keywords.ContainsKey(input_name + "_"))
+ {
+ input_name += "_";
+ values = keywords[input_name];
+ }
+ else
+ throw new TypeError("No argument for input " + input_name);
+
// Goals:
// * Convert values to Tensors if it contains constants.
// * Verify that values is a list if that matches the input_arg's
@@ -92,8 +103,8 @@ namespace Tensorflow
values = ops.internal_convert_n_to_tensor(values,
name: input_arg.Name,
- dtype: dtype,
- preferred_dtype: default_dtype,
+ dtype: dtype.as_tf_dtype(),
+ preferred_dtype: default_dtype.as_tf_dtype(),
as_ref: input_arg.IsRef);
}
else
@@ -107,9 +118,9 @@ namespace Tensorflow
values = ops.internal_convert_to_tensor(values,
name: input_name,
- dtype: dtype,
+ dtype: dtype.as_tf_dtype(),
as_ref: input_arg.IsRef,
- preferred_dtype: default_dtype);
+ preferred_dtype: default_dtype.as_tf_dtype());
//if (!String.IsNullOrEmpty(input_arg.TypeAttr))
//attrs[input_arg.TypeAttr] = values.dtype;
diff --git a/src/TensorFlowNET.Core/Operations/array_ops.py.cs b/src/TensorFlowNET.Core/Operations/array_ops.py.cs
index 28ff42cf..40e9f38f 100644
--- a/src/TensorFlowNET.Core/Operations/array_ops.py.cs
+++ b/src/TensorFlowNET.Core/Operations/array_ops.py.cs
@@ -7,6 +7,8 @@ namespace Tensorflow
{
public class array_ops
{
+ public static Tensor placeholder_with_default(T input, int[] shape, string name = "") => gen_array_ops.placeholder_with_default(input, shape, name);
+
public static Tensor zeros(Shape shape, TF_DataType dtype = TF_DataType.TF_FLOAT, string name = "")
{
dtype = dtype.as_base_dtype();
@@ -35,13 +37,13 @@ namespace Tensorflow
var nd = np.zeros(shape);
if (shape.Size < 1000)
{
- return constant_op.constant(nd, name);
+ return constant_op.constant(nd, name: name);
}
else
{
tShape = constant_op._tensor_shape_tensor_conversion_function(shape.as_shape());
var c = constant_op.constant(0);
- return gen_array_ops.fill(tShape, c, name);
+ return gen_array_ops.fill(tShape, c, name: name);
}
}
@@ -99,7 +101,7 @@ namespace Tensorflow
if (optimize && input_shape.is_fully_defined())
{
var nd = np.array(input_tensor.shape, out_type.as_numpy_datatype());
- return constant_op.constant(nd, name);
+ return constant_op.constant(nd, name: name);
}
}
@@ -122,7 +124,7 @@ namespace Tensorflow
if (input_shape.is_fully_defined())
{
var nd = np.array(input_tensor.shape, out_type.as_numpy_datatype());
- return constant_op.constant(nd, name);
+ return constant_op.constant(nd, name: name);
}
}
diff --git a/src/TensorFlowNET.Core/Operations/gen_array_ops.cs b/src/TensorFlowNET.Core/Operations/gen_array_ops.cs
index b3a3e607..8bf345fc 100644
--- a/src/TensorFlowNET.Core/Operations/gen_array_ops.cs
+++ b/src/TensorFlowNET.Core/Operations/gen_array_ops.cs
@@ -113,7 +113,7 @@ namespace Tensorflow
///
///
///
- public static Tensor placeholder_with_default(T input, TensorShape shape, string name = "")
+ public static Tensor placeholder_with_default(T input, int[] shape, string name = "")
{
var _op = _op_def_lib._apply_op_helper("PlaceholderWithDefault", name, new { input, shape, name });
return _op.outputs[0];
diff --git a/src/TensorFlowNET.Core/Operations/gen_random_ops.py.cs b/src/TensorFlowNET.Core/Operations/gen_random_ops.py.cs
new file mode 100644
index 00000000..643e7d0a
--- /dev/null
+++ b/src/TensorFlowNET.Core/Operations/gen_random_ops.py.cs
@@ -0,0 +1,33 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Tensorflow
+{
+ public class gen_random_ops
+ {
+ public static OpDefLibrary _op_def_lib = new OpDefLibrary();
+
+ ///
+ /// Outputs random values from a normal distribution.
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static Tensor random_standard_normal(Tensor shape, TF_DataType dtype = TF_DataType.DtInvalid, int? seed = null, int? seed2 = null, string name = "")
+ {
+ if (!seed.HasValue)
+ seed = 0;
+ if (!seed2.HasValue)
+ seed2 = 0;
+
+ var _op = _op_def_lib._apply_op_helper("RandomStandardNormal", name: name,
+ args: new { shape, dtype, seed, seed2 });
+
+ return _op.outputs[0];
+ }
+ }
+}
diff --git a/src/TensorFlowNET.Core/Operations/math_ops.py.cs b/src/TensorFlowNET.Core/Operations/math_ops.py.cs
index ef273c49..1e78285a 100644
--- a/src/TensorFlowNET.Core/Operations/math_ops.py.cs
+++ b/src/TensorFlowNET.Core/Operations/math_ops.py.cs
@@ -6,6 +6,8 @@ namespace Tensorflow
{
public class math_ops
{
+ public static Tensor add(Tensor x, Tensor y, string name = "") => gen_math_ops.add(x, y, name);
+
public static Tensor cast(Tensor x, TF_DataType dtype = TF_DataType.DtInvalid, string name = "")
{
var base_type = dtype.as_base_dtype();
diff --git a/src/TensorFlowNET.Core/Operations/random_ops.py.cs b/src/TensorFlowNET.Core/Operations/random_ops.py.cs
new file mode 100644
index 00000000..3334a2d9
--- /dev/null
+++ b/src/TensorFlowNET.Core/Operations/random_ops.py.cs
@@ -0,0 +1,35 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Tensorflow
+{
+ public class random_ops
+ {
+ public static Tensor random_normal(int[] shape,
+ float mean = 0.0f,
+ float stddev = 1.0f,
+ TF_DataType dtype = TF_DataType.TF_FLOAT,
+ int? seed = null,
+ string name = "")
+ {
+ return Python.with(new ops.name_scope(name, "random_normal", new object[] { shape, mean, stddev }), scope =>
+ {
+ var shape_tensor = _ShapeTensor(shape);
+ var mean_tensor = ops.convert_to_tensor(mean, dtype: dtype, name: "mean");
+ var stddev_tensor = ops.convert_to_tensor(stddev, dtype: dtype, name = "stddev");
+ var (seed1, seed2) = random_seed.get_seed(seed);
+ var rnd = gen_random_ops.random_standard_normal(shape_tensor, dtype: dtype, seed: seed1, seed2: seed2);
+ var mul = rnd * stddev_tensor;
+ var value = math_ops.add(mul, mean_tensor, name: name);
+ return value;
+ });
+ }
+
+ private static Tensor _ShapeTensor(int[] shape)
+ {
+ return ops.convert_to_tensor(shape, name: "shape");
+ }
+ }
+}
+
diff --git a/src/TensorFlowNET.Core/Sessions/BaseSession.cs b/src/TensorFlowNET.Core/Sessions/BaseSession.cs
index 5a828029..8044e904 100644
--- a/src/TensorFlowNET.Core/Sessions/BaseSession.cs
+++ b/src/TensorFlowNET.Core/Sessions/BaseSession.cs
@@ -55,11 +55,19 @@ namespace Tensorflow
var subfeed_dtype = subfeed_t.dtype.as_numpy_datatype();
switch(subfeed.Value)
{
+ case float floatVal:
+ feed_dict_tensor[subfeed_t] = (NDArray)floatVal;
+ break;
+ case int intVal:
+ feed_dict_tensor[subfeed_t] = (NDArray)intVal;
+ break;
case string str:
- feed_dict_tensor[subfeed_t] = np.array(str);
- feed_map[subfeed_t.name] = new Tuple