文章目录

  • Internal Covariate Shift
  • 不加BN与加BN可视化对比
    • 第一层网络和最后一层的对比
    • 底中顶三层的变化对比
    • 最后三层的变化对比
    • 全部对比
  • 结论
  • 代码

本文注重对Internal_Covariate_Shift和Batch_Normalization的可视化。什么是Internal_Covariate_Shift和Batch_Normalization请参考Internal Covariate Shift与Normalization。

Internal Covariate Shift

参考网上的博文,个人理解如下:

  1. Covariate Shift指源空间和目标空间的输入分布不一致问题,因为是在神经网络的内部所以是Internal。
  2. 它容易造成造成网络每层输入数据不再遵循**“独立同分布”原则**,也就是神经网络各层输入分布不一致。具体有以下现象:
    • 网络顶层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的可视化相关推荐

  1. batch normalization

    20210702 深度学习中的五种归一化(BN.LN.IN.GN和SN)方法简介 https://blog.csdn.net/u013289254/article/details/99690730 h ...

  2. 【深度学习理论】(4) 权重初始化,Batch Normalization

    各位同学好,最近学习了CS231N斯坦福计算机视觉公开课,讲的太精彩了,和大家分享一下. 1. 权重初始化 1.1 相同的初始化权重 神经网络中的所有权重都能通过梯度下降和反向传播来优化和更新.现在问 ...

  3. 深度神经网络中的Batch Normalization介绍及实现

    之前在经典网络DenseNet介绍_fengbingchun的博客-CSDN博客_densenet中介绍DenseNet时,网络中会有BN层,即Batch Normalization,在每个Dense ...

  4. Batch Normalization的诅咒

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者:Sahil Uppal 编译:ronghuaiyang 导读 ...

  5. Batch Normalization——加速深度神经网络收敛利器

    https://www.toutiao.com/a6703399604613808648/ Batch Normalization Batch Normalization 提出自<Batch N ...

  6. Lesson 14.3 Batch Normalization综合调参实战

    Lesson 14.3 Batch Normalization综合调参实战   根据Lesson 14.2最后一部分实验结果不难看出,带BN层的模型并不一定比不带BN层模型效果好,要充分发挥BN层的效 ...

  7. Lesson 14.1 数据归一化与Batch Normalization理论基础

    Lesson 14.1 数据归一化与Batch Normalization理论基础   数据归一化是机器学习领域的一种对数据处理的常规方式.在传统机器学习领域,由于各特征的量纲不一致,可能出现建模过程 ...

  8. 【深度学习】Batch Normalization(BN)超详细解析

    单层视角 神经网络可以看成是上图形式,对于中间的某一层,其前面的层可以看成是对输入的处理,后面的层可以看成是损失函数.一次反向传播过程会同时更新所有层的权重W1,W2,-,WL,前面层权重的更新会改变 ...

  9. PyTorch框架学习十七——Batch Normalization

    PyTorch框架学习十七--Batch Normalization 一.BN的概念 二.Internal Covariate Shift(ICS) 三.BN的一个应用案例 四.PyTorch中BN的 ...

最新文章

  1. 遮罩,在指定元素上进行遮罩
  2. Kali Linux 64位安装WPS
  3. strcpy与面试官
  4. world wide patent search website
  5. springboot超详细教程_CG原画插画教程:超详细线稿教程
  6. Sharepoint学习笔记—DebugTroubleShooting--不同调试对象的Attach方式
  7. python学习---语法
  8. Lua笔记4 闭包、迭代器
  9. 论文笔记_SLAM_Review_Visual simultaneous localization and mapping: a survey
  10. 计算机组成原理学习记录-唐朔飞
  11. 使用联想Y460一键拯救系统
  12. SocketTool.exe 端口占用
  13. 揭秘:寻找水军组织,宝妈兼职月入3000+
  14. RecycleView实现像ViewPager一次滑一页效果
  15. 订单BOM、销售BOM、标准BOM
  16. 【Linux】Linux input子系统之Input event codes
  17. 陆奇也不能免AIGC这个「俗」
  18. 多功能跑步机外观及结构设计
  19. WSDL——Web Service Description Language
  20. 想要用Python写爬虫但是BeautifulSoup库出锅肿么办?

热门文章

  1. Creo导入电路板生成文件emn和emp-两种方式导入区分
  2. nodemon 被禁用的解决方案
  3. 单身模式(Singleton)
  4. 黄炎公开课发布:《MySQL中间件的性能测试》
  5. uniapp h5下载文件
  6. IDEA Maven Helper插件(详细使用教程)
  7. 分分钟解决eNSP故障——敲什么都是#号
  8. 关于AS遇到Unexpected error while executing: am start -n com.example.administrator.myqq/com.example.admi
  9. 最新的Angular 5 入门与提高
  10. 一键安装部署SSL(https)——腾讯云服务器提供