The results of the autoencoder code's functional API (my implemention) are different from the results of Sequential (example code in the textbook)

41 views Asked by At

In ch17 of the textbook 'hands on machine learning' by Aurélien Geron, the results of the functional API of the autoencoder code (which I implemented myself) are different from the results of Sequential (example code in the textbook).

The code below is an example code from Textbook ch17.

# https://github.com/ageron/handson-ml3/blob/main/17_autoencoders_gans_and_diffusion_models.ipynb
import tensorflow as tf

tf.random.set_seed(42)  # extra code – ensures reproducibility on CPU

encoder = tf.keras.Sequential([tf.keras.layers.Dense(2)])
decoder = tf.keras.Sequential([tf.keras.layers.Dense(3)])
autoencoder = tf.keras.Sequential([encoder, decoder])

optimizer = tf.keras.optimizers.SGD(learning_rate=0.5)
autoencoder.compile(loss="mse", optimizer=optimizer)

import numpy as np
from scipy.spatial.transform import Rotation

m = 60
X = np.zeros((m, 3))  # initialize 3D dataset
np.random.seed(42)
angles = (np.random.rand(m) ** 3 + 0.5) * 2 * np.pi  # uneven distribution
X[:, 0], X[:, 1] = np.cos(angles), np.sin(angles) * 0.5  # oval
X += 0.28 * np.random.randn(m, 3)  # add more noise
X = Rotation.from_rotvec([np.pi / 29, -np.pi / 20, np.pi / 4]).apply(X)
X_train = X + [0.2, 0, 0.2]  # shift a bit

history = autoencoder.fit(X_train, X_train, epochs=500, verbose=False)
codings = encoder.predict(X_train)

fig = plt.figure(figsize=(4,3))
plt.plot(codings[:,0], codings[:, 1], "b.")
plt.xlabel("$z_1$", fontsize=18)
plt.ylabel("$z_2$", fontsize=18, rotation=0)
plt.grid(True)
save_fig("linear_autoencoder_pca_plot")
plt.show()

[![linear_autoencoder_pca_plot](https://i.stack.imgur.com/bN2VI.png)](https://i.stack.imgur.com/bN2VI.png)

The code below is my conversion of this example code into a functional API.

from tensorflow.keras.layers import Dense
from tensorflow.keras import Input, Model
input1 = Input(shape=3)
x = Dense(2, activation='linear', name="intermediate")(input1)
x = Dense(3, activation='linear')(x)
model_autoencoder_funcAPI = Model(inputs=input1, outputs=x)
optimizer1 = tf.keras.optimizers.SGD(learning_rate=0.5)
model_autoencoder_funcAPI.compile(loss='mse', optimizer=optimizer1)
history_funcAPI = model_autoencoder_funcAPI.fit(X_train, X_train, epochs=501)
layer_name = 'intermediate'
intermediate_layer_model = Model(inputs=input1, outputs=model_autoencoder_funcAPI.get_layer(layer_name).output)
codings_autoencoder_funcAPI = intermediate_layer_model.predict(X_train)

fig = plt.figure(figsize=(4,3))
plt.plot(codings_autoencoder_funcAPI[:,0], codings_autoencoder_funcAPI[:, 1], "b.")
plt.xlabel("$z_1$", fontsize=18)
plt.ylabel("$z_2$", fontsize=18, rotation=0)
plt.grid(True)
save_fig("ch17_linear_autoencoder_pca_plot_funcAPI")
plt.show()
[![ch17_linear_autoencoder_pca_plot_funcAPI](https://i.stack.imgur.com/6uuat.png)](https://i.stack.imgur.com/6uuat.png)

The results of the two codes are different. Where is the problem?

Thank you.

When implemented with the functional API code, I expected the same results as the results of the Sequential code.

================================================================ Solved! Following user3128's advice, I added tf.random.set_seed(42) before building the model of the second code, and the result was the same as that of the first code.

0

There are 0 answers