Форум программистов, компьютерный форум, киберфорум
Наши страницы
Konst2016
Войти
Регистрация
Восстановить пароль
Оценить эту запись

Свертка по изображению

Запись от Konst2016 размещена 29.11.2019 в 11:40

Здравствуйте!На ютуб выложил видео,где разбираюсь со сверткой изображений(какие примерно используют для
сверточных нейросетей).Там выложил гит-ссылку на гит код.Здесь приведу этот код:
ссылка на ютуб:https://www.youtube.com/watch?time_c...ature=emb_logo
Код:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import numpy as np
np.random.seed(0)
# Берем квадратное изображение 3x3 заполняем
# числами от 0 до 20,вытягиваем его в ленту
X = np.random.randint(0, 20, (3, 3)).flatten().tolist()
# Берем ядро 2x2
W0 = np.random.randint(0, 10, (2,2)).tolist()
def conv(inputt, kernel, width, height, stride):
    """
    Кросс-кореляция(как бы свертка)
    :param input: изображение как лента
    :param kernel: 2d ядро
    :param width: ширина изначального изображения
    :param height: его высота
    :param stride: шаг при свертке
    :return:выходную карту признаков
    """
    kernel_width = len(kernel[0])
    kernel_height = kernel_width
    v = (((width - kernel_width) // stride) + 1)  # выходной обьем(ширина) выходной карты признаков
    # выходная карта признаков квадратная
    output = [0] * (v ** 2)
    n = 0
    for j in range(height - stride):
        for i in range(width - stride):
            result = 0
            element_exists = False
            for a in range(kernel_height):
                for b in range(kernel_width):
                    Y = j * stride + a
                    X = i * stride + b
                    if Y >= height or X >= width:
                        continue
                    result += inputt[Y * width + X] * kernel[a][b]
                    element_exists = True
            if element_exists:
                if n == len(output):
                    break
                output[n] = result
                n += 1
    return output
# производим свертку
print(conv(X,W0,3,3,1))
#-->[195, 134, 239, 319]
print(conv(X,W0,3,3,2))
#-->[195]
Размещено в Без категории
Просмотров 109 Комментарии 1
Всего комментариев 1
Комментарии
  1. Старый комментарий
    После дописывания пары внешних циклов (что нужно будет для реализации свёрточного слоя с несколькими входными и несколькими же выходными картами, т.е. для свёрточных сеток более чем с одним свёрточным слоем) и обнаружения, что для обучения свёрточной сетки на MNIST (задача ещё прошлого столетия) требуется 2-3 часа - может быть, наступит осознание неправильности выбранного подхода к организации+программированию вычислений.
    Но совсем не гарантирую, что при этом наступит ещё и просветление (понимание того, как же надо программировать подобные вычисления).

    Это я пишу уже с учётом того, что для обучения св.нейронки должна будет быть написана ещё пара похожих кусков с шестикратной вложенностью циклов (для расчёта производных по весам и по входам свёрточного слоя). Т.е. наивного кода, непригодного для ВСЕХ сколько-нибудь современных задач, у Вас в итоге окажется много
    Запись от VTsaregorodtsev размещена 29.11.2019 в 13:20 VTsaregorodtsev вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.