SciSharp / TensorFlow.NET

.NET Standard bindings for Google's TensorFlow for developing, training and deploying Machine Learning models in C# and F#.
https://scisharp.github.io/tensorflow-net-docs
Apache License 2.0
3.17k stars 507 forks source link

[BUG Report]: load LSTM model: Tensorflow.ValueError: "The tensor input_1:0 at layer l_s_t_m is part of a cycle." #1127

Closed Copot777 closed 11 months ago

Copot777 commented 1 year ago

Description

keras.models.load_model(...) throws

Tensorflow.ValueError: The tensor input_1:0 at layer l_s_t_m is part of a cycle. at Tensorflow.Keras.Engine.Functional.BuildMapHelper(Tensor tensor, List1 finished_nodes, List1 nodes_in_progress, List1 nodes_in_decreasing_depth, Dictionary2 layer_indices) at Tensorflow.Keras.Engine.Functional.BuildMapHelper(Tensor tensor, List1 finished_nodes, List1 nodes_in_progress, List1 nodes_in_decreasing_depth, Dictionary2 layer_indices) at Tensorflow.Keras.Engine.Functional.BuildMap(Tensors outputs) at Tensorflow.Keras.Engine.Functional.MapGraphNetwork(Tensors inputs, Tensors outputs) at Tensorflow.Keras.Engine.Functional._init_graph_network(Tensors inputs, Tensors outputs) at Tensorflow.Keras.Engine.Sequential.add(ILayer layer) at Tensorflow.Keras.Engine.Sequential.InitLayers(IEnumerable1 layers) at Tensorflow.Keras.Saving.KerasObjectLoader._reconstruct_model(Int32 model_id, Model model, List1 layers) at Tensorflow.Keras.Saving.KerasObjectLoader._reconstruct_all_models() at Tensorflow.Keras.Saving.KerasObjectLoader.finalize_objects() at Tensorflow.Keras.Saving.SavedModel.KerasLoadModelUtils.load(String path, Boolean compile, LoadOptions options) at Tensorflow.Keras.Saving.SavedModel.KerasLoadModelUtils.load_model(String filepath, IDictionary`2 custom_objects, Boolean compile, LoadOptions options) at Tensorflow.Keras.Models.ModelsApi.load_model(String filepath, Boolean compile, LoadOptions options)

Reproduction Steps

This is a code fragment reproducing the issue.

var inputs = tf.random.normal(shape: (10, 5, 3));
var outputs = tf.random.normal(shape: (10, 1));
var model = keras.Sequential();

        model.add(keras.Input(shape: (5, 3)));
        var lstm = keras.layers.LSTM(32);

        model.add(lstm);

        model.add(keras.layers.Dense(1, keras.activations.Sigmoid));

        model.compile(optimizer: keras.optimizers.Adam(),
                    loss: keras.losses.MeanSquaredError(),
                    new[] { "accuracy" });

        var result = model.fit(inputs.numpy(), outputs.numpy(), batch_size: 10, epochs: 50, workers: 16, use_multiprocessing: true);
        model.summary();

        model.save("LSTM_Random");

        var model_loaded = keras.models.load_model("LSTM_Random");

Known Workarounds

None I can find so far. But Model.LoadModel(...) with LSTM from Keras.NET works fine

       var inputs = np.random.randn(10, 5, 3);            
        var outputs = np.random.randn(10, 1);

        var model = new Sequential();

        model.Add(new Input(shape: (5, 3)));
        var lstm = new LSTM(32);

        model.Add(lstm);
        model.Add(new Dense(1, activation: "sigmoid"));

        model.Compile(optimizer: "adam", loss: "mse", metrics: new string[] { "accuracy" });

        var result = model.Fit(inputs, outputs, batch_size: 10, epochs: 50);
        model.Summary();

        model.Save("LSTM_Random");
        var model_laoded = Model.LoadModel("LSTM_Random");

        double[] eval = model_laoded.Evaluate(inputs, outputs);

        NDarray ndpred = model_laoded.Predict(inputs);
        Console.WriteLine(ndpred);

Configuration and Other Information

.NET 6.0 TensorFlow.NET 0.110.0 TensoFlow.Keras 0.11.0 SciSharp.TensorFlow.Redist CPU 2.14.0

Wanglongzhi2001 commented 1 year ago

I'm sorry, because there are cells in the LSTM, the performance of the load_model is not quite the same as other models, so the load of the LSTM model has not been completed yet.

Wanglongzhi2001 commented 1 year ago

Hello, this bug has been resolved and has been merged into the master branch.