# словарь, хранящий объект сети и служебную информацию net = create_net_from_json( os.path.join(RESOURCES_DIR, "topologies", "bp_test_topology.json")) # объект сети network = net.get("object") # размер входной последовательности len_image = network.get_input_size() # имя нейронной сети. Участвует в формировании имен слоев. # Формат: "символьное_имя[N1-N2-N3-...-Nm]", где Ni - число нейронов в i слое NETWORK_NAME = net.get("name") # папка с образами для обучения. Путь относительно текущей директории TEMPLATE_FOLDER = net.get("payload").get("template_folder") # папка с образами для фазы распознавания RECOGNIZE_FOLDER = net.get("payload").get("recognize_folder") # получаем список всех групп образов для обучения - список папок с группами group_list = folder_scan(os.path.join(RESOURCES_DIR, TEMPLATE_FOLDER)) # сортируем для дальнейшего маппинга номера выходного нейрона с именем группы group_list.sort() # Для задания числа входных сигналов сети возьмем длину любого шаблона из списка # Далее проверка наличия шаблонов в папке TEMPLATE_FOLDER for folder in group_list: if not folder_scan(os.path.join(RESOURCES_DIR, TEMPLATE_FOLDER, folder)): msg = "Group %s is empty!" % folder logger.error(msg) raise RuntimeError(msg) # словарь соответсвтвия. Ключ - имя группы, значение - номер нейрона на выходе сети group_identify = {} table = EasyTables(["Group name", "Index of out network"]) logger.debug("Generate mapping...")
import os from next.next import RESOURCES_DIR from util.parser import NumberParser from util.easyTables import EasyTables from entities.perceptron import Perceptron from util.folder_scaner import folder_scan from store.impl.perceptron_mock_store import PerseptronMockStoreService template_folder = os.path.join(RESOURCES_DIR, "digit_templates") # инициализируем персептрон для проверки четности числа perceptron = Perceptron(name="even", number_of_input=66, store_service=PerseptronMockStoreService()) # получаем список всех файлов в папке шаблонов list_of_numbers = folder_scan(template_folder) # словарь соответствия буквенных названий цифр и числовых numbers = { "zero": 0, "one": 1, "two": 2, "three": 3, "four": 4, "five": 5, "six": 6, "seven": 7, "eight": 8, "nine": 9, "ten": 10 }
Функция для представления списка нулей и единиц в виде bmp изображения. :param array: список нулей и единиц :return: """ img = Image.new('1', (100, 100)) pixels = img.load() for i in range(img.size[0]): for j in range(img.size[1]): pixels[i, j] = array.pop(0) img.show() # папка с образами image_folder = os.path.join(BASE_DIR, "number_images") # список образов в папке templates = folder_scaner.folder_scan(image_folder) # объект сети АРТ. Каждое изображение имеет разрешение 100x100, поэтому число входов = 10000 network = Network(name="IMAGE_NUMBERS", number_of_input=10000, auto_save=False) print("----------------- {} -----------------".format("Фаза обучения")) for template in templates: # в цикле проходим по всем образам и подаем их на вход сети image = image_folder + template print("template: ", template) out = network.recognize(parse_image(image)) print() print("----------------- {} -----------------".format("Фаза тестирования"))
Провести процедуру обучения на всех имеющихся образах (шаблоны чисел в папке TEMPLATE_FOLDER) и затем, изменяя входные данные (внося исправления в шаблоны из папки TEMPLATE_FOLDER), наблюдать за вычислением сети. Шаблоны сканируются автоматически. Список ожидаемого отклика формируется следующим образом: для i-ого шаблона i-ый элемент в списке выставляется равным единице, остальные нулю. """ set_option("base_neuron_store", PerseptronMockStoreService()) # имя нейронной сети. Участвует в формировании имен слоев NETWORK_NAME = "template_number" # папка с образами для обучения. Путь относительно текущей директории TEMPLATE_FOLDER = "digit_templates" # получаем список всех образов для обучения templates = folder_scan(os.path.join(RESOURCES_DIR, TEMPLATE_FOLDER)) templates.sort() # Для задания числа входных сигналов сети возьмем длину любого шаблона из списка len_input_data = len(NumberParser.parse(os.path.join(RESOURCES_DIR, TEMPLATE_FOLDER, templates[0]))[0]) # Создаем нулевой слой сети. # number_of_input_signal равен числу входных сигналов. # number_neurons_in_layer определяет число нейронов в слое и # так же число выходов самого слоя layer0 = Layer(name="{}#0".format(NETWORK_NAME), number_of_input_signal=len_input_data, number_neurons_in_layer=7) # При создании второго слоя в сети необходимо выставить number_of_input_signal # равным числу выходов предыдущего слоя. # Экспериментальное наблюдение: если число нейронов в данном слое (layer1) равно 10, # сеть учится наиболее быстро и более устойчива к помехам в образах