内核正则器如何在神经网络中发挥作用(附实例)

118 阅读7分钟

正则化是通过在误差参数中引入惩罚项来微调神经网络模型的过程,以获得一个最佳和可靠的模型,该模型在测试过程中以最小的损失收敛,对未见过的数据表现得更好。正则化帮助我们获得一个更加通用和可靠的模型,该模型在数据模式的变化和任何可能的不确定性方面功能良好。因此,在这篇文章中,让我们看看内核正则化器是如何与神经网络一起工作的,以及在神经网络的哪些层是有用的,以获得最佳神经网络。

目录

  1. 什么是内核正则化
  2. 内核正则化的必要性
  3. 内核正则化器与神经网络的案例研究
  4. 内核正则化与神经网络的主要成果
  5. 摘要

什么是内核正则化

正则化是指在网络层中加入惩罚因素,以改变通过层的权重传播,从而促进模型的最佳收敛的过程。主要有两种类型的惩罚可以在网络层上实施,它们被命名为L1正则化,考虑层的权重,而L2正则化考虑权重的平方。

你是否在寻找数据科学中使用的Python库的完整库:查看这里.

由于鲁棒性和最佳惩罚,L1正则化技术在神经网络中使用较多。正则化可以根据其需要分别应用于不同的层,其中内核正则化就是这样一种技术,惩罚项被添加到内核层中,这说明神经网络的权重中添加了惩罚项,而偏置成分保持不变。

核心正则化的必要性

神经网络对正则化技术的主要需求是防止复杂神经网络的过度拟合,并帮助它们在训练过程中通过更快的权重更新来快速收敛。在各种正则化技术中,内核正则化是这样一种技术,神经网络的权重系数被添加到一些惩罚或处罚因素中。通过向神经网络的权重添加惩罚因子,神经网络的权重更新过程会更快,并有适当的权重可用于下次更新。内核正则器不向偏置成分添加惩罚因素,这反过来又有利于获得更轻、更好的收敛模型。由于神经网络的偏置因子没有被改变,模型一般不会过度拟合,这有助于我们在测试阶段获得性能更好的模型。

让我们通过一个案例来了解内核正则器如何与神经网络一起工作。

内核正则器与神经网络的案例研究

在这个案例研究中,我们采用了一个二元图像分类的问题陈述,我们必须对非洲象和亚洲象进行分类。

一旦获得了数据集,就可以使用Matplotlib模块中的图表对两类的样本图像进行可视化:

import matplotlib.pyplot as plt
train_path='/content/drive/MyDrive/Colab notebooks/Kernel Regularizers with NN/dataset/train'
test_path='/content/drive/MyDrive/Colab notebooks/Kernel Regularizers with NN/dataset/test'
 
plt.figure(figsize=(15,5))
img=load_img(train_path + "/African/af_tr109.jpg")
plt.imshow(img)
plt.axis("off")
plt.title("African Elephant Image")
plt.show()
 
plt.figure()
 
img=load_img(train_path + "/Asian/as_tr114.jpg")
plt.imshow(img)
plt.axis("off")
plt.title("Asian Elephant  Image")
plt.show()

一旦数据集中的样本图像被可视化,我们就建立了一个序列Tensorflow模型,其中有一些层,如下图所示,该模型被适当地编译为适当的损失函数和指标进行评估。

没有内核正则化的模型

import tensorflow as tf
from tensorflow.keras.layers import Dense,MaxPooling2D,Conv2D,Flatten
from tensorflow.keras.models import Sequential
 
img_row=150
img_col=150
 
model1=Sequential()
model1.add(Conv2D(64,(5,5),activation='relu',input_shape=(img_row,img_col,3)))
model1.add(MaxPooling2D(pool_size=(2,2)))
model1.add(Conv2D(32,(5,5),activation='relu'))
model1.add(MaxPooling2D(pool_size=(2,2)))
model1.add(Conv2D(16,(5,5),activation='relu'))
model1.add(MaxPooling2D(pool_size=(2,2)))
model1.add(Flatten())
model1.add(Dense(126,activation='relu'))
model1.add(Dense(52,activation='relu'))
model1.add(Dense(1,activation='sigmoid'))
model1.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])

由于我们使用的是图像数据集,所以通过使用ImageDataGenerator模块进行了适当的预处理,如下图所示:

from tensorflow.keras.preprocessing.image import ImageDataGenerator,load_img

train_datagen=ImageDataGenerator(rescale=1./255,shear_range=0.2,zoom_range=0.2,horizontal_flip=True)
test_datagen=ImageDataGenerator(rescale=1./255)
train_set=train_datagen.flow_from_directory(train_path,target_size=(img_row,img_col),
                                           batch_size=64,class_mode='binary')
test_set=test_datagen.flow_from_directory(test_path,target_size=(img_row,img_col),
                                           batch_size=64,class_mode='binary')

有了适当的预处理后的数据,现在编译后的数据被分割成50个epochs,然后对训练和测试的损失和准确性进行评估:

model1_res=model1.fit_generator(train_set,steps_per_epoch=840//64,
                               epochs=50,validation_data=test_set,
                               validation_steps=188//64)
model1.evaluate(train_set)  ## training loss and training accuracy

model1.evaluate(test_set)  ## testing loss and accuracy

因此,在这里模型-1可以被视为基础模型,获得的参数可以用来验证它与应用了内核正则化的模型。

在扁平化层之前应用核正则化

对于相同的模型,架构让我们在扁平化层之前就应用核正则化,并通过与基础模型的比较观察模型的性能:

img_row=150
img_col=150
 
model3=Sequential()
model3.add(Conv2D(64,(3,3),activation='relu',input_shape=(img_row,img_col,3)))
model3.add(MaxPooling2D(pool_size=(2,2)))
model3.add(Conv2D(32,(3,3),activation='relu'))
model3.add(MaxPooling2D(pool_size=(2,2)))
model3.add(Conv2D(16,(3,3),activation='relu',kernel_regularizer=regularizers.l1(0.001)))
model3.add(MaxPooling2D(pool_size=(2,2)))
model3.add(Flatten())
model3.add(Dense(126,activation='relu'))
model3.add(Dense(52,activation='relu'))
model3.add(Dense(1,activation='sigmoid'))

现在对模型架构进行适当的编译,并对50个历时进行拟合,分别对训练和测试的损失和准确性进行评估,如下所示:

model3.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])
model3_res=model3.fit_generator(train_set,steps_per_epoch=840//64,epochs=50,
                     validation_data=test_set,
                     validation_steps=188//64)
model3.evaluate(train_set)  ## training loss and training accuracy

model3.evaluate(test_set)  ## testing loss and testing accuracy

在这里,当我们比较基础模型的性能和内核化模型的性能时,我们可以看到模型的损失参数是相当大的,而且与基础模型相比,模型的测试精度表现更好。所以我们可以说,通过在扁平化层之前使用内核正则化器,可以看到模型的欠拟合性可以通过在扁平化层之前使用内核正则化器而被推翻。

在两层使用内核正则化

这里,核正则首先用于输入层和输出层之前的那一层。因此,下面是模型的架构,让我们用适当的损失函数和度量来编译它:

img_row=150
img_col=150
 
model5=Sequential()
model5.add(Conv2D(64,(3,3),activation='relu',input_shape=(img_row,img_col,3)))
model5.add(MaxPooling2D(pool_size=(2,2)))
model5.add(Conv2D(32,(3,3),activation='relu',kernel_regularizer=regularizers.l1(0.001)))
model5.add(MaxPooling2D(pool_size=(2,2)))
model5.add(Conv2D(16,(3,3),activation='relu'))
model5.add(MaxPooling2D(pool_size=(2,2)))
model5.add(Flatten())
model5.add(Dense(126,activation='relu'))
model5.add(Dense(52,activation='relu',kernel_regularizer=regularizers.l1(0.001)))
model5.add(Dense(1,activation='sigmoid'))

model5.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])

该模型在分割的数据上拟合了50个历时,然后对训练和测试的损失和准确性进行评估:

model5_res=model5.fit_generator(train_set,steps_per_epoch=840//64,epochs=50,
                     validation_data=test_set,
                     validation_steps=188//64)

model5.evaluate(train_set)  ## training loss and training accuracy

model5.evaluate(test_set)  ## training loss and training accuracy

在这里,当考虑到基础模型和两层的内核化模型时,我们可以看到,与基础模型相比,损失减少了,训练和测试准确率几乎接近,这表明一个可靠的模型在测试期间对未见过的数据表现更好。

核心正则器与神经网络的主要成果

模型名称训练损失训练准确率测试损失测试准确率
基础模型0.4060.8050.6440.728
核心化模型-10.6210.6560.6120.696
内核化模型-20.6030.6940.6380.686
  1. 不是所有的神经网络结构都需要正则化,正则化最适合于复杂和较深的神经网络。
  2. 内核正则化器在扁平化层之前应用时,通过产生较低的训练和测试损失以及较高的测试精度,有助于克服欠拟合。
  3. 当使用多个核正则器时,复杂的神经网络有助于在很大程度上减少过拟合,并有助于产生一个可靠的模型,在训练和测试参数中没有很多波动。
  4. 内核正则器用于相对简单的数据集时,可能不会显示出任何参数的改善迹象,因为对于简单的神经网络架构,权重更新过程比较简单,因为更新发生在较少的层上。

总结

对复杂的神经网络进行微调有助于加快训练过程,有助于更快地收敛并获得一个通用的模型。在神经网络的各种微调技术中,内核正则化是一种适合复杂或深度神经网络架构的技术,它在不改变偏差的情况下将惩罚项添加到层的权重中,从而解决与神经网络欠拟合相关的问题,并有助于产生可靠的模型,在未见过的数据或不断变化的测试环境中表现更好。