Изменения

Перейти к: навигация, поиск

Нейронные сети, перцептрон

3660 байт добавлено, 22:33, 16 января 2019
м
done
'''Искусственная нейронная сеть (ИНС)''' (англ. ''Artificial neural network (ANN)'') {{---}} это упрощенная модель биологической нейронной сети, представляющая собой совокупность искусственных нейронов, взаимодействующих между собой.
Основные принципы работы нейронные сетей были описаны еще в 1943 году Уорреном Мак-Каллоком и Уолтером Питтсом<ref>[https://en.wikipedia.org/wiki/Artificial_neuron Artificial neuron, Wikipedia]</ref>. В 1958 1957 году нейрофизиолог Фрэнк Розенблатт разработал первую нейронную сеть<ref>[https://en.wikipedia.org/wiki/Perceptron Perceptron, Wikipedia]</ref>, а в 2010 году большие объемы данных для обучения открыли возможность использовать нейронные сети для машинного обучения.
На данный момент нейронные сети используются в многочисленных областях машинного обучения и решают проблемы различной сложности.
===Обучение перцептрона===
Задача обучения перцептрона {{---}} подобрать такие <tex>w_0, w_1, w_2, \ldots, w_n</tex>, чтобы <tex>sign(\sigma(w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n))</tex> как можно чаще совпадал с <tex>y(x)</tex> {{---}} значением в обучающей выборке (здесь <tex>\sigma</tex> {{---}} функция активации). Для удобства, чтобы не тащить за собой свободный член <tex>w_0</tex>, добавим в вектор $x$ лишнюю <<виртуальную размерность>> «виртуальную размерность» и будем считать, что <tex>x = (1, x_1, x_2, \ldots, x_n)</tex>. Тогда <tex>w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n</tex> можно заменить на <tex>w^T \cdot x</tex>.
Чтобы обучать эту функцию, сначала надо выбрать функцию ошибки, которую потом можно оптимизировать [[Стохастический градиентный спуск|градиентным спуском]]<sup>[на 16.01.19 не создан]</sup>. Число неверно классифицированных примеров не подходит на эту кандидатуру, потому что эта функция кусочно-гладкая, с массой разрывов: она будет принимать только целые значения и резко меняться при переходе от одного числа неверно классифицированных примеров к другому. Поэтому использовать будем другую функцию, так называемый ''критерий перцептрона'': <tex>E_P(w) = -\sum_{x \in M} y(x)(\sigma(w^T \cdot x))</tex>, где <tex>M</tex> {{---}} множество примеров, которые перцептрон с весами <tex>w</tex> классифицирует неправильно.
* Прогнозирование и распознавание образов
* Управление агентами<ref>[https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD%D0%BE%D0%B2 Применения перцептрона, Wikipedia]</ref>
 
===Пример использования с помощью scikit-learn<ref>[https://scikit-learn.org Библиотека scikit-learn для Python]</ref>===
 
Будем классифицировать с помощью перцептрона датасет iris<ref>[https://en.wikipedia.org/wiki/Iris_flower_data_set Датасет iris]</ref>.
 
# Load required libraries
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import Perceptron #Single-layer perceptron
from sklearn.neural_network import MLPClassifier #Multilayer perceptron
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import numpy as np
 
# Load the iris dataset
iris = datasets.load_iris()
 
# Create our X and y data
X = iris.data
y = iris.target
 
# Split the data into 70% training data and 30% test data
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
 
# Train the scaler, which standarizes all the features to have mean=0 and unit variance
sc = StandardScaler()
sc.fit(X_train)
 
# Apply the scaler to the X training data
X_train_std = sc.transform(X_train)
 
# Apply the SAME scaler to the X test data
X_test_std = sc.transform(X_test)
 
# Create a single-layer perceptron object with the parameters: 40 iterations (epochs) over the data, and a learning rate of 0.1
ppn = Perceptron(n_iter=40, eta0=0.1, random_state=0)
# Create a multilayer perceptron object
mppn = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(5, 2), random_state=1)
 
# Train the perceptrons
ppn.fit(X_train_std, y_train)
mppn.fit(X_train_std, y_train)
 
# Apply the trained perceptrons on the X data to make predicts for the y test data
y_pred = ppn.predict(X_test_std)
multi_y_pred = mppn.predict(X_test_std)
 
# View the accuracies of the model, which is: 1 - (observations predicted wrong / total observations)
print('Accuracy: %.2f' % accuracy_score(y_test, y_pred))
print('Accuracy: %.2f' % accuracy_score(y_test, multi_y_pred))
 
===Пример использования с помощью tensorflow<ref>[https://www.tensorflow.org/ Библиотека tensorflow для Python]</ref>===
 
Будем классифицировать цифры из датасета MNIST<ref>[https://en.wikipedia.org/wiki/MNIST_database Датасет MNIST]</ref>.
 
# Load required libraries
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
 
#Load MNIST dataset
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
 
#placeholder for test data
x = tf.placeholder(tf.float32, [None, 784])
#placeholder for weights and bias
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
#tensorflow model
y = tf.nn.softmax(tf.matmul(x, W) + b)
#loss function
y_ = tf.placeholder(tf.float32, [None, 10])
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
 
#gradient descent step
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
 
init = tf.initialize_global_variables()
sess = tf.Session()
sess.run(init)
for i in range(1000):
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print("Accuracy: %s" % sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))
==См. также==
* Сергей Николенко, Артур Кадурин, Екатерина Архангельская. Глубокое обучение. Погружение в мир нейронных сетей. — «Питер», 2018. — С. 93-123.
* [https://neuralnet.info/book/ Нейронные сети {{---}} учебник ]
* [https://scikit-learn.org/ Документация по библиотеке scikit-learn ]
[[Категория: Машинное обучение]]
[[Категория: Глубокое обучение]]
69
правок

Навигация