Пожалуйста, помогите разобраться с кодом сверточной нейронной сети из книги "Грокаем глубокое обучение" на Python
Читаю в данный момент книгу Эндрю Траска "Грокаем глубокое обучение". Дошел до главы со сверточными нейронными сетями и запутался в его коде. Перерыл кучу всевозможных статей, вроде разобрался с принципом работы данных моделей сетей. Но вот код автора книги я разобрать не могу, равно как и не знаю, что делать в случае, если входными данными будут не изображения MNIST, имеющие один канал, а какая-либо другая обучающая выборка с цветными изображениями (3 канала). В коде я не понимаю момент работы со свертками. Автор приводит следующий код,представленный ниже, в котором я не понимаю операцию решейпа в функции get_iamge_section(в целом для чего она и почему решейпим именно так, а не как иначе), а также операцию конкатенации полученных секций(почему именно по первому измерению) и операцию решейпа переменной expanded_input. Пожалуйста помогите понять суть данных операций, что и почему. Желания в тупую заучить код не имеется, хочется разобраться и понять все досконально.
def get_image_section(layer,row_from, row_to, col_from, col_to):
section = layer[:,row_from:row_to,col_from:col_to]
return section.reshape(-1,1,row_to-row_from, col_to-col_from)
for j in range(iterations):
correct_cnt = 0
for i in range(int(len(images) / batch_size)):
batch_start, batch_end=((i * batch_size),((i+1)*batch_size))
layer_0 = images[batch_start:batch_end]
layer_0 = layer_0.reshape(layer_0.shape[0],28,28)
layer_0.shape
sects = list()
for row_start in range(layer_0.shape[1]-kernel_rows):
for col_start in range(layer_0.shape[2] - kernel_cols):
sect = get_image_section(layer_0,
row_start,
row_start+kernel_rows,
col_start,
col_start+kernel_cols)
sects.append(sect)
expanded_input = np.concatenate(sects,axis=1)
es = expanded_input.shape
flattened_input = expanded_input.reshape(es[0]*es[1],-1)
kernel_output = flattened_input.dot(kernels)