Internal_Covariate_Shift现象以及Batch Normalization的可视化
文章目录
- 序
- Internal Covariate Shift
- 不加BN与加BN可视化对比
- 第一层网络和最后一层的对比
- 底中顶三层的变化对比
- 最后三层的变化对比
- 全部对比
- 结论
- 代码
序
本文注重对Internal_Covariate_Shift和Batch_Normalization的可视化。什么是Internal_Covariate_Shift和Batch_Normalization请参考Internal Covariate Shift与Normalization。
Internal Covariate Shift
参考网上的博文,个人理解如下:
- Covariate Shift指源空间和目标空间的输入分布不一致问题,因为是在神经网络的内部所以是Internal。
- 它容易造成造成网络每层输入数据不再遵循**“独立同分布”原则**,也就是神经网络各层输入分布不一致。具体有以下现象:
- 网络顶层Hidden Layers(靠近输出端)的输入剧烈变化,顶层需要不停地适应新的输入数据,收敛速度慢或者收敛。
- 调参时需要小心控制学习率。
- 对于初始化参数敏感。
说了这么多,还是可视化一下吧(整个Ipython的代码见最后或者附件)。我建立了一个环状二分类数据集,如下:
输入只有两维度,模型是11层的神经网络,网络调的比较窄为,学习率为Adam的默认学习率。在不加BN的情况下,模型有很多次,loss停在0.6932就不动了,也就是是难收敛。(当然用较宽的网络,还是很容易就收敛了)
不加BN与加BN可视化对比
在训练时,每个batch调整后的权重都保存了下来。然后计算每个batch间每层网络权重的差值的绝对值差的均值和标准差,并可视化出来。
以下可视化的截图是两个模型均收敛了。
第一层网络和最后一层的对比
不加BN
加入BN后:
底中顶三层的变化对比
不加BN
加入BN
最后三层的变化对比
不加BN,标准差和均值,如下:
加入BN后:
全部对比
不加入BN
加入BN
结论
由以上几幅图可见,与不加BN的变化图相比,加入BN后:每层间权重更新变化程度趋于一致,应该是BN起到了作用,使得每层输入分布比较趋向于服从**“独立同分布”**。BN确实起到了减缓ICS的作用。
代码
代码,不知道如何上传ipython,所以凑活看吧!:
# 目标观察 internal_covariate_shift现象- 制造一个同心圆环的二分类数据集
- 试试多层神经网络,然后保存每层的数据,并save下来
- 查看save数据的权重,然后看看每次调整后的效果# importerimport plotly.express as pximport numpy as np
import pandas as pdimport tensorflow as tf
import tensorflow.keras as kerasfrom sklearn.model_selection import train_test_split
from sklearn.utils import shufflefrom sklearn.metrics import f1_score, precision_score, recall_scorefrom sklearn.preprocessing import MinMaxScaler# 设置gpu内存自增长
gpus = tf.config.experimental.list_physical_devices('GPU')
print(gpus)
for gpu in gpus:tf.config.experimental.set_memory_growth(gpu, True)# 制造数据def circle(min_radius, max_radius):pointers = np.random.random((100000, 2)) * 2. - 1.radiuses = np.sqrt(np.sum(pointers * pointers, axis=1))target_pointers = pointers[(min_radius <= radiuses) & (radiuses <= max_radius), :]return target_pointers[:3600]mtx_a = circle(0.2, 0.3)
a_y = np.ones((mtx_a.shape[0]), dtype=np.int)mtx_b = circle(0.4, 0.5)
b_y = np.zeros((mtx_b.shape[0]), dtype=np.int)mtx_c = circle(0.7, 0.8)
c_y = np.ones((mtx_c.shape[0]), dtype=np.int)mtx_d = circle(0.9, 1.0)
d_y = np.zeros((mtx_d.shape[0]), dtype=np.int)y = np.hstack((a_y, b_y, c_y, d_y))
X = np.vstack((mtx_a, mtx_b, mtx_c, mtx_d))X, y = shuffle(X, y)X.shape, y.shapemtx_a.shape, mtx_b.shape, mtx_c.shape, mtx_d.shape## showx1 = X[:, 0]
x2 = X[:, 1]px.scatter(x=x1[:1000], y=x2[:1000], color=y[:1000], width=400, height=400)## train, val, test数据train_X, val_X, tra_y, val_y = train_test_split(X, y)
train_X, test_X, tra_y, test_y = train_test_split(train_X, tra_y)train_dataset = tf.data.Dataset.from_tensor_slices((train_X, tra_y)).shuffle(10000).batch(64)
val_dataset = tf.data.Dataset.from_tensor_slices((val_X, val_y)).shuffle(10000).batch(64)
test_dataset = tf.data.Dataset.from_tensor_slices((test_X, test_y)).shuffle(10000).batch(64)# 训练一下def get_model_layer_weight_mtx(model):def W_b(layer):W = layer.weights[0].numpy()b = layer.weights[1].numpy()return W, bW = [W_b(lay)[0] for lay in model.layers if lay.weights]b = [W_b(lay)[1] for lay in model.layers if lay.weights]return np.array(W), np.array(b)def generate_model():dense_units = 7inputs = keras.layers.Input((2,))dense1 = keras.layers.Dense(dense_units, activation="relu")(inputs)dense2 = keras.layers.Dense(dense_units, activation="relu")(dense1)dense3 = keras.layers.Dense(dense_units, activation="relu")(dense2)dense4 = keras.layers.Dense(dense_units, activation="relu")(dense3)dense5 = keras.layers.Dense(dense_units, activation="relu")(dense4)dense6 = keras.layers.Dense(dense_units, activation="relu")(dense5)dense7 = keras.layers.Dense(dense_units, activation="relu")(dense6)dense8 = keras.layers.Dense(dense_units, activation="relu")(dense7)dense9 = keras.layers.Dense(dense_units, activation="relu")(dense8)dense10 = keras.layers.Dense(dense_units, activation="relu")(dense9)dense11 = keras.layers.Dense(dense_units, activation="relu")(dense10)outputs = keras.layers.Dense(1, activation="sigmoid")(dense11)return keras.Model(inputs, outputs)del modelimport gcgc.collect()model = generate_model()
model.compile(optimizer=keras.optimizers.Adam(0.001), loss=keras.losses.BinaryCrossentropy(), metrics=["AUC", "Recall", "Precision"])model.build(input_shape=(2,))
init_W, init_b = get_model_layer_weight_mtx(model)model_cpt = keras.callbacks.ModelCheckpoint("./model/circle_{epoch}_{batch}", save_weights_only=True, save_freq=3)history = model.fit(train_dataset, epochs=10, validation_data=test_dataset, callbacks=[model_cpt])# metricstest_pred_y = model.predict(test_X)[:, 0] > 0.4999999test_pred_yf1_score(test_y, test_pred_y), precision_score(test_y, test_pred_y), recall_score(test_y, test_pred_y)# 观察ICS现象## 观察每层参数,每次更新间改变的大小star_W, start_b = init_W, init_bnew_model = generate_model()
new_model.compile(optimizer="adam", loss=keras.losses.BinaryCrossentropy(), metrics=["AUC", "Recall", "Precision"])
new_model.build(input_shape=(2,))def diff(m1, m2):m = len(m1)mean = [np.mean(np.absolute(m1[i] - m2[i])) for i in range(m)]std = [np.std(np.absolute(m1[i] - m2[i])) for i in range(m)]return mean, stdepochs = 10
batchs = 127error_W_mean = []
error_W_std = []
error_b_mean = []
error_b_std = []start_W, start_b = init_W, init_b
index = 0
for epc in range(epochs):print(epc+1)for btc in range(0, batchs, 10):_ = new_model.load_weights(f"model/circle_{epc+1}_{btc}")tmp_W, tmp_b = get_model_layer_weight_mtx(new_model)diff_W_mean, diff_W_std = diff(start_W, tmp_W)error_W_mean.append(diff_W_mean)error_W_std.append(diff_W_std)diff_b_mean, diff_b_std = diff(start_b, tmp_b)error_b_mean.append(diff_b_mean)error_b_std.append(diff_b_std)index += 1start_W, start_b = tmp_W, tmp_berror_W_mean_arr = np.array(error_W_mean)
np.save("./data/non_BN_error_W_mean.npy", error_W_mean_arr)error_W_var_arr = np.array(error_W_std)
np.save("./data/non_BN_error_W_var.npy", error_W_var_arr)error_b_mean_arr = np.array(error_b_mean)
np.save("./data/non_BN_error_W_mean.npy", error_W_mean_arr)error_b_var_arr = np.array(error_b_std)
np.save("./data/non_BN_error_b_var.npy", error_b_var_arr)mms = MinMaxScaler()
scaled_W_var = mms.fit_transform(error_W_var_arr)
px.line(y=[scaled_W_std[[j for j in range(0, 127)], i] for i in [0, 5, 14, 18]], width=1000, height=500)mms = MinMaxScaler()
scaled_W_mean = mms.fit_transform(error_W_mean_arr)
px.line(y=[scaled_W_mean[[j for j in range(0, 127)], i] for i in [0, 5, 14, 15, 16, 17, 18]], width=1000, height=500)
Internal_Covariate_Shift现象以及Batch Normalization的可视化相关推荐
- batch normalization
20210702 深度学习中的五种归一化(BN.LN.IN.GN和SN)方法简介 https://blog.csdn.net/u013289254/article/details/99690730 h ...
- 【深度学习理论】(4) 权重初始化,Batch Normalization
各位同学好,最近学习了CS231N斯坦福计算机视觉公开课,讲的太精彩了,和大家分享一下. 1. 权重初始化 1.1 相同的初始化权重 神经网络中的所有权重都能通过梯度下降和反向传播来优化和更新.现在问 ...
- 深度神经网络中的Batch Normalization介绍及实现
之前在经典网络DenseNet介绍_fengbingchun的博客-CSDN博客_densenet中介绍DenseNet时,网络中会有BN层,即Batch Normalization,在每个Dense ...
- Batch Normalization的诅咒
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者:Sahil Uppal 编译:ronghuaiyang 导读 ...
- Batch Normalization——加速深度神经网络收敛利器
https://www.toutiao.com/a6703399604613808648/ Batch Normalization Batch Normalization 提出自<Batch N ...
- Lesson 14.3 Batch Normalization综合调参实战
Lesson 14.3 Batch Normalization综合调参实战 根据Lesson 14.2最后一部分实验结果不难看出,带BN层的模型并不一定比不带BN层模型效果好,要充分发挥BN层的效 ...
- Lesson 14.1 数据归一化与Batch Normalization理论基础
Lesson 14.1 数据归一化与Batch Normalization理论基础 数据归一化是机器学习领域的一种对数据处理的常规方式.在传统机器学习领域,由于各特征的量纲不一致,可能出现建模过程 ...
- 【深度学习】Batch Normalization(BN)超详细解析
单层视角 神经网络可以看成是上图形式,对于中间的某一层,其前面的层可以看成是对输入的处理,后面的层可以看成是损失函数.一次反向传播过程会同时更新所有层的权重W1,W2,-,WL,前面层权重的更新会改变 ...
- PyTorch框架学习十七——Batch Normalization
PyTorch框架学习十七--Batch Normalization 一.BN的概念 二.Internal Covariate Shift(ICS) 三.BN的一个应用案例 四.PyTorch中BN的 ...
最新文章
- 遮罩,在指定元素上进行遮罩
- Kali Linux 64位安装WPS
- strcpy与面试官
- world wide patent search website
- springboot超详细教程_CG原画插画教程:超详细线稿教程
- Sharepoint学习笔记—DebugTroubleShooting--不同调试对象的Attach方式
- python学习---语法
- Lua笔记4 闭包、迭代器
- 论文笔记_SLAM_Review_Visual simultaneous localization and mapping: a survey
- 计算机组成原理学习记录-唐朔飞
- 使用联想Y460一键拯救系统
- SocketTool.exe 端口占用
- 揭秘:寻找水军组织,宝妈兼职月入3000+
- RecycleView实现像ViewPager一次滑一页效果
- 订单BOM、销售BOM、标准BOM
- 【Linux】Linux input子系统之Input event codes
- 陆奇也不能免AIGC这个「俗」
- 多功能跑步机外观及结构设计
- WSDL——Web Service Description Language
- 想要用Python写爬虫但是BeautifulSoup库出锅肿么办?
热门文章
- Creo导入电路板生成文件emn和emp-两种方式导入区分
- nodemon 被禁用的解决方案
- 单身模式(Singleton)
- 黄炎公开课发布:《MySQL中间件的性能测试》
- uniapp h5下载文件
- IDEA Maven Helper插件(详细使用教程)
- 分分钟解决eNSP故障——敲什么都是#号
- 关于AS遇到Unexpected error while executing: am start -n com.example.administrator.myqq/com.example.admi
- 最新的Angular 5 入门与提高
- 一键安装部署SSL(https)——腾讯云服务器提供