Понимание нейронной сети
Что такое нейронная сеть
Нейронная сеть – это вычислительный алгоритм, который используется при создании моделей глубокого обучения для прогнозов и классификаций. Он основан на самообучении и обучении, а не на прямом программировании.
Нейронные сети сделаны по образу и подобию центральной нервной системы человека; нейронные сети имеют соединенные узлы, которые очень похожи на нейроны в человеческом теле.
Нейронная сеть
В этой статье я построю нейронную сеть с использованием глубокого обучения, чтобы вы поняли, как работают нейронные сети.
Архитектура нейронной сети
Чтобы спроектировать архитектуру нейронной сети, вам нужно определить, сколько скрытых слоев будет в вашей нейронной сети. Я построю нейронную сеть с двумя скрытыми слоями. Определение количества скрытых слоев в ваших нейронных сетях является частью архитектурного проектирования нейронной сети. Роль каждого скрытого слоя нейронных сетей состоит в том, чтобы преобразовать входные данные во что-то, с чем может работать выходной слой.
Скрытый слой 1
Входной слой и скрытый слой 1
В процессе вам также необходимо определить, сколько узлов будет присутствовать в скрытом слое. Эти узлы также называются нейронами. На рисунке выше каждый нейрон представлен кружком. В скрытом слое каждый нейрон соответствует слову в наборе данных. Каждый нейрон имеет значение веса, и на этапе подготовки нейрон изменяет эти значения, чтобы получить наиболее точный результат.
Скрытый слой два
Скрытый слой номер два делает то же самое, что и скрытый слой номер один, но теперь вход скрытого слоя два является выходом скрытого слоя номер один.
Выходной слой
И вот, наконец, мы подошли к выходному слою. В выходном слое вы будете использовать горячую кодировку, чтобы увидеть результаты слоев. В этом процессе кодировки только один бит будет иметь значение «1», а все остальные будут иметь значение «0». Например, если мы кодируем три случайные категории:
Категория |
значение |
спорт |
001 |
пространство |
010 |
компьютерная графика |
100 |
Классификация текста с помощью нейронных сетей
Теперь я построю нейронную сеть, чтобы показать вам, как она работает. Набор данных, который я буду использовать здесь, содержит много текстов на английском языке. Теперь я буду манипулировать этими данными, чтобы передать их в нейронную сеть.
import numpy as np #numpy is a package for scientific computing from collections import Counter vocab = Counter() text = "Hi from Brazil" #Get all words for word in text.split(' '): vocab[word]+=1 #Convert words to indexes def get_word_2_index(vocab): word2index = {} for i,word in enumerate(vocab): word2index[word] = i return word2index #Now we have an index word2index = get_word_2_index(vocab) total_words = len(vocab) #This is how we create a numpy array (our matrix) matrix = np.zeros((total_words),dtype=float) #Now we fill the values for word in text.split(): matrix[word2index[word]] += 1 print(matrix)
Результат:
[ 1. 1. 1.]
В приведенном выше коде текст был «Привет из Бразилии», а матрица выдала [1. 1. 1.]. Что, если бы текст был только «Hi»?
matrix = np.zeros((total_words),dtype=float) text = "Hi" for word in text.split(): matrix[word2index[word.lower()]] += 1 print(matrix)
Результат:
[ 1. 0. 0.]
Теперь я проделаю то же самое с метками, здесь вы увидите, что означает горячая кодировка:
y = np.zeros((3),dtype=float) if category == 0: y[0] = 1. # [ 1. 0. 0.] elif category == 1: y[1] = 1. # [ 0. 1. 0.] else: y[2] = 1. # [ 0. 0. 1.]
Теперь давайте поработаем с набором данных для построения нейронных сетей. Начнем с загрузки набора данных:
from sklearn.datasets import fetch_20newsgroups categories = ["comp.graphics","sci.space","rec.sport.baseball"] newsgroups_train = fetch_20newsgroups(subset='train', categories=categories) newsgroups_test = fetch_20newsgroups(subset='test', categories=categories)
Модель обучения для построения нейронной сети
На языке нейронных сетей одна эпоха означает один прямой проход, что означает получение выходных значений и одно обратное прохождение всех обучающих выборок.
n_input = total_words # Words in vocab n_classes = 3 # Categories: graphics, sci.space and baseball input_tensor = tf.placeholder(tf.float32,[None, n_input],name="input") output_tensor = tf.placeholder(tf.float32,[None, n_classes],name="output")
Теперь разделю обучающие данные на партии:
training_epochs = 10 # Launch the graph with tf.Session() as sess: sess.run(init) #inits the variables (normal distribution, remember?) # Training cycle for epoch in range(training_epochs): avg_cost = 0. total_batch = int(len(newsgroups_train.data)/batch_size) # Loop over all batches for i in range(total_batch): batch_x,batch_y = get_batch(newsgroups_train,i,batch_size) # Run optimization op (backprop) and cost op (to get loss value) c,_ = sess.run([loss,optimizer], feed_dict={input_tensor: batch_x, output_tensor:batch_y})
Итак, мы обучили нашу модель для нейронных сетей, теперь давайте протестируем нашу модель, посмотрев на ее точность.
# Test model index_prediction = tf.argmax(prediction, 1) index_correct = tf.argmax(output_tensor, 1) correct_prediction = tf.equal(index_prediction, index_correct) # Calculate accuracy accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float")) total_test_data = len(newsgroups_test.target) batch_x_test,batch_y_test = get_batch(newsgroups_test,0,total_test_data) print("Accuracy:", accuracy.eval({input_tensor: batch_x_test, output_tensor: batch_y_test}))
Результат:
Epoch: 0001 loss= 1133.908114347
Epoch: 0002 loss= 329.093700409
Epoch: 0003 loss= 111.876660109
Epoch: 0004 loss= 72.552971845
Epoch: 0005 loss= 16.673050320
Epoch: 0006 loss= 16.481995190
Epoch: 0007 loss= 4.848220565
Epoch: 0008 loss= 0.759822878
Epoch: 0009 loss= 0.000000000
Epoch: 0010 loss= 0.079848485
Optimization Finished! Accuracy: 0.75
И, наконец, мы создали модель глубокого обучения с использованием нейронных сетей для классификации текстов по категориям.