Что такое тонкая настройка применительно к нейронной сети? - PullRequest
0 голосов
/ 20 июня 2019

Я просматриваю несколько исследовательских работ, основанных на нейронной сети, где я наткнулся на слово Fine Tuning на предварительно обученной сети CNN.Что это на самом деле делает?

Ответы [ 2 ]

1 голос
/ 20 июня 2019

Предварительно обученные:

Сначала мы должны понять предварительно обученную модель.Предварительно обученные модели - это модели, веса которых уже кем-то обучены в наборе данных.Например, VGG16 обучается в сети изображений.Теперь мы хотим классифицировать изображения изображений.чем мы можем сказать, что если мы используем предварительно обученный VGG16, мы можем легко их классифицировать.Поскольку VGG16 уже обучен для классификации объектов imagenet, нам не нужно обучать это снова.

Точная настройка:

Теперь я хочу классифицировать Cifar-10 (классы-10) с VGG16 (классы-1000), и я хочу использовать предварительно подготовленные модели для этой работы.Теперь у меня есть модель, которая обучается в сети изображений, которая имеет 1000 классов.Так что теперь я заменю последний слой с 10 нейронами с активацией softmax, потому что теперь я хочу классифицировать 10 классов, а не 1000. Теперь я буду настраивать (менять в соответствии с моими потребностями) мою модель.Я добавлю плотный слой на последней модели, которая имеет 10 нейронов.Теперь я могу использовать VGG16 (предварительно обученный для image-net).Изменение предварительно обученной модели в соответствии с нашими потребностями называется тонкой настройкой.

Transfer Learning:

Теперь вся концепция использует предварительно обученную модель и использует ее дляКлассификация нашего набора данных с помощью модели точной настройки известна как трансферное обучение

Пример трансферного обучения (использование предварительно обученной модели и точная настройка для использования ее в моем наборе данных)

Здесь я использую Dense-net, предварительно обученную на image-net, и настраиваю свою модель, потому что я хочу использовать сетевую модель 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()

Предварительно обученная ссылка на модель: https://www.kaggle.com/sohaibanwaar1203/pretrained-densenet

Теперь, что если я хочу изменитьгиперпараметры предварительно обученной модели.Я хочу проверить, какой (оптимизатор, функция потерь, количество слоев, количество нейронов) хорошо работает на моем наборе данных, если я использую VGG16 (на моем наборе данных).По этой причине я оптимизирую свой параметр, известный как Оптимизация гиперпараметров

Оптимизация гиперпараметров: Если у вас есть знания о нейронных сетях, вы будете знать, что мы передаем случайные числа в нашу нейронную сеть,например, Нет плотных слоев, Количество плотных единиц, Активация, Отпуск в процентах.Мы не знаем, что нейронная сеть с 3 слоями будет хорошо работать с нашими данными, или нейронная сеть с 6 слоями будет хорошо работать с нашими данными.Мы проводим эксперименты, чтобы получить лучший номер для нашей модели.Теперь эксперимент, в котором вы находите лучший номер для вашей модели, называется точной настройкой.Теперь у нас есть несколько методов для оптимизации нашей модели, таких как Grid Search, Random Search.Я делюсь записной книжкой, с помощью которой вы сможете оптимизировать параметры вашей модели с помощью кода.

 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 fucntions
    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 для этой модели, и вы найдете лучший параметр, выбранный вами вparam_dict variable.Вы также можете проверить Точную настройку CNN в этой записной книжке ( Нажмите здесь ). В этой записной книжке я использую библиотеку Talos для точной настройки своей модели.

Это еще одна записная книжка, в которой я нахожусьиспользование SKLearn (рандомизированный поиск и поиск по сетке) для точной настройки моей модели ( Нажмите здесь )

1 голос
/ 20 июня 2019

Точную настройку обычно называют последним этапом более сложного обучения NN, когда вы лишь слегка изменяете предварительно обученную сеть, обычно для повышения производительности в конкретном домене или повторного использования хорошего входного представления в другой задаче.

Часто это упоминается в контексте трансферного обучения. Например, для распознавания изображений это может означать, что вы берете сеть, которая была обучена распознавать 1k классов из ImageNet. Вы берете предварительно обученную сеть и выполняете только «точную настройку» последнего слоя в своей задаче (меньший и, вероятно, более простой набор данных).

...