Зачем использовать RNN
Нейронная сеть с прямой связью
- Нейронная сеть с прямой связью — одна из самых простых нейронных сетей и одна из наиболее широко используемых и быстро развивающихся искусственных нейронных сетей.
- Нейроны расположены слоями, первый слой является входным слоем, затем скрытый слой, который может иметь несколько слоев, последний слой является выходным слоем.
- Слои полностью связаны, и между узлами каждого слоя нет связи.
- Нейроны каждого слоя связаны только с нейронами предыдущего слоя, принимают только выходные данные предыдущего слоя и передают их следующему слою, и между слоями нет обратной связи.
- Нейроны каждого слоя независимы друг от друга, как нейроны входного слоя независимы друг от друга.
- Общие нейронные сети с прямой связью включают однослойные нейронные сети с прямой связью, многослойные нейронные сети с прямой связью (DNN, многослойные персептроны) и CNN.
Недостатки нейронных сетей с прямой связью
Нейронные сети с прямой связью могут обрабатывать входные данные только один за другим. Между предыдущим входом и следующим входом нет никакой связи. Если они столкнутся с данными, которые необходимо обработать взаимосвязь между входами, они не смогут правильно предсказать входное значение, как в следующем примере:
-
Траектория мяча (набор точек движущегося процесса)
- Есть мяч, движущийся по плоскости, и мы хотим предсказать направление движения мяча.
- Если используется сеть прямой связи, то мы вводим в модель набор точек, но, поскольку она может обрабатывать только один вход, мы не можем предсказать направление следующей точки (т. е. направление движения мяча) на основе информация из предыдущего.
- Направление может быть предсказано только пассивно на основе всех входных данных (точек).Если неясно, где находится точка, направление не может быть правильно предсказано. Как показано ниже: мы знаем траекторию мяча, но не знаем, где мяч находится в данный момент.
-
обработка естественного языка
- Если мы введем предложение
我吃苹果
, если вы хотите предсказать его семантику, то он будет разбит на модель ввода слова - Если мы не знаем их порядок и обрабатываем их случайным образом, то мы не можем правильно предсказать семантику предложения.
- так как:
苹果吃我
,苹我吃果
и我吃苹果
совершенно разная семантика
- Если мы введем предложение
Определение РНН
Для приведенных выше данных, которые необходимо обрабатывать последовательно, в исходную полносвязную нейронную сеть добавляется понятие оси времени, то есть рождается рекуррентная нейронная сеть (РНС).
Рекуррентные нейронные сети (RNN) — это класс нейронных сетей, используемых для обработки данных последовательности. RNN имеет модуль памяти, который может получать и вычислять информацию и запоминать порядок выполнения. Даже один и тот же ввод будет давать разные результаты, если порядок ввода отличается.
Базовая структура RNN
Структура нейронной сети делится на входной слой, скрытый слой и выходной слой. Входной и выходной слои имеют дело с вводом и выводом данных, скрытый слой вычисляет и прогнозирует данные. Основное различие между сетью прямой связи и рекуррентной сетью (RNN) заключается в скрытом слое.
Простейшая нейронная сеть с прямой связью
В скрытом слое сети прямой связи, если есть только один нейрон, он будет обрабатываться напрямую; если есть несколько нейронов, каждый нейрон будет работать независимо, без какой-либо связи между порядком, ссылкой и передачей значения.
Структура РНН
Структура RNN состоит в том, чтобы добавить концепцию оси времени к скрытому слою сети прямой связи, чтобы каждая единица обрабатывалась в порядке ввода, а вывод предыдущей обработки использовался в качестве ввода следующей обработки. Рассчитывается вместе с текущими входными данными. Синтезируйте результаты вычислений предыдущих входных данных вместе с текущими входными данными, чтобы сделать прогноз.
Типы RNN (четыре формы структуры)
1 to N
В этой форме один заключается в том, чтобы вводить входную информацию в расчет модели только в начале последовательности (слева); другой - использовать входную информацию в качестве входа каждого этапа (справа), эта структура может обрабатывать такие как : особенности входного изображения и последовательность вывода y Является ли предложение или генерирует речь из другой категории, введите категорию, выведите описание таких проблем.
N to 1
Вход представляет собой последовательность, а выход — одно значение. Эта структура часто используется для решения задач классификации, таких как: ввод текста для определения категории, ввод предложения для определения эмоциональной тенденции и ввод изображения для определения категории.
N to N
Входная и выходная последовательности имеют одинаковую длину. Его можно использовать как простой Char RNN для создания статей, стихов и даже кода.
N to M
Эта структура, также известная как модель Encoder-Decoder и Seq2Seq, кодирует входные данные в вектор контекста c, а затем выводит предсказанную последовательность через c. Он широко используется в машинном переводе, обобщении текста, понимании прочитанного, создании диалогов и т. д.
Реализация РНН
Подготовьте набор данных и извлеките информацию об объектах как наиболее вводные данные.
Первым шагом в реализации RNN является подготовка набора данных, Далее следует формат обработки данных для классификации изображений.
(x_train, y_train) = dealImage()
# 处理数据格式,将图片数据x转化到-1到1之间(除以像素点最大值255),提高精确度
x_train = x_train.reshape(x_train.shape[0], 56, -1).astype('float') / 255.0
# 转换labels为one hot格式
y_train = np_utils.to_categorical(y_train, num_classes=num_classes)
# 同样的方法加载测试数据
(x_test, y_test) = dealTestImage()
# deal.py 处理图片分类时的数据预处理,读取图片数据和对应类别
def dealImage():
result = [(src, label)....] # 路径和类别的对应关系可以保存到本地文件或者数据库中,需要使用的时候在读取
images = []
labels = []
for row in result:
imsrc = cv2.imread(row[0], 0)
im = cv2.resize(imsrc, (56, 56), interpolation=cv2.INTER_AREA) # 转换数据格式(按自己需要的格式转换)
imgData = np.array(im) # numpy array化
images.append(imgData)
labels.append(row[1])
images = np.array(images)
labels = np.array(labels)
return (images, labels)
Построить структуру нейронной сети (от входа к выходу)
Согласно теории алгоритма прямого распространения, построить нейронную сеть RNN, выбрать соответствующее количество слоев и нейронов нейронной сети
- Создать модель
- Создание моделей Модели Keras делятся на последовательные модели и функциональные модели API.
- Последовательная модель представляет собой линейный стек из нескольких сетевых слоев, который может помочь нам быстро создать несколько простых моделей, и это модель, которую мы используем чаще всего.
- Функциональная API-модель — это способ определения сложных моделей (многовыходные модели, ориентированные ациклические графы, модели с общими слоями).
# 创建模型,当前模型比较简单无复杂的结构,使用顺序模型即可
model = Sequential()
cell_size = 300
- Построение нейронной сети
- Если входное измерение текущего слоя такое же, как выходное измерение предыдущего слоя, входное измерение можно опустить.
- (при создании нескольких слоев) на слой
SimpleRNN
должен быть установлен междуreturn_sequences=True
(по умолчаниюFalse
) - Функция активации также является очень тяжелой частью нейронной сети. Сетевой выход каждого уровня проходит через функцию активации.
- Общие функции активации:
softmax
,Softplus
,Relu
,tanh
,sigmod
,hard_sigmoid
,linear
- После отладки текущая модель
SimpleRNN
подходит для использованияtanh
функция, выходDense
слой подходит дляsoftmax
Сортировать
- Общие функции активации:
# 循环神经网络
model.add(SimpleRNN(
units=cell_size, # 输出数据的维度(当前层神经元的数目)
activation='tanh', # 激活函数,默认即tanh
return_sequences=True,
input_shape=(56, 56) # 输入数据的维度(shape)
))
model.add(SimpleRNN(units=cell_size, return_sequences=True))
model.add(SimpleRNN(units=cell_size, return_sequences=True))
# 每层SimpleRNN之间必须设置return_sequences=True(默认是False)
# return_sequences 是返回输出序列的最后一个输出(False),还是返回全部序列(True)
# return_sequences=True 表示我们需要完整的编码序列,而不仅仅是最终总结状态
# return_sequences=True 返回的是个多维数组,如果下一层无法接收该种多维数组,则层需要设置为return_sequences=True或者不设置取默认值
model.add(SimpleRNN(units=cell_size))
# 添加全连接层作为输出层
model.add(Dense(num_classes, activation='softmax'))
В нейронную сеть вводится большой объем признаковых данных, оптимизируются параметры нейронной сети и обучается модель
Используйте алгоритм обратного распространения для итеративного обучения модели, оптимизации параметров в соответствии с каждым результатом обучения и повторного обучения, пока не будет получена модель с наилучшими возможными результатами прогнозирования.
Алгоритм обратного распространения tensorflow и keras инкапсулированы, и метод может быть вызван напрямую
- Первым шагом является определение оптимизатора и функции потерь модели.
- Машинное обучение делится на две части: построение моделей и обучение моделей. Оптимизатор и функция потерь — два наиболее важных параметра для обучения модели.
- Оптимизатор используется для обновления и расчета параметров, влияющих на обучение и выход модели, Это выход модели, который приближается или достигает оптимального значения, тем самым минимизируя (максимизируя) значение функции потерь.
- Оптимизаторы это:
SGD
,Adagrad
,RMSprop
,Adam
- В этом примере обычно используется
Adam
алгоритм
- Оптимизаторы это:
- Функция потерь используется для оценки качества модели, то есть степени несоответствия между прогнозируемым значением и истинным значением.
- Функция потерь имеет
mse
,mae
,mape
,msle
,hinge
,categorical_crossentropy
и т.д - В этом примере используется кросс-энтропия, подходящая для классификации
categorical_crossentropy
функция
- Функция потерь имеет
# 初始化优化器
adam = Adam(lr=1e-4)
# 定义优化器,loss function,训练过程中计算准确率
model.compile(
optimizer=adam, # 优化器
loss='categorical_crossentropy', # 损失函数 mse 均方差 categorical_crossentropy 交叉熵(多分类)
metrics=['accuracy'] # 训练和测试期间的模型评估标准
)
- Входящие данные, вызовите метод модели keras, чтобы начать обучение
# 开始训练模型,调用model.fit()方法,方法采用时序后向传播算法训练模型
# 以给的数目的轮次训练模型,到第epochs轮结束训练,每轮多个批次,每批次大小batch_size
model.fit(x_train, y_train, batch_size=32, epochs=20)
# 预测模型的损失值和准确率
loss, accuracy = model.evaluate(x_test, y_test)
# 保存模型,以便使用时加载
model.save('myfile/rnn.hdf5')
результаты обучения
Используйте модели для прогнозирования и классификации данных
Загрузите сохраненную модель, введите прогноз для прогнозирования и выведите наиболее вероятный результат.
# 加载模型
model = load_model('myfile/rnn.hdf5')
# 使用模型预测结果
pred = model.predict(data) # data 是numpy的array格式
# 取出可能性最大的值作为预测结果
print([final.argmax() for final in pred])
Распространенные варианты RNN
Двунаправленная рекуррентная сеть (Bi-RNN)
При работе с информацией о последовательности иногда нам нужна не только предыдущая информация, но и более поздняя информация, такая как: предсказание我__苹果
Какое пропущенное слово в этом предложении, нам нужно предсказать по словарному запасу контекста. Bi-RNN может очень хорошо решить эту проблему, это относительно простая RNN, состоящая из двух RNN, наложенных друг на друга. Следовательно, его выход определяется совместно прямой RNN и обратной RNN, а его текущий выход (выход t-го шага) не только связан с предыдущей последовательностью, но и связан с последующей последовательностью.
Стекированные рекуррентные нейронные сети (SRNN)
SRNN представляет собой глубокий алгоритм, сформированный путем стекирования на основе полносвязной однослойной рекуррентной нейронной сети. Сеть имеет более мощное выражение и способность к обучению, но сложность также увеличивается, и требуется больше обучающих данных.
Сеть с долговременной кратковременной памятью (LSTM)
RNN имеют огромные трудности при работе с долгосрочными зависимостями (узлы, которые находятся далеко во временном ряду), потому что вычисление связей между узлами, которые находятся далеко, включает в себя многократное умножение матрицы Якоби, что приведет к исчезновению градиента. явление градиентной дилатации. LSTM — это специальная RNN, предложенная для решения проблемы долгосрочной зависимости, поэтому ее основной функцией является запоминание долгосрочной информации.
Закрытая рекуррентная установка (ГРУ)
GRU можно рассматривать как вариант LSTM, GRU заменяет ворота забывания и ввода в LSTM воротами обновления. Объединяя состояние ячейки и скрытое состояние ht, метод вычисления новой информации в текущий момент отличается от метода LSTM. Построение GRU проще и может сэкономить больше времени в случае больших обучающих данных.