1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/NVIDIA_Developer_Community-DIGITS

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
GettingStartedTorch.md 12 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 25.11.2024 22:05 0b96df5

Начало работы с Torch7 в DIGITS

Содержание

Включение поддержки Torch7 в DIGITS

DIGITS автоматически включает поддержку Torch7, если выполняется одно из следующих условий:

  • Установлена переменная среды TORCH_ROOT:

      export TORCH_ROOT=~/torch
  • Исполняемый файл th находится в пути:

      export PATH=$PATH:~/torch/install/bin

Выбор Torch7 при создании модели в DIGITS

Нажмите на вкладку «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

Чтобы определить модель 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

Слои свёртки поддерживаются различными бэкэндами (например, 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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/NVIDIA_Developer_Community-DIGITS.git
git@api.gitlife.ru:oschina-mirror/NVIDIA_Developer_Community-DIGITS.git
oschina-mirror
NVIDIA_Developer_Community-DIGITS
NVIDIA_Developer_Community-DIGITS
master