Неправильная конфигурация сети - PullRequest
0 голосов
/ 07 ноября 2019

Я новичок в Keras и Tensorflow. Я безуспешно пытаюсь изменить этот урок для Python (с которым я совсем не знаком);Я сформулировал следующий фрагмент кода.

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 Ответ

2 голосов
/ 07 ноября 2019

Если 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 вместо последовательной модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...