alterna ai
ALTERNA AI / ГЛАВА 11 · 06

11.6 Каналы и повторное использование коэффициентов

На предыдущей странице: двумерное окно изображения.

Для одного выходного канала складываются вклады всех входных. Те же коэффициенты используются в разных положениях окна.

Маленькое окно проходит по сигналу или изображению. Каждый выход складывается из чисел окна и общих коэффициентов. Частотная запись описывает те же данные иначе.

Локальность и общие параметры

Вход CNN в нашем соглашении имеет shape[B,C_in,H,W], weights[C_out,C_in,k_h,k_w], bias[C_out]. Для каждого output channel суммируются локальные вклады всех input channels, после чего bias добавляется один раз:

Yb,o,i,j=bo+∑c∑r∑sKo,c,r,sXb,c,ish−p+r,jsw−p+s.Y_{b,o,i,j}=b_o+\sum_c\sum_r\sum_s K_{o,c,r,s}X_{b,c,is_h-p+r,js_w-p+s}.

В индексах i,j — выходная строка и столбец, s_h,s_w — stride; индекс суммы s не обозначает stride. Число параметров C_out(C_in·k_h·k_w+1) не зависит от числа пространственных позиций. ДляCin3,Cout2,kernel3×3 это56скаляров.

Feature explorer использует явно заданные kernels и синтетические channels, не выдаёт их за обученную CNN. Receptive field одной3×3операции —3×3; двух таких слоёв stride1 —5×5, а не6×6. В общем случае r_l=r_(l−1)+(k_l−1)j_(l−1), j_l=j_(l−1)s_l, гдеj—шаг соседних выходов относительно исходного входа. Dilation потребовала бы дополнительного множителя.

Отдельное обучение. Вторая лаборатория учит1×2filter на strip[1,1,0,0,1,1] сtarget[0,1,0,−1,0]. Начальныеweights[0,0], loss=.5mean(e²)=.2. Gradients[−.2,.2], приlr.5 новыйkernel[.1,−.1], loss=.162. Все patch-вклады действительно суммируются, weights обновляются одновременно. Это небольшой fit, не полноценный vision benchmark.

Исследовать. Увеличьте число channels в feature explorer и объясните count и сумму, затем отдельно пройдите training trace. Изменение learning rate не должно тайно менять kernels первой лаборатории. Теперь можно перейти от сигналов к кодированию текста, следующему узлу программы.

cin,cout,kh,kw=3,2,3,3
assert cout*(cin*kh*kw+1)==56
x=[1,1,0,0,1,1]; target=[0,1,0,-1,0]
g=[sum((-target[i])*x[i+j] for i in range(5))/5 for j in range(2)]
w=[-.5*v for v in g]
assert g==[-.2,.2] and w==[.1,-.1]

Код повторяет только что разобранные операции. Полный проверяемыйPython-пример главы доступен отдельным файлом; показанный короткий фрагмент не заменяет его реализацию.

Каждому input channel соответствует срез kernel, затем вклады складываются.

Как обработать строку, которая ещё не состоит из нужных модели единиц?

Python-примеры главы 11 Академическая база →