Понимание нейронной сети
Что такое нейронная сеть
Нейронная сеть – это вычислительный алгоритм, который используется при создании моделей глубокого обучения для прогнозов и классификаций. Он основан на самообучении и обучении, а не на прямом программировании.
Нейронные сети сделаны по образу и подобию центральной нервной системы человека; нейронные сети имеют соединенные узлы, которые очень похожи на нейроны в человеческом теле.

Нейронная сеть
В этой статье я построю нейронную сеть с использованием глубокого обучения, чтобы вы поняли, как работают нейронные сети.
Архитектура нейронной сети
Чтобы спроектировать архитектуру нейронной сети, вам нужно определить, сколько скрытых слоев будет в вашей нейронной сети. Я построю нейронную сеть с двумя скрытыми слоями. Определение количества скрытых слоев в ваших нейронных сетях является частью архитектурного проектирования нейронной сети. Роль каждого скрытого слоя нейронных сетей состоит в том, чтобы преобразовать входные данные во что-то, с чем может работать выходной слой.
Скрытый слой 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
И, наконец, мы создали модель глубокого обучения с использованием нейронных сетей для классификации текстов по категориям.



