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

[Question]: error : 'Attempting to capture an EagerTensor without building a function.' #1118

Closed kojack14 closed 1 year ago

kojack14 commented 1 year ago

Description

Does anyone know anything about this error I'm encountering when using the fit method?

Below is this code that I used to generate the model:

public static IModel Conv1DAutoencoder(AICreateParameters aICreateParameters) // sequential model { List layers = new List(); var layer = keras.layers; var autoencoder = new Sequential(new SequentialArgs() { Name = "Conv1D_Model" });

        // Input layer
        var inputs = keras.Input(shape: new Shape(aICreateParameters.inputShape[0], aICreateParameters.inputShape[1]));
        autoencoder.add(inputs);
        // Encoder
        for (int i = 0; i < aICreateParameters.filters.Length; i++)
        {
            // Conv1D layers
            layers.Add(layer.Conv1D(aICreateParameters.filters[i], kernel_size: aICreateParameters.kernelSize[i], padding: "same", 
            activation: "relu", strides: 2));
            if (i < (aICreateParameters.filters.Length - 1))
            {
                layers.Add(layer.Dropout(aICreateParameters.dropout));
            }
        }

        // Decoder
        for (int i = aICreateParameters.filters.Length - 1; i >= 0; i--)
        {
            // Add the Upsampling layer followed by Conv1D layer to simulate Conv1DTranspose
            if( i < aICreateParameters.filters.Length - 1)
            {
                layers.Add(layer.UpSampling1D(size: 2));
            }
            layers.Add(layer.Conv1D(aICreateParameters.filters[i], kernel_size: aICreateParameters.kernelSize[i], padding: "same", 
            activation: "relu"));
            if (i > 0)
            {
                layers.Add(layer.Dropout(aICreateParameters.dropout));
            }
        }

        // Final output layer
        layers.Add(layer.UpSampling1D(size: 2));
        layers.Add(layer.Conv1D(aICreateParameters.inputShape[1], kernel_size: aICreateParameters.kernelSize[0], padding: 
        "same", activation: "sigmoid"));

        // Build the model
        foreach (var i in layers)
        {
            autoencoder.add(i);
        }

        // Show model summary
        autoencoder.summary();

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

        return autoencoder;
    }

Alternatives

No response

Wanglongzhi2001 commented 1 year ago

This error possibly because of the shape mismatch. For example, the input shape of some of your operations is wrong, or some operations inside the layer, such as matmul, receive the wrong input shape. Please check your code for shape mismatch. The reason for this confusing error message is that missing code to catch shape mismatch errors when matmul and I will revise it.

kojack14 commented 1 year ago

I got it, thanks. I am using a mixture of UpSampling1D and Conv1D to simulate a Conv1DTranspose , maybe this is causing the error on the decoder part. This is the original python code that I'm trying to implement using C# :

def make_model_conv1d(m): timesteps = parameters[m]['timesteps'] neurons = parameters[m]['neurons'] kernels = parameters[m]['kernels'] channels = fp['channels'] autoencoder = tf.keras.Sequential([ layers.InputLayer(input_shape=(timesteps,channels)), layers.Conv1D(neurons[0] ,kernel_size=kernels[0],activation=layers.LeakyReLU(), padding='same', strides=2), layers.Dropout(rate=0.3), layers.Conv1D(neurons[1] ,kernel_size=kernels[1],activation=layers.LeakyReLU(), padding='same', strides=2), layers.Conv1DTranspose(neurons[1] ,kernel_size=kernels[1], strides=2, activation =layers.LeakyReLU(), padding='same'), layers.Dropout(rate=0.3), layers.Conv1DTranspose(neurons[0] ,kernel_size=kernels[0], strides=2, activation=layers.LeakyReLU(), padding='same'), layers.Conv1DTranspose(channels ,kernel_size=kernels[0], padding='same') #strides=2, ]) autoencoder.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001), loss="mse", metrics=[tf.keras.metrics.RootMeanSquaredError(name='rmse')])

autoencoder.summary()

return autoencoder
Wanglongzhi2001 commented 1 year ago

You're welcome, I'll let you know when Conv1DTranspose is developed.