2 / 1 / 1
Регистрация: 26.08.2018
Сообщений: 22
1

Чем качественно отличается метод модели train_on_batch от fit?

05.11.2018, 05:36. Показов 1937. Ответов 4

Из keras, разумеется. Понадобилось создать свою функцию для обучения модели на большом наборе данных, который не помещается в ОЗУ целиком. При обучении модели методом train_on_batch, при отсутствии разделения данных на проверочные внутри функции, модель отказывалась обучаться и её аккуратность падала в 0 после второй эпохи, чего нельзя сказать о методе fit с одной эпохой и размером партии аналогичным глобальному. Но если разделять данные на валидационные внутри функции, то модель успешно обучается, хотя это никак не отражается на конфигурации работы метода train_on_batch. Сейчас полностью перешел на недо-fit, но хотелось бы понять, почему это происходило... Вот код этой функции:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
import os
import time
import numpy as np
from keras.preprocessing import image
np.random.seed(100)
 
def fit_on_batches(model, x_data, y_data, epochs=1, batch_size=32, validation_split=0., data_split=1., mode=None, target_img_size=None, patience=None):
 
    if mode==None:
        mode='img' if target_img_size!=None else 'arr'
 
    if mode!='arr':
        x_data, y_data = [x_data + i for i in os.listdir(x_data)], [y_data + i for i in os.listdir(y_data)]
 
    def imgInPath(path):
        return image.img_to_array(image.load_img(path, target_size=target_img_size))
    def maskInPath(path):
        return image.img_to_array(image.load_img(path, target_size=target_img_size, color_mode = "grayscale"))
 
    maxDataSplit = int(len(x_data) * data_split)
    maxValSplit = int(maxDataSplit * validation_split)
    dataXArr = np.random.choice(len(x_data), maxDataSplit, replace=False)
    trainXArr = dataXArr[maxValSplit:]
    valXArr = dataXArr[:maxValSplit]
    xTrain = np.array([x_data[i] for i in trainXArr])
    yTrain = np.array([y_data[i] for i in trainXArr])
    xVal = np.array([x_data[i] for i in valXArr])
    yVal = np.array([y_data[i] for i in valXArr])
 
    if len(xVal)==0:
        print('Train on {} samples'.format(len(xTrain)))
    else:
        print('Train on {} samples, validate on {} samples'.format(len(xTrain), len(xVal)))
 
    maxCtrlAcc = 0
    patCombo = 0
    ctrlInfo = None
    for epoch in range(epochs):
        print('Epoch {}/{}'.format(epoch+1, epochs))
        start_epoch_time = time.clock()
        outInfo = []
        if len(xTrain) > 0:
            batch=0
            startX=0
            endX=0
            ETA=0
            metricsSum=[0 for i in range(len(model.metrics_names))]
            while endX < len(xTrain):
                start_train_time = time.clock()
                batch += 1
                startX = batch_size*(batch-1)
                if batch_size*batch > len(xTrain):
                    endX = len(xTrain)
                else:
                    endX = batch_size*batch
 
                if mode=='arr':
                    x_batch = np.array([i for i in xTrain[startX:endX]])
                    y_batch = np.array([i for i in yTrain[startX:endX]])
                if mode=='img':
                    x_batch = np.array([imgInPath(i) for i in xTrain[startX:endX]])
                    y_batch = np.array([imgInPath(i) for i in yTrain[startX:endX]])
                    x_batch = x_batch.astype('float32')
                    y_batch = y_batch.astype('float32')
                    x_batch /= 255
                    y_batch /= 255
                if mode=='mask':
                    x_batch = np.array([imgInPath(i) for i in xTrain[startX:endX]])
                    y_batch = np.array([maskInPath(i) for i in yTrain[startX:endX]])
                    x_batch = x_batch.astype('float32')
                    y_batch = y_batch.astype('float32')
                    x_batch /= 255
                    y_batch /= 255
 
                hystory = model.fit(x_batch, y_batch, epochs=1, batch_size=batch_size, verbose=0)
                metrics = [i[0] for i in list(hystory.history.values())]
                #metrics = model.train_on_batch(x_batch, y_batch)                    #ПРОБЛЕМА ТУТ(!!!)
                metricsSum = [metricsSum[i]+metrics[i] for i in range(len(metrics))]
 
                if len(xTrain) > 1:
                    delta_train_time = (time.clock()-start_train_time)/batch_size
                    iETA = delta_train_time*(len(xTrain)-endX)
                    ETA = int(iETA+(ETA-iETA)*0.1)
                    print('Training batches: {:.2f}% - ETA: {:<4}'.format(endX/len(xTrain)*100, str(ETA)+'s'), end='\r', sep='')
 
            avgMetrics = [i/batch for i in metricsSum]
            metricsInfo = list(zip(model.metrics_names, avgMetrics))
            for i in range(len(metricsInfo)):
                outInfo.append(' - {}: {:.4f}'.format(metricsInfo[i][0], metricsInfo[i][1]))
 
        if len(xVal) > 0:
            valBatch=0
            startValX=0
            endValX=0
            ETA=0
            evalSum=[0 for i in range(len(model.metrics_names))]
            while endValX < len(xVal):
                start_val_time = time.clock()
                valBatch += 1
                startValX = batch_size*(valBatch-1)
                if batch_size*valBatch > len(xVal):
                    endValX = len(xVal)
                else:
                    endValX = batch_size*valBatch
 
                if mode=='arr':
                    x_val_batch = np.array([i for i in xVal[startValX:endValX]])
                    y_val_batch = np.array([i for i in yVal[startValX:endValX]])
                if mode=='img':
                    x_val_batch = np.array([imgInPath(i) for i in xVal[startValX:endValX]])
                    y_val_batch = np.array([imgInPath(i) for i in yVal[startValX:endValX]])
                    x_val_batch = x_val_batch.astype('float32')
                    y_val_batch = y_val_batch.astype('float32')
                    x_val_batch /= 255
                    y_val_batch /= 255
                if mode=='mask':
                    x_val_batch = np.array([imgInPath(i) for i in xVal[startValX:endValX]])
                    y_val_batch = np.array([maskInPath(i) for i in yVal[startValX:endValX]])
                    x_val_batch = x_val_batch.astype('float32')
                    y_val_batch = y_val_batch.astype('float32')
                    x_val_batch /= 255
                    y_val_batch /= 255
 
                evaluate = model.evaluate(x_val_batch, y_val_batch, verbose=0)
                evalSum = [evalSum[i]+evaluate[i] for i in range(len(evaluate))]
 
                if len(xVal) > 1:
                    delta_val_time = (time.clock()-start_val_time)/batch_size
                    iETA = delta_val_time*(len(xVal)-endValX)
                    ETA = int(iETA+(ETA-iETA)*0.1)
                    print('Validation batches: {:.2f}% - ETA: {:<4}'.format(endValX/len(xVal)*100, str(ETA)+'s'), end='\r', sep='')
 
            avgEval = [i/valBatch for i in evalSum]
            evalInfo = list(zip(model.metrics_names, avgEval))
            for i in range(len(evaluate)):
                outInfo.append(' - {}: {:.4f}'.format('val_'+evalInfo[i][0], evalInfo[i][1]))
 
        outInfo.insert(0, ' - {:<4}'.format(str(int(time.clock()-start_epoch_time))+'s'))
        outInfo = ''.join(outInfo)
        print(outInfo)
 
        if len(xVal) == 0:
            ctrlInfo = metricsInfo
        else:
            ctrlInfo = evalInfo
 
        if patience==None:
            continue
        if patience>=0:
            if ctrlInfo[1][1] >= maxCtrlAcc:
                maxCtrlAcc = ctrlInfo[1][1]
                bestModelInfo = [model, epoch]
                if ctrlInfo[1][1] > maxCtrlAcc:
                    patCombo = 0
            if ctrlInfo[1][1] <= maxCtrlAcc:
                patCombo += 1
            
            if patCombo >= patience:
                print('Retraining, stop learning... Saved the best epoch -', bestModelInfo[1]+1)
                model = bestModelInfo[0]
                break
 
        if patience==-1:
            if ctrlInfo[1][1] >= maxCtrlAcc:
                maxCtrlAcc = ctrlInfo[1][1]
                bestModelInfo = [model, epoch]
            
            if (epoch==epochs-1):
                if bestModelInfo[1]!=epoch:
                    print('Saved the best epoch -', bestModelInfo[1]+1)
                model = bestModelInfo[0]
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.11.2018, 05:36
Ответы с готовыми решениями:

Чем Спиральная модель отличается от инкрементальной интерационной модели?
Не могу понять, чем отличаются эти две модели: спиральная и инкрементально интерационная? Заранее...

Чем отличается обучение модели Гроссберга-Карпентера от обучения многослойного перцептрона
Чем принципиально отличается обучение модели Гроссберга-Карпентера от обучения многослойного...

Чем отличается метод от свойства ?
/./

Чем отличается метод ZF2 от ZF1?
Есть незавершенный проект на ZF1, можно ли завершить его, зная при этом только ZF2

4
474 / 373 / 49
Регистрация: 20.09.2014
Сообщений: 2,277
05.11.2018, 07:23 2
Про керас ничего не знаю, но различают три вида обучения:
batch_size = 1 (это обычный стохастический градиент)
batch_size = 32 (mini-batch)
batch_size = epoch_size (batch)

Чем больше пакет, тем лучше, но съедает больше ресурсов.

Что касается кросс-проверок внутри эпох, то это называют ранний останов (early stopping) - если на сторонних данных показатели стали падать, то значит началось переобучение, обучение прекращается.

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

Добавлено через 9 минут
Если аккуратность равна нулю, то это должно насторожить: вы создали идеальный антиинтеллект. Может вы классы перемешали при вычислении аккуратности или при обучении?

Наихудшая аккуратность = 1 / кол-во_классов
1
2 / 1 / 1
Регистрация: 26.08.2018
Сообщений: 22
05.11.2018, 07:48  [ТС] 3
Нет, это с этим никак не связано, про переобучение, ранний останов и тд знаю, и, на сколько я понял, проблема в самой модели, пытаюсь исправить
0
23 / 23 / 5
Регистрация: 02.02.2014
Сообщений: 89
06.11.2018, 22:21 4
Вряд ли кто будет эту портянку всерьез читать. См. fit_generator и keras.utils.Sequence - нет нужды велосипедить им замену, тем более что с ними код раза в 3-4 короче станет.
0
2 / 1 / 1
Регистрация: 26.08.2018
Сообщений: 22
13.11.2018, 20:30  [ТС] 5
Да уж... Изначальная структура данных не благоприятствует использованию генераторов, но тем не менее я уже всё вроде как допилил
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.11.2018, 20:30

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Чем отличается метод золотого сечения от дихотомии?
Собственно,весь вопрос в заголовке.) в инете нет точной аргументации, а курсовик защитить надо.)

Чем метод формы show отличается от метода showmodal?
Чем метод формы show отличается от метода showmodal?

Чем отличается метод передачи данных TcpClient() от Socket
Здравствуйте! Подскажите, пожалуйста! Очень интересно :)

Перезапись данных из одно fit файла в другой fit файл
Помогите пожалуйста составить программу, которая брала бы имеющийся файл in.fit и переписовала бы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.