diff --git a/src/TensorFlowNET.Core/Keras/Engine/InputSpec.cs b/src/TensorFlowNET.Core/Keras/Engine/InputSpec.cs index d84c31e1..c4980e92 100644 --- a/src/TensorFlowNET.Core/Keras/Engine/InputSpec.cs +++ b/src/TensorFlowNET.Core/Keras/Engine/InputSpec.cs @@ -9,7 +9,7 @@ namespace Tensorflow.Keras.Engine /// public class InputSpec { - public int ndim; + public int? ndim; public int? min_ndim; Dictionary axes; @@ -18,7 +18,7 @@ namespace Tensorflow.Keras.Engine int? min_ndim = null, Dictionary axes = null) { - this.ndim = ndim.Value; + this.ndim = ndim; if (axes == null) axes = new Dictionary(); this.axes = axes; diff --git a/src/TensorFlowNET.Core/Keras/Layers/Dense.cs b/src/TensorFlowNET.Core/Keras/Layers/Dense.cs index 7bf63413..f27d0963 100644 --- a/src/TensorFlowNET.Core/Keras/Layers/Dense.cs +++ b/src/TensorFlowNET.Core/Keras/Layers/Dense.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Text; using Tensorflow.Keras.Engine; using Tensorflow.Operations.Activation; @@ -8,11 +9,13 @@ namespace Tensorflow.Keras.Layers { public class Dense : Tensorflow.Layers.Layer { - protected int uints; + protected int units; protected IActivation activation; protected bool use_bias; protected IInitializer kernel_initializer; protected IInitializer bias_initializer; + protected RefVariable kernel; + protected RefVariable bias; public Dense(int units, IActivation activation, @@ -21,7 +24,7 @@ namespace Tensorflow.Keras.Layers IInitializer kernel_initializer = null, IInitializer bias_initializer = null) : base(trainable: trainable) { - this.uints = units; + this.units = units; this.activation = activation; this.use_bias = use_bias; this.kernel_initializer = kernel_initializer; @@ -29,5 +32,28 @@ namespace Tensorflow.Keras.Layers this.supports_masking = true; this.input_spec = new InputSpec(min_ndim: 2); } + + protected override void build(TensorShape input_shape) + { + var last_dim = input_shape.Dimensions.Last(); + var axes = new Dictionary(); + axes[-1] = last_dim; + input_spec = new InputSpec(min_ndim: 2, axes: axes); + kernel = add_weight( + "kernel", + shape: new int[] { last_dim, units }, + initializer: kernel_initializer, + dtype: _dtype, + trainable: true); + if (use_bias) + bias = add_weight( + "bias", + shape: new int[] { units }, + initializer: bias_initializer, + dtype: _dtype, + trainable: true); + + built = true; + } } } diff --git a/src/TensorFlowNET.Core/Operations/Initializers/TruncatedNormal.cs b/src/TensorFlowNET.Core/Operations/Initializers/TruncatedNormal.cs index b4f7197b..ae639c8e 100644 --- a/src/TensorFlowNET.Core/Operations/Initializers/TruncatedNormal.cs +++ b/src/TensorFlowNET.Core/Operations/Initializers/TruncatedNormal.cs @@ -24,7 +24,7 @@ namespace Tensorflow.Operations.Initializers public Tensor call(TensorShape shape, TF_DataType dtype) { - throw new NotImplementedException(""); + return random_ops.truncated_normal(shape, mean, stddev, dtype : dtype, seed: seed); } public object get_config()