Пожалуйста, помогите разобраться с кодом сверточной нейронной сети из книги "Грокаем глубокое обучение" на 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)

Ответы (0 шт):