网络配置错误

时间:2019-11-07 16:22:21

标签: c# tensorflow keras

我是Keras和Tensorflow的新手。我无法为Python重新塑造this tutorial的方式(我一点都不熟悉);我已经编写了以下代码片段。

var Functions = new int[] { 1, 2, 3, 4 };
var BatchSize = 64;
var InputDim = Functions.Count();
var OutputDim = 256;
var RnnUnits = 1024;

var iLayer1
  = new Embedding(InputDim,
                  OutputDim,
                  input_shape: new Shape(new int[] { BatchSize, 0 } ) );
var iLayer2
  = new GRU(RnnUnits,
            return_sequences: true,
            stateful: true, recurrent_initializer: "glorot_uniform");
var iLayer3 = new Dense(InputDim);

var iSequential = new Sequential();
iSequential.Add(iLayer1);
iSequential.Add(iLayer2);
iSequential.Add(iLayer3);

在编译时,我收到错误消息

Python.Runtime.PythonException:
"ValueError : Input 0 is incompatible with layer gru_1: expected ndim=3, found ndim=4"

何时

iSequential.Add(iLayer2);

被执行。从我的肤浅理解来看,这意味着iLayer1的配置方式使其无法与iLayer2一起操作,但是我不知道该怎么做。

编辑:经过一番混乱之后,我收到了错误消息

ValueError : slice index 0 of dimension 0 out of
bounds. for 'gru_1/strided_slice_10' (op: 'StridedSlice') with
input shapes: [0,64,256], [1], [1], [1] and with
computed input tensors: input[1] = <0>, input[2] = <1>, input[3] = <1>.

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

如果C#Keras使用与Python Keras相同的功能,则用于嵌入的输入形状不应包含批处理大小。

由于由于stateful: true而不得不使用批处理大小,因此需要使用batch_input_shape参数代替input_shape

我不确定那里的0。这是C#约定的可变长度吗?

错误是说第二层从上一层获得4D张量,而该张量应该是3D。

选项:

  • batch_input_shape: new Shape(new int[] { BatchSize, 0 } )
  • batch_shape: new Shape(new int[] { BatchSize, 0 } )
  • input_shape: new Shape(new int[] { 0 } ), batch_size: BatchSize

如果这些都不能在C#上运行,则必须尝试使用​​功能性API模型而不是顺序模型。