Я обучил автоэнкодеру для удаления шума из набора данных Handwritten-ditig-MNIST. И я извлек часть Encoder из моей модели (то есть график до слоя Conv_4). Теперь я хочу заморозить параметр, который был изучен во время обучения автоэнкодера для части Encoder, и добавить 2 полностью связанных слоя, каждый из которых имеет 64 узла, и последний слой, имеющий 10 узлов, чтобы я мог построить классификационную модель рукописного ди * 1003. * использование возможности извлечения характеристик уже обученного кодировщика. Итак, кто-нибудь, пожалуйста, помогите мне с тем, как добавить новые слои в уже обученный кодировщик и как заморозить параметры уже обученного кодировщика. Я добавляю свой код. Пожалуйста, помогите ... !!!
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from keras.datasets import mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()
noise_factor = 0.4
X_train_noisy = X_train + noise_factor * np.random.normal(loc=0.0, scale=1.0, size=X_train.shape)
X_test_noisy = X_test + noise_factor * np.random.normal(loc=0.0, scale=1.0, size=X_test.shape)
X_train_noisy = np.clip(X_train_noisy, 0., 1.)
X_test_noisy = np.clip(X_test_noisy, 0., 1.)
X_train = np.clip(X_train, 0., 1.)
X_test = np.clip(X_test, 0., 1.)
input_image = tf.keras.layers.Input((28, 28, 1))
x = tf.keras.layers.Conv2D(32, (3, 3), padding = "same", activation = "relu", name = "Conv_1")(input_image)
x = tf.keras.layers.MaxPool2D((2, 2), padding = "same", name = "MaxPool_1")(x)
x = tf.keras.layers.Conv2D(16, (3, 3), padding = "same", activation = "relu", name = "Conv_2")(x)
x = tf.keras.layers.MaxPool2D((2, 2), padding = "same", name = "MaxPool_2")(x)
x = tf.keras.layers.Conv2D(8, (3, 3), padding = "same", activation = "relu", name = "Conv_3")(x)
x = tf.keras.layers.MaxPool2D((2, 2), padding = "same", name = "MaxPool_3")(x)
x = tf.keras.layers.Conv2D(4, (3, 3), padding = "same", activation = "relu", name = "Conv_4")(x)
x = tf.keras.layers.Conv2DTranspose(4, (2, 2), strides = (2, 2), padding = 'same', name = "UpSampling_1")(x)
x = tf.keras.layers.Conv2D(8, (3, 3), padding = "same", activation = "relu", name = "Conv_5")(x)
x = tf.keras.layers.Conv2DTranspose(8, (2, 2), strides = (2, 2), padding = 'same', name = "UpSampling_2")(x)
x = tf.keras.layers.Conv2D(16, (3, 3), padding = "valid", activation = "relu", name = "Conv_6")(x)
x = tf.keras.layers.Conv2DTranspose(16, (2, 2), strides = (2, 2), padding = 'same', name = "UpSampling_3")(x)
x = tf.keras.layers.Conv2D(32, (3, 3), padding = "same", activation = "relu", name = "Conv_7")(x)
output = tf.keras.layers.Conv2D(1, (3, 3), padding = "same", activation = "sigmoid", name = "Conv_8")(x)
model = tf.keras.Model(inputs = [input_image], outputs = [output])
model.summary()
tf.keras.utils.plot_model(model,to_file='model.png',show_shapes=True,show_layer_names=True,rankdir='TB',expand_nested=False,dpi=96)
model.compile(optimizer = "adam", loss = "binary_crossentropy", metrics = ["accuracy"])
checkpointer = tf.keras.callbacks.ModelCheckpoint("Model.h5", verbose = 1, save_best_only = True)
callbacks = [
tf.keras.callbacks.EarlyStopping(patience = 2, monitor = "val_loss"),
tf.keras.callbacks.TensorBoard(log_dir = "logs"),
checkpointer
]
X_train_noisy = np.reshape(X_train_noisy, (60000, 28, 28, 1))
X_train = np.reshape(X_train, (60000, 28, 28, 1))
X_test_noisy = np.reshape(X_test_noisy, (len(X_test_noisy), 28, 28, 1))
result = model.fit(X_train_noisy, X_train, batch_size = 128, epochs = 25, callbacks = callbacks, validation_split = 0.1)
X_train_pred = model.predict(X_train_noisy)
X_test_pred = model.predict(X_test_noisy)
encoder = tf.keras.Model(model.input, model.layers[7].output)
encoder.summary()
tf.keras.utils.plot_model(encoder,to_file='Encoder.png',show_shapes=True,show_layer_names=True,rankdir='TB',expand_nested=False,dpi=96)