Начало работы с Torch7 в DIGITS
DIGITS автоматически включает поддержку Torch7, если выполняется одно из следующих условий:
Установлена переменная среды TORCH_ROOT
:
export TORCH_ROOT=~/torch
Исполняемый файл th
находится в пути:
export PATH=$PATH:~/torch/install/bin
Нажмите на вкладку «Torch» на странице создания модели:
Примечание: по умолчанию Torch7 инициализирует веса линейных и свёрточных слоёв согласно методу, представленному в работе LeCun, Yann A., et al. «Efficient backprop». Neural networks: Tricks of the trade. Springer Berlin Heidelberg, 2012. 9-48. Хотя эта схема инициализации весов работает достаточно хорошо во многих разнообразных ситуациях, она редко бывает оптимальной, и вы можете заметить, что Caffe иногда способен обучаться быстрее при использовании, например, инициализации Xavier.
См. эти примеры для получения дополнительной информации.
Чтобы определить модель Torch7 в DIGITS, необходимо написать функцию Lua, которая принимает таблицу внешних сетевых параметров в качестве аргумента и возвращает таблицу внутренних сетевых параметров. Например, следующий код определяет разновидность LeNet:
return function(params)
-- настройка под количество каналов во входных изображениях — по умолчанию 1 канал
-- во время визуализации модели
local channels = (params.inputShape and params.inputShape[1]) or 1
local lenet = nn.Sequential()
lenet:add(nn.MulConstant(0.00390625))
lenet:add(nn.SpatialConvolution(channels,20,5,5,1,1,0)) -- channels*28*28 -> 20*24*24
lenet:add(nn.SpatialMaxPooling(2, 2, 2, 2)) -- 20*24*24 -> 20*12*12
lenet:add(nn.SpatialConvolution(20,50,5,5,1,1,0)) -- 20*12*12 -> 50*8*8
lenet:add(nn.SpatialMaxPooling(2,2,2,2)) -- 50*8*8 -> 50*4*4
lenet:add(nn.View(-1):setNumInputDims(3)) -- 50*4*4 -> 800
lenet:add(nn.Linear(800,500)) -- 800 -> 500
lenet:add(nn.ReLU())
lenen:add(nn.Linear(500, 10)) -- 500 -> 10
lenet:add(nn.LogSoftMax())
return {
model = lenet,
loss = nn.ClassNLLCriterion(),
trainBatchSize = 64,
validationBatchSize = 100,
}
end
Внешние параметры предоставляются DIGITS:
Параметр | Тип | Описание |
---|---|---|
ngpus | число | Указывает, сколько GPU доступно (0 означает CPU) |
nclasses | число | Количество классов (для классификационных наборов данных). Для других наборов данных это не определено. |
inputShape | Tensor | Форма (одномерный тензор) первого входного тензора. Для данных изображений это установлено как {каналы, высота, ширина}. Примечание: этот параметр не определён во время визуализации модели. |
Эти параметры возвращаются пользовательской функцией:
Параметр | Тип | Обязательный | Описание |
---|---|---|---|
model | nn.module | Да | Контейнер nn.module, который определяет используемую модель. |
loss | nn.criterion | Нет | Критерием nn.criterion, используемый во время обучения. По умолчанию используется nn.ClassNLLCriterion. |
labelHook | function | Нет | Функция (ввод, dblabel), которая возвращает предполагаемую метку (цель) для текущего пакета с учётом предоставленного ввода и метки в базе данных. По умолчанию используется метка базы данных. |
trainBatchSize | number | Нет | Если указано, устанавливает размер обучающей партии. Может быть переопределён пользователем в пользовательском интерфейсе DIGITS. |
validationBatchSize | number | Нет | Если указано, задаёт размер проверочной партии. Может быть переопределён пользователем в пользовательском интерфейсе DIGITS. |
fineTuneHook | function | Нет | Функция(net), возвращающая модель, используемую для точной настройки. Неуточнённая модель передаётся в качестве параметра функции. |
disableAutoDataParallelism | boolean | Нет | По умолчанию модели инкапсулируются в контейнер nn.DataParallelTable, чтобы включить обучение на нескольких GPU при выборе более 1 GPU. Установка этого флага в значение true отключает этот механизм. |
Сети питаются объектами Torch Tensor в формате NxCxHxW (индекс в пакете x каналы x высота x ширина). Если доступен графический процессор, тензоры предоставляются как тензоры Cuda, а модель и критерий переносятся на графические процессоры через вызов их метода cuda(). При отсутствии графических процессоров тензоры представляются в виде Float-тензоров.
Для точной настройки сети возвращаемая в таблице внутренних параметров модель должна точно соответствовать исходной (предварительно обученной) модели для точной настройки. Пользовательская функция fineTuneHook(net) — это место, где исходная модель (переданная через параметр net) может быть адаптирована для решения другой задачи.
Следующая сеть определяет линейную сеть, которая принимает любой 3D-тензор в качестве входных данных и выдаёт один категориальный выход для каждого класса:
return function(p)
-- модель должна адаптироваться к любому 3D-входу
local nClasses = p.nclasses or 1
local nDim = 1
if p.inputShape then p.inputShape:apply(function(x) nDim=nDim*x end) end
local model = nn.Sequential()
model:add(nn.View(-1):setNumInputDims(3)) -- c*h*w -> chw (flattened)
model:add(nn.Linear(nDim, nclasses)) -- chw -> nClasses
model:add(nn.LogSoftMax())
return {
model = model
}
end
Слои свёртки поддерживаются различными бэкэндами (например, nn, cunn, cudnn и т. д.). Следующий фрагмент показывает, как выбрать между nn, cunn и cudnn в зависимости от их доступности в системе:
if pcall(function() require('cudnn') end) then
backend = cudnn
convLayer = cudnn.SpatialConvolution
else
pcall(function() require('cunn') end)
backend = nn -- работает с cunn или nn
convLayer = nn.SpatialConvolutionMM
end
local net = nn.Sequential()
lenet:add(backend.SpatialConvolution(1,20,5,5,1,1,0)) -- 1*28*28 -> 20*24*24
lenet:add(backend.SpatialMaxPooling(2, 2, 2, 2)) -- 20*24*24 -> 20*12*12
lenet:add(backend.SpatialConvolution(20,50,5,5,1,1,0)) -- 20*12*12 -> 50*8*8
lenet:add(backend.SpatialMaxPooling(2,2,2,2)) -- 50*8*8 -> 50*4*4
lenet:add(nn.View(-1):setNumInputDims(3)) -- 50*4*4 -> 800
lenet:add(nn.Linear(800,500)) -- 800 -> 500
lenet:add(backend.ReLU())
lenet:add(nn.Linear(500, 10)) -- 500 -> 10
lenet:add(nn.LogSoftMax())
В обучении с учителем методом регрессии метки могут не быть скалярами, как в обучении классификации. Чтобы изучить модель регрессии, можно создать общий набор данных, используя одну базу данных для входных выборок и одну базу данных для меток (в настоящее время поддерживаются только одномерные векторы строк меток). Необходимо указать соответствующую функцию потерь с помощью внутренних параметров loss. Например, следующий фрагмент определяет простую модель регрессии на изображениях размером 1x10x10 с использованием функции потерь MSE:
local net = nn.Sequential()
net:add(nn.View(-1):setNumInputDims(3)) -- 1*10*10 -> 100
net:add(nn.Linear(100,2))
return function(params)
return {
model = net,
loss = nn.MSECriterion(),
}
end
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )