Это четвертый день моего участия в августовском испытании обновлений. Узнайте подробности мероприятия: Испытание августовского обновления
Разумное разделение обучающих и тестовых наборов эффективно уменьшит явления недостаточной и чрезмерной подгонки. Взяв в качестве примера цифровое распознавание, нам нужно разделить обычный набор данных на обучающую часть и тестовую часть, как показано на следующем рисунке.
Оранжевая часть слева используется как обучающая часть, нейронная сеть непрерывно обучается в этой области, переносит признаки в функцию и после обучения получает функциональную модель. Затем импортируйте тестовую часть белой области в правой части изображения выше в модель, чтобы проверить точность и потери.
С помощью непрерывного тестирования проверьте, настроена ли модель на оптимальные параметры и не является ли результат переобучением.
# 训练-测试代码写法
train_loader = torch.utils.data.DataLoader(
# 一般使用DataLoader函数来让机器学习或测试
datasets.MNIST('../data', train=True, download=True,
# 使用 train=True 或 train=False来进行数据集的划分
# train=True时为训练集,相反即为测试集
transform=transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,),(0.3081,))
])),
batch_size=batch_size, shuffle=True)
test_loader = torch.utils.data.DataLoader(
datasets.MNIST('../data', train=False, download=True,
transform=transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,),(0.3081,))
])),
batch_size=batch_size, shuffle=True)
Обратите внимание, что при нормальных обстоятельствах набор данных должен иметь набор проверки (validation), если он не установлен, наборы test и val будут объединены в один.
Вышеизложенное объясняет, как разделить набор данных, и как выполнить циклический тест проверки обучения?
for epoch in range(epochs):
for batch_idx, (data, target) in enumerate(train_loader):
...
optimizer.zero_grad()
loss.backward()
optimizer.step()
if batch_idx % 100 == 0:
print('Train Epoch: {} [{} / {} ({:.0f}%)]\tLoss: {:.6f}'.format(
epoch, batch_idx * len(data), len(train_loadern.dataset),
100. * batch_idx / len(train_loader), loss.item()))
# 每次循环都查看一次是否发生了over-fitting
# 如果发生了over-fitting,我们便将最后一次模型的状态作为最终的版本
test_loss = 0
correct = 0
for data, target in test_loader:
data = data.view(-1, 28*28)
pred = logits.data.max(1)[1]
correct += pred.eq(target.data).sum()
...
test_loss /= len(test_loader.dataset)
print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(
test_loss, correct, len(test_loader.dataset),
100. * correct / len(test_loader.dataset)))
В практическом примере об ошибке поезда ошибка ошибки примерна и нанесена
Тренировка, показанная на ФИЖ После 5-го числа ошибка теста опустится ниже. Затем с увеличением количества тренировок ошибка теста постепенно увеличивается, явление переобучения. Мы будем тренироваться, частота называется контрольно-пропускным пунктом в этой точке 5-го числа.
На самом деле, при нормальных обстоятельствах в дополнение к набору для обучения и набору тестов для выбора наилучших параметров обычно существует набор для проверки. Val Set заменяет функцию Test Set, и Test Set должен быть передан заказчику для фактической проверки.В нормальных условиях Test Set не добавляется к тесту.
Давайте поговорим об очень конкретной сцене. Например, в соревновании Kaggle организатор соревнования дает вам набор обучающих данных. Как правило, мы разделим его на две части: Train Set и Val Set, Train with Train Set и Val Set выберет лучшие параметры, отправит модель после обучения, организатор будет использовать свой собственный набор данных, а именно Test Set для проверки вашей модели, и получить Score
Как видно из приведенного выше процесса, Val Set можно понимать как часть, удаленную из Train Set, и не имеет ничего общего с Test Set.
print('train:', len(train_db), 'test:', len(test_db))
# 首先先查看train和test数据集的数量,看看是否满足预订的分配目标
train_db, val_db = torch.utils.data.random_split(train_db, [50000, 10000])
# 随机分配法将数据分为50k和10k的数量
train_loader = torch.utils.data.DataLoader(
train_db,
batch_size = batch_size, shuffle=True)
val_loader = torch.utils.data.DataLoader(
val_db,
batch_size = batch_size, shuffle=True)
Однако этот метод обучения также будет иметь некоторые проблемы, как показано на рисунке ниже, если предположить, что общий объем данных составляет 70 тыс.
После завершения деления набор данных в тестовом наборе нельзя использовать, поэтому для обучения можно использовать только данные 50 + 10 тыс.
Чтобы увеличить обучающие выборки, мы можем использовать метод перекрестной проверки в K-кратном порядке, чтобы случайным образом разделить 60 000 обученных выборок на 50 000 наборов поездов и 10 000 наборов Val.
Белая часть — это недавно разделенный набор Val, а две желтые части плюс одна — это Train Set. Каждую эпоху в сеть дается новый набор поездов. Преимущество этого заключается в том, что все данные в наборе данных, скорее всего, будут изучены сетью, что предотвращает запоминание одних и тех же данных сетью.
Причина, по которой это называется K-кратной перекрестной проверкой, заключается в том, что при наличии набора 60K (Train+Val) он делится напорция каждый разПорции используются для поезда, кроме тогокопировать для проверки