Как заморозить вес Encoder, извлеченный из CNE AutoEncoder, и добавить несколько обучаемых полностью связанных слоев? - PullRequest
0 голосов
/ 25 февраля 2020

Я обучил автоэнкодеру для удаления шума из набора данных 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)
...