Введение
В этом практическом занятии показано, как использовать Kernel PCA для удаления шума из изображений. В основе лежит идея обучения базиса PCA на основе шум-free изображений и использования его для реконструкции и удаления шума из шумных изображений. Для этого используется набор данных цифр USPS.
Советы по использованию ВМ
После запуска ВМ нажмите в левом верхнем углу, чтобы переключиться на вкладку Notebook и получить доступ к Jupyter Notebook для практики.
Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook не загрузится полностью. Проверка операций не может быть автоматизирована из-за ограничений Jupyter Notebook.
Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.
Загрузка набора данных через OpenML
Мы загружаем набор данных цифр USPS с использованием функции fetch_openml() из scikit-learn. Затем данные нормализуются с использованием MinMaxScaler().
import numpy as np
from sklearn.datasets import fetch_openml
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
X, y = fetch_openml(data_id=41082, as_frame=False, return_X_y=True, parser="pandas")
X = MinMaxScaler().fit_transform(X)
Создание обучающих и тестовых наборов
Мы разделяем набор данных на обучающий набор из 1000 образцов и тестовый набор из 100 образцов. Добавляем гауссовский шум к тестовому набору и создаем две копии исходных данных: одну с шумом и одну без шума.
X_train, X_test, y_train, y_test = train_test_split(
X, y, stratify=y, random_state=0, train_size=1_000, test_size=100
)
rng = np.random.RandomState(0)
noise = rng.normal(scale=0.25, size=X_test.shape)
X_test_noisy = X_test + noise
noise = rng.normal(scale=0.25, size=X_train.shape)
X_train_noisy = X_train + noise
Построение графиков тестовых изображений
Мы определяем вспомогательную функцию для построения графиков тестовых изображений. Мы используем эту функцию для построения графиков не искаженных и шумных тестовых изображений.
import matplotlib.pyplot as plt
def plot_digits(X, title):
fig, axs = plt.subplots(nrows=10, ncols=10, figsize=(8, 8))
for img, ax in zip(X, axs.ravel()):
ax.imshow(img.reshape((16, 16)), cmap="Greys")
ax.axis("off")
fig.suptitle(title, fontsize=24)
plot_digits(X_test, "Uncorrupted test images")
plot_digits(
X_test_noisy, f"Noisy test images\nMSE: {np.mean((X_test - X_test_noisy) ** 2):.2f}"
)
Обучение базиса PCA
Мы обучаем базис PCA с использованием как линейного PCA, так и kernel PCA. Kernel PCA использует ядро радиальной базисной функции (RBF), чтобы обучить базис.
from sklearn.decomposition import PCA, KernelPCA
pca = PCA(n_components=32, random_state=42)
kernel_pca = KernelPCA(
n_components=400,
kernel="rbf",
gamma=1e-3,
fit_inverse_transform=True,
alpha=5e-3,
random_state=42,
)
pca.fit(X_train_noisy)
_ = kernel_pca.fit(X_train_noisy)
реконструкция и удаление шума из тестовых изображений
Мы преобразуем и реконструируем шумный тестовый набор с использованием как PCA, так и kernel PCA. Затем мы строим графики реконструированных изображений, чтобы сравнить результаты.
X_reconstructed_kernel_pca = kernel_pca.inverse_transform(
kernel_pca.transform(X_test_noisy)
)
X_reconstructed_pca = pca.inverse_transform(pca.transform(X_test_noisy))
plot_digits(X_test, "Uncorrupted test images")
plot_digits(
X_reconstructed_pca,
f"PCA reconstruction\nMSE: {np.mean((X_test - X_reconstructed_pca) ** 2):.2f}",
)
plot_digits(
X_reconstructed_kernel_pca,
(
"Kernel PCA reconstruction\n"
f"MSE: {np.mean((X_test - X_reconstructed_kernel_pca) ** 2):.2f}"
),
)
Обзор
В этом практическом занятии мы узнали, как использовать Kernel PCA для удаления шума из изображений. Мы использовали набор данных цифр USPS, чтобы продемонстрировать процесс. Мы обучили базис PCA на изображениях без шума и использовали его для реконструкции и удаления шума из шумных изображений. Мы сравнили результаты как линейного PCA, так и kernel PCA, и обнаружили, что kernel PCA более эффективен в удалении фонового шума и обеспечении более гладких изображений. Однако мы должны быть осторожны при выборе соответствующих значений для n_components, gamma и alpha.