Реализация проекта и памятка…
Рекуррентные нейронные сети ( RNN), первоначально созданные в 1980-х годах, представляют собой мощный и надежный тип нейронной сети, в которой выходные данные предыдущего шага используются в качестве входных данных для текущего шага. Самая важная особенность RNN - это скрытое состояние, и у них есть память, которая запоминает каждую информацию во времени. В рекуррентных нейронных сетях мы используем результат, полученный через скрытые слои, для обработки будущих входных данных, как показано на диаграмме ниже.
Предпочтительный алгоритм для последовательных данных - финансовых данных, аудио, видео, данных временных рядов, речи, текста и т. Д.
Keras - очень мощная библиотека Python с открытым исходным кодом, которая работает поверх других машинных библиотек с открытым исходным кодом, таких как TensorFlow, Theano и т. Д., Используется для разработки и оценки моделей глубокого обучения и использует различные методы оптимизации.
Функции -
- Keras полностью поддерживает рекуррентные нейронные сети и сверточные нейронные сети.
- Keras плавно работает как на процессоре, так и на графическом процессоре
- Keras NN написаны на Python, который выступает за простоту и большие возможности отладки.
- Керас известен своей невероятно выразительной, гибкой, минималистичной структурой.
- Keras - последовательный, простой и расширяемый API
- Керас также известен своей высокой вычислительной масштабируемостью.
- Обширная поддержка различных платформ и бэкендов
В этом проекте мы будем обучать последовательность (математическое выражение) последовательности рекуррентной нейронной сети для реализации / решения простых математических операций путем создания, обучения и оценки простой модели рекуррентной нейронной сети.
Импортируйте все необходимые библиотеки
import numpy as np from tensorflow.keras.models import Sequential from tensorflow.keras.layers import TimeDistributed, Dense, Dropout, SimpleRNN, RepeatVector from tensorflow.keras.callbacks import EarlyStopping, LambdaCallback from termcolor import colored
Генерировать данные
all_chars='0123456789+' num_features = len(all_chars) print('no of features:', num_features) char_to_index= dict((c,i) for i,c in enumerate(all_chars)) index_to_char= dict((i,c) for i, c in enumerate(all_chars))
Выход -
no of features: 11 def generate_data(): first = np.random.randint(0,100) second = np.random.randint(0,100) example = str(first)+ '+' + str(second) label = str(first+second) return example, label generate_date()
Выход -
('52+3', '55')
Создать модель
hidden_units=128 max_time_steps=5 model = Sequential([ SimpleRNN(hidden_units,input_shape=(None,num_features)), RepeatVector(max_time_steps), SimpleRNN(hidden_units,return_sequences=True), TimeDistributed(Dense(num_features,activation='softmax')) ] ) model.compile( loss='categorical_crossentropy', optimizer = 'adam', metrics=['accuracy'] ) model.summary()
Выход -
Layer (type) Output Shape Param # ================================================================= simple_rnn_4 (SimpleRNN) (None, 128) 17920 _________________________________________________________________ repeat_vector_2 (RepeatVecto (None, 5, 128) 0 _________________________________________________________________ simple_rnn_5 (SimpleRNN) (None, 5, 128) 32896 _________________________________________________________________ time_distributed_2 (TimeDist (None, 5, 11) 1419 ================================================================= Total params: 52,235 Trainable params: 52,235 Non-trainable params: 0 _________________________________________________________________
Векторизация и девекторизация данных
def vectorize_example(example,label): x=np.zeros((max_time_steps,num_features)) y=np.zeros((max_time_steps,num_features)) diff_x = max_time_steps - len(example) diff_y = max_time_steps - len(label) for i,c in enumerate(example): x[i+diff_x,char_to_index[c]] =1 for i in range(diff_x): x[i,char_to_index['0']] = 1 for i,c in enumerate(label): y[i+diff_y,char_to_index[c]] =1 for i in range(diff_y): y[i,char_to_index['0']] = 1 return x,y e, l = generate_data() print(e,l) x,y= vectorize_example(e,l) print(x.shape,y.shape)
Выход -
26+32 58 (5, 11) (5, 11) def devectorize_example(example): result = [index_to_char[np.argmax(vec)] for i,vec in enumerate(example)] return ''.join(result) devectorize_example(x)
Выход -
'26+32' devectorize_example(y)
Выход -
'00058'
Создать набор данных
def create_dataset(num_examples=2000): x=np.zeros((num_examples,max_time_steps,num_features)) y=np.zeros((num_examples,max_time_steps,num_features)) for i in range(num_examples): e,l = generate_data() e_v, l_v = vectorize_example(e,l) x[i] = e_v y[i] = l_v return x,y x,y = create_dataset() print(x.shape,y.shape)
Выход -
(2000, 5, 11) (2000, 5, 11) devectorize_example(x[0]) devectorize_example(y[0])
Выход -
'38+68' '00106'
Обучение модели
l_cb=LambdaCallback( on_epoch_end = lambda e,l: print('{:.2f}'.format(l['val_acc']),end=' _ ') ) es_cb=EarlyStopping(monitor='val_loss',patience=10) model.fit(x,y,epochs=500,batch_size=256,validation_split=0.2, verbose=False,callbacks=[es_cb,l_cb])
Выход -
0.58 _ 0.58 _ 0.61 _ 0.61 _ 0.62 _ 0.62 _ 0.63 _ 0.63 _ 0.63 _ 0.64 _ 0.64 _ 0.66 _ 0.64 _ 0.65 _ 0.66 _ 0.65 _ 0.67 _ 0.68 _ 0.67 _ 0.69 _ 0.68 _ 0.69 _ 0.70 _ 0.70 _ 0.71 _ 0.71 _ 0.72 _ 0.72 _ 0.71 _ 0.73 _ 0.73 _ 0.71 _ 0.74 _ 0.75 _ 0.73 _ 0.75 _ 0.75 _ 0.75 _ 0.76 _ 0.76 _ 0.76 _ 0.75 _ 0.77 _ 0.77 _ 0.77 _ 0.77 _ 0.78 _ 0.77 _ 0.78 _ 0.78 _ 0.78 _ 0.79 _ 0.79 _ 0.80 _ 0.80 _ 0.79 _ 0.82 _ 0.82 _ 0.83 _ 0.82 _ 0.82 _ 0.84 _ 0.84 _ 0.84 _ 0.85 _ 0.85 _ 0.85 _ 0.86 _ 0.85 _ 0.86 _ 0.86 _ 0.87 _ 0.88 _ 0.88 _ 0.88 _ 0.88 _ 0.89 _ 0.89 _ 0.90 _ 0.90 _ 0.90 _ 0.90 _ 0.89 _ 0.90 _ 0.90 _ 0.90 _ 0.90 _ 0.92 _ 0.91 _ 0.91 _ 0.92 _ 0.92 _ 0.92 _ 0.91 _ 0.92 _ 0.92 _ 0.92 _ 0.92 _ 0.92 _ 0.92 _ 0.93 _ 0.92 _ 0.93 _ 0.92 _ 0.93 _ 0.94 _ 0.93 _ 0.93 _ 0.93 _ 0.93 _ 0.93 _ 0.94 _ 0.94 _ 0.94 _ 0.94 _ 0.94 _ 0.94 _ 0.94 _ 0.95 _ 0.94 _ 0.95 _ 0.95 _ 0.94 _ 0.94 _ 0.94 _ 0.95 _ 0.94 _ 0.95 _ 0.95 _ 0.95 _ 0.95 _ 0.95 _ 0.95 _ 0.95 _ 0.95 _ 0.95 _ 0.95 _ 0.95 _ 0.95 _ 0.95 _ 0.95 _ 0.95 _ 0.95 _ 0.95 _ 0.95 _ 0.95 _ 0.95 _ 0.95 _ 0.95 _ 0.95 _ 0.95 _ 0.95 _ 0.95 _ 0.95 _ 0.95 _ 0.95 _ x_test,y_test = create_dataset(10) preds = model.predict(x_test) for i,pred in enumerate(preds): y=devectorize_example(y_test[i]) y_hat = devectorize_example(pred) col='green' if y!= y_hat: col='red' out='Input: '+ devectorize_example(x_test[i])+' Out: ' +y+'Pred:' +y_hat print(colored(out,col))
Выход -
Input: 82+54 Out: 00136 Pred:00136 Input: 60+81 Out: 00141 Pred:00141 Input: 15+99 Out: 00114 Pred:00114 Input: 00+10 Out: 00010 Pred:00012 Input: 090+1 Out: 00091 Pred:00090 Input: 20+24 Out: 00044 Pred:00044 Input: 55+29 Out: 00084 Pred:00084 Input: 36+47 Out: 00083 Pred:00083 Input: 10+12 Out: 00022 Pred:00022 Input: 71+56 Out: 00127 Pred:00127
Шпаргалка по RNN: https://stanford.edu/~shervine/teaching/cs-230/cheatsheet-recurrent-neural-networks
Продолжайте учиться и писать код;)