Как мне написать псевдоалгоритм для любой модели глубокого обучения?
Я просматривал несколько статей глубокого обучения на графике, и есть псевдоалгоритм для сетевой архитектуры, Пример:
Это общая архитектура, описанная в статье.
Я хочу написать один псевдоалгоритм для одной пользовательской сети, Структура сети очень проста, Это классификация предложений с использованием динамическогоrnn.
Input is sentence [ batch_size x max_sentence_length x embedding_dim ]
labels are [ batch_size ]
сеть отправляет предложения в rnn и получает векторы объектов после отправки этого вектора функций в одну другую нано-сеть для части внимания и получения вектора внимания, после получения вектора внимания добавьте один плотный слой для изменения формывекторы признаков и получают значения вероятности в форме [batch_size]
Итак, нано-сеть:
import numpy as np
#simple soft attention
def nano_network( logits, lstm_units ):
# just for example
logits_ = tf.reshape(logits,[-1, lstm_units])
attention_size = tf.get_variable(name='attention_size',
shape=[lstm_units,1],
dtype=tf.float32,
initializer=tf.random_uniform_initializer(-0.01,0.01))
attention_matmul = tf.matmul(logits_,attention_size)
output_reshape = tf.reshape(attention_matmul,[tf.shape(logits)[0],tf.shape(logits)[1],-1])
return tf.squeeze(output_reshape)
Простая сеть рН:
import tensorflow as tf
#simple network
class Base_model(object):
def __init__(self):
tf.reset_default_graph()
# define placeholders
self.sentences = tf.placeholder(tf.float32, [12, 50, 10], name='sentences') # batch_size x max_sentence_length x dim
self.targets = tf.placeholder(tf.int32, [12], name='labels' )
with tf.variable_scope('dynamic_rnn') as scope:
cell = tf.nn.rnn_cell.LSTMCell(num_units=5, state_is_tuple=True)
outputs, _states = tf.nn.dynamic_rnn(cell, self.sentences, dtype=tf.float32)
#attention function
self.output_s = nano_network(outputs,5)
# simple linear projection
self.output = tf.layers.dense(self.output_s,2)
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=self.targets,logits=self.output)
#loss calculation
loss = tf.reduce_mean(cross_entropy)
#train / network weights update
self.train = tf.train.AdamOptimizer().minimize(loss)
self.out = { 'loss':loss, 'train':self.train }
Если кто-то хочет запуститьэтот код, вот случайные значения для тестирования кода:
# #model train
# def rand_exec(model):
# with tf.Session() as sess:
# sess.run(tf.global_variables_initializer())
# for i in range(100):
# loss_ = sess.run(model.out,
# feed_dict = {
# model.sentences : np.random.randint(0, 10, [12,50,10]),
# model.targets : np.random.randint(0, 2, [12] )})
# print(loss_['loss'])
# # wdim, hdim, vocab_size, num_labels,threshold,relation_embeddings,relation_dim,t,adj_file
# if __name__ == '__main__':
# model = Base_model()
# out = rand_exec(model)
Теперь я хочу написать псевдо-алгоритм для этого сиmple network.
Я пытался преобразовать эту сетевую архитектуру в псевдоалгоритм. Вот мой псевдокод:
Вот текстовый формат этого алгоритма
Но я запутался, если он правильный или нет, как правило обновления параметров и другие вещи в алгоритме.
Я был бы очень признателен, если кто-нибудьдайте мне несколько советов о том, как написать псевдоалгоритм для этой сетевой архитектуры.
Спасибо!