forked from SciSharp/TensorFlow.NET
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDense.cs
More file actions
57 lines (55 loc) · 1.89 KB
/
Dense.cs
File metadata and controls
57 lines (55 loc) · 1.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using Tensorflow;
using static Keras.Keras;
using Keras;
using NumSharp;
using Tensorflow.Operations.Activation;
namespace Keras.Layers
{
public class Dense : ILayer
{
RefVariable W;
int units;
TensorShape WShape;
string name;
IActivation activation;
public Dense(int units, string name = null, IActivation activation = null)
{
this.activation = activation;
this.units = units;
this.name = (string.IsNullOrEmpty(name) || string.IsNullOrWhiteSpace(name))?this.GetType().Name + "_" + this.GetType().GUID:name;
}
public ILayer __build__(TensorShape input_shape, int seed = 1, float stddev = -1f)
{
Console.WriteLine("Building Layer \"" + name + "\" ...");
if (stddev == -1)
stddev = (float)(1 / Math.Sqrt(2));
var dim = input_shape.Dimensions;
var input_dim = dim[dim.Length - 1];
W = tf.Variable(create_tensor(new int[] { input_dim, units }, seed: seed, stddev: (float)stddev));
WShape = new TensorShape(W.shape);
return this;
}
public Tensor __call__(Tensor x)
{
var dot = tf.matmul(x, W);
if (this.activation != null)
dot = activation.Activate(dot);
Console.WriteLine("Calling Layer \"" + name + "(" + np.array(dot.GetShape().Dimensions).ToString() + ")\" ...");
return dot;
}
public TensorShape __shape__()
{
return WShape;
}
public TensorShape output_shape(TensorShape input_shape)
{
var output_shape = input_shape.Dimensions;
output_shape[output_shape.Length - 1] = units;
return new TensorShape(output_shape);
}
}
}