3.6.2 非线性可分学习过程
[1]:
import warnings
warnings.simplefilter("ignore")
导入功能模块
[2]:
import sys
load_dataset_module_path = '../../'
sys.path.append(load_dataset_module_path)
from load_hyperspectral_dataset import (load_hyperspectral_data, y_labels,
extract_features,
plot_selected_categories,
plot_decision_function)
[3]:
#%matplotlib inline
#%matplotlib notebook
#%config InlineBackend.figure_format = 'retina'
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib import cm
from sklearn.utils import shuffle
import seaborn as sns
from ipywidgets import interact_manual
mpl.style.use('ggplot')
加载数据集
[4]:
img_file_path = '../../Hyperspectral_Project/dc.tif'
label_file_path = '../../Hyperspectral_Project/dctest.project'
raw_X, raw_y, pixel_position = load_hyperspectral_data(img_file_path,
label_file_path)
hyperspectral_df = extract_features(raw_X, raw_y)
画出指定类别,训练模型分类
[5]:
cmap = sns.diverging_palette(200,20,sep=20,as_cmap=True)
[5]:
selected_categories = ['Roofs', 'Path']
[7]:
from sklearn.neural_network import MLPClassifier
model = MLPClassifier(
hidden_layer_sizes=(200, 200, 200),
alpha=1e-6,
tol=1e-8,
learning_rate='adaptive',
n_iter_no_change=100,
learning_rate_init=1e-3,
beta_1=0.99,
max_iter=1000,
batch_size=512,
random_state=7,
early_stopping=False,
warm_start=True
)
selected_features, selected_target = plot_selected_categories(
hyperspectral_df,
seleted_features=['MNDWI', 'NDBI'],
selected_categories=selected_categories,
s=10)
plt.xlim(0.65, 0.80)
plt.ylim(-0.74, -0.66)
ax = plt.gca()
ax.set_aspect(1.5)
plt.grid(b=False)
model.fit(selected_features, selected_target)
plot_decision_function(model, cmap, normalization_range=[0, 1])
plt.savefig(f'mlp_{selected_categories[0]}_{selected_categories[1]}.pdf',
bbox_inches='tight')
绘制训练损失曲线
[16]:
plt.plot(range(len(model.loss_curve_)),model.loss_curve_,label='Training loss')
plt.legend()
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('Training Loss Curve')
plt.savefig(f'mlp_{selected_categories[0]}_{selected_categories[1]}_training_loss_curve.pdf',
bbox_inches='tight')
MLP不同训练周期分类边界可视化,保存为GIF动图
[5]:
from sklearn.neural_network import MLPClassifier
model = MLPClassifier(
hidden_layer_sizes=(200, 200, 200),
alpha=1e-6,
tol=1e-8,
learning_rate='adaptive',
n_iter_no_change=20,
learning_rate_init=1e-3,
beta_1=0.99,
max_iter=1,
batch_size=512,
random_state=7,
early_stopping=False,
warm_start=True
)
[2]:
n_iter = 1000
[9]:
n_iter = 1000
for i in range(n_iter):
selected_features, selected_target = plot_selected_categories(
hyperspectral_df,
seleted_features=['MNDWI', 'NDBI'],
selected_categories=selected_categories,
s=10)
plt.xlim(0.65, 0.80)
plt.ylim(-0.74, -0.66)
ax = plt.gca()
ax.set_aspect(1.5)
ax.set_title(f'Epoch {i:>4d}')
plt.grid(b=False)
model.partial_fit(selected_features, selected_target,classes=selected_categories)
plot_decision_function(model, cmap, normalization_range=[0, 1])
plt.savefig(f'n_iter/mlp_{selected_categories[0]}_{selected_categories[1]}_{i}.jpg',dpi=100,
bbox_inches='tight',quality=90)
[7]:
import imageio
[9]:
file_names = [
f'n_iter/mlp_{selected_categories[0]}_{selected_categories[1]}_{i}.jpg'
for i in range(0,n_iter,2)
]
frames = []
for image_name in file_names:
frames.append(imageio.imread(image_name))
imageio.mimsave(
f'training_mlp_{selected_categories[0]}_{selected_categories[1]}_2.gif',
frames,
'GIF',
duration=0.01)
[ ]: