[XTrain, YTrain] = japaneseVowelsTrainData;
lg = layerGraph();
lg = addLayers(lg, [
    sequenceInputLayer(12, "Name", "input")
    gruLayer( 100, 'OutputMode', 'sequence', ...
        "Name", "gru1")
    concatenationLayer(1, 2, "Name", "cat1")
    gruLayer( 100, 'OutputMode', 'last', ...
        "Name", "gru3")
    concatenationLayer(1, 2, "Name", "cat2")
    fullyConnectedLayer(9)
    softmaxLayer
    classificationLayer()] );
lg = addLayers( lg, [
    FlipLayer("flip1")
    gruLayer( 100, 'OutputMode', 'sequence', ...
        "Name", "gru2" )
    FlipLayer("flip2")] );
lg = addLayers(lg, [
    FlipLayer("flip3")
    gruLayer( 100, 'OutputMode', 'last', ...
        "Name", "gru4" )] );
lg = connectLayers(lg, "input", "flip1");
lg = connectLayers(lg, "flip2", "cat1/in2");
lg = connectLayers(lg, "cat1", "flip3");
lg = connectLayers(lg, "gru4", "cat2/in2");
options = trainingOptions('adam', 'Plots', 'training-progress');
net = trainNetwork(XTrain, YTrain, lg, options);
[XTest, YTest] = japaneseVowelsTestData;
YPred = classify(net, XTest);
accuracy = sum(YTest == YPred)/numel(YTest)