Neural network 什么是神经网络的微调?

Neural network 什么是神经网络的微调?,neural-network,Neural Network,我正在阅读一些基于神经网络的研究论文,在那里我遇到了在预先训练好的CNN网络上进行微调这个词。它实际上是做什么的?微调通常被称为更复杂的神经网络训练的最后一步,当您仅稍微修改预先训练的网络时,通常是为了提高特定领域的性能或在不同任务中重复使用良好的输入表示 通常,在迁移学习中会提到这一点。例如,对于图像识别,这可能意味着您需要一个经过培训的网络来识别ImageNet中的1k类。您使用预先训练的网络,仅“微调”特定于任务的最后一层(较小且可能更简单的数据集)。当您仅稍微修改预先训练的网络时,微调通

我正在阅读一些基于神经网络的研究论文,在那里我遇到了在预先训练好的CNN网络上进行微调这个词。它实际上是做什么的?

微调通常被称为更复杂的神经网络训练的最后一步,当您仅稍微修改预先训练的网络时,通常是为了提高特定领域的性能或在不同任务中重复使用良好的输入表示


通常,在迁移学习中会提到这一点。例如,对于图像识别,这可能意味着您需要一个经过培训的网络来识别ImageNet中的1k类。您使用预先训练的网络,仅“微调”特定于任务的最后一层(较小且可能更简单的数据集)。

当您仅稍微修改预先训练的网络时,微调通常被称为更复杂的NN训练的最后一步,通常用于提高特定领域的性能或在不同任务中重用良好的输入表示


通常,在迁移学习中会提到这一点。例如,对于图像识别,这可能意味着您需要一个经过培训的网络来识别ImageNet中的1k类。您使用预先训练的网络,只“微调”特定于任务的最后一层(较小且可能更简单的数据集)。

预先训练:

首先,我们必须理解预先训练好的模型。预训练模型是指权重已经由某人在数据集上训练的模型。e、 VGG16在图像网络上进行训练。现在我们要对imagenet图像进行分类。我们可以说,如果我们使用预先训练过的VGG16,我们可以很容易地对它们进行分类。因为VGG16已经被训练用于对imagenet对象进行分类,所以我们不需要再次训练

微调:

现在我想用VGG16(classes-1000)对Cifar-10(classes-10)进行分类,并且我想使用预先训练好的模型来完成这项工作。现在我有一个模型,它是在图像网络上训练的,有1000个类。所以现在我将改变最后一层,用10个神经元激活softmax,因为现在我想把10个类分类,而不是1000个。现在我将微调(根据需要更改)我的模型。我将在模型的最后添加一个密集层,它有10个神经元。现在我可以使用VGG16(针对图像网络的预训练)。根据需要改变预先训练好的模型称为微调

迁移学习:

现在,使用预先训练的模型并使用它通过微调模型对数据集进行分类的整个概念称为转移学习

迁移学习示例(使用预先训练的模型,并对其进行微调,以便在我的数据集上使用)

在这里,我使用在图像网络上预先训练的稠密网络,并微调我的模型,因为我想使用VGG16网络模型对数据集中的图像进行分类。我的数据集有5个类,所以我添加了最后一个密集层,有5个神经元

model=Sequential()
 
dense_model=keras.applications.densenet.DenseNet121(include_top=False, weights='imagenet', input_tensor=None, input_shape=(224,224,3), pooling=None, classes=1000)
dense_model.trainable = False
dense_model.summary()
# Add the vgg convolutional base model

model.add(dense_model)
 
# Add new layers
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(128, activation='relu'))

model.add(keras.layers.Dense(5, activation='softmax'))
model.summary()
预先培训的模型链接:

现在,如果我想更改预训练模型的超参数,该怎么办。如果我使用VGG16(在我的数据集上),我想检查哪个(优化器、损失函数、层数、神经元数)在我的数据集上运行良好。因此,我将优化我的参数,称为“超参数优化”

超参数优化: 如果你有神经网络的知识,你就会知道我们给神经网络随机数。e、 g致密层数量、致密单元数量、活化度、脱落百分比。我们不知道3层的神经网络在我们的数据上表现良好,或者6层的神经网络在我们的数据上表现良好。我们做实验,以获得最佳的数字为我们的模型。现在,为模型找到最佳数值的实验称为微调。现在我们有一些技术来优化我们的模型,比如 网格搜索,随机搜索。我正在分享一个笔记本,通过这个笔记本,你可以在代码的帮助下优化你的模型参数

 import math
from keras.wrappers.scikit_learn import KerasRegressor
import keras
from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.model_selection import RandomizedSearchCV, KFold
from sklearn.metrics import make_scorer
from keras.models import Sequential,Model
from keras.layers import Dense,Dropout,Activation,BatchNormalization
from keras import losses
from keras import optimizers
from keras.callbacks import EarlyStopping
from keras import regularizers

def Randomized_Model(lr=0.0001,dropout=0.5,optimizer='Adam',loss='mean_squared_error',
                    activation="relu",clipnorm=0.1,
                    decay=1e-2,momentum=0.5,l1=0.01,l2=0.001,
                    ):




    #Setting Numbers of units in Every dense layer according to the number of dense layers
    no_of_units_in_dense_layer=[]
    #backwards loop


    #setting up loss functions
    loss=losses.mean_squared_error
    if(loss=='mean_squared_error'):
        loss=losses.mean_squared_error
    if(loss=="poisson"):
        loss=keras.losses.poisson
    if(loss=="mean_absolute_error"):
        loss=keras.losses.mean_absolute_percentage_error
    if(loss=="mean_squared_logarithmic_error"):
        loss=keras.losses.mean_squared_logarithmic_error
    if(loss=="binary_crossentropy"):
        loss=keras.losses.binary_crossentropy
    if(loss=="hinge"):
        loss=keras.losses.hinge

    #setting up Optimizers
    opt=keras.optimizers.Adam(lr=lr, decay=decay, beta_1=0.9, beta_2=0.999)
    if optimizer=="Adam":
        opt=keras.optimizers.Adam(lr=lr, decay=decay, beta_1=0.9, beta_2=0.999)
    if optimizer=="Adagrad":
        opt=keras.optimizers.Adagrad(lr=lr, epsilon=None, decay=decay)
    if optimizer=="sgd":
        opt=keras.optimizers.SGD(lr=lr, momentum=momentum, decay=decay, nesterov=False)
    if optimizer=="RMSprop":
        opt=keras.optimizers.RMSprop(lr=lr, rho=0.9, epsilon=None, decay=0.0)
    if optimizer=="Adamax":
        opt=keras.optimizers.Adamax(lr=lr, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0)


    #model sequential
    model=Sequential()

    model.add(Dense(units=64,input_dim=30,activation=activation))
    model.add(Dense(units=32,activation=activation))
    model.add(Dense(units=8,activation=activation))
    model.add(Dense(units=1))
    model.compile(loss=loss ,optimizer=opt)



    return model
params = {'lr': (0.0001, 0.01,0.0009,0.001,0.002 ),
     'epochs': [50,100,25],
     'dropout': (0, 0.2,0.4, 0.8),
     'optimizer': ['Adam','Adagrad','sgd','RMSprop','Adamax'],
     'loss': ["mean_squared_error","hinge","mean_absolute_error","mean_squared_logarithmic_error","poisson"],
     'activation' :["relu","selu","linear","sigmoid"],
     'clipnorm':(0.0,0.5,1),
     'decay':(1e-6,1e-4,1e-8),
     'momentum':(0.9,0.5,0.2),
     'l1': (0.01,0.001,0.0001),
     'l2': (0.01,0.001,0.0001),

     }
from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.model_selection import RandomizedSearchCV, KFold
from sklearn.metrics import make_scorer
# model class to use in the scikit random search CV 

model =  KerasRegressor(build_fn=Randomized_Model, epochs=30, batch_size=3, verbose=1)
RandomizedSearchfit = RandomizedSearchCV(estimator=model, cv=KFold(3), param_distributions=params, verbose=1,  n_iter=10, n_jobs=1)
#having some problem in this line
RandomizedSearch_result = RandomizedSearchfit.fit(X, Y )
现在,将X和Y赋予此模型,它将在
参数dict变量中找到您选择的最佳参数。您也可以在本笔记本中检查CNN的微调()在本笔记本中,我正在使用Talos库来微调我的模型


这是另一个笔记本,我在其中使用SKLearn(随机和网格搜索)微调我的模型()

预先训练:

首先,我们必须理解预先训练好的模型。预训练模型是指权重已经由某人在数据集上训练的模型。e、 VGG16在图像网络上进行训练。现在我们要对imagenet图像进行分类。我们可以说,如果我们使用预先训练过的VGG16,我们可以很容易地对它们进行分类。因为VGG16已经被训练用于对imagenet对象进行分类,所以我们不需要再次训练

微调:

现在我想用VGG16(classes-1000)对Cifar-10(classes-10)进行分类,并且我想使用预先训练好的模型来完成这项工作。现在我有一个模型,它是在图像网络上训练的,有1000个类。所以现在我将改变最后一层,用10个神经元激活softmax,因为现在我想把10个类分类,而不是1000个。现在我将微调(根据需要更改)我的模型。我将在模型的最后添加一个密集层,它有10个神经元。现在我可以使用VGG16(针对图像网络的预训练)。根据需要改变预先训练好的模型称为微调

迁移学习:

现在,使用预先训练的模型并使用它通过微调模型对数据集进行分类的整个概念称为转移学习

迁移学习示例(使用预先训练的模型,并对其进行微调,以便在我的数据集上使用)

在这里,我使用在图像网络上预先训练的稠密网络,并微调我的模型,因为我想使用VGG16网络模型对数据集中的图像进行分类。我的数据集有5个类,所以我添加了最后一个密集层,有5个神经元

model=Sequential()
 
dense_model=keras.applications.densenet.DenseNet121(include_top=False, weights='imagenet', input_tensor=None, input_shape=(224,224,3), pooling=None, classes=1000)
dense_model.trainable = False
dense_model.summary()
# Add the vgg convolutional base model

model.add(dense_model)
 
# Add new layers
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(128, activation='relu'))

model.add(keras.layers.Dense(5, activation='softmax'))
model.summary()
训练前的模特林