我是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>.
有什么想法吗?
答案 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模型而不是顺序模型。