Day3 - RNN notas de aprendizagem da rede neural

Criando uma só camada RNN

import tensorflow as tf
import numpy as np

cell = tf.nn.rnn_cell.BasicRNNCell(num_units=128) # state_size = 128
print(cell.state_size) # 128

inputs = tf.placeholder(np.float32, shape=(32, 100)) # 32 是 batch_size,100是input_size  shape = (batch_size, input_size)
h0 = cell.zero_state(32, np.float32) # 通过zero_state得到一个全0的初始状态,形状为(batch_size, state_size)
output, h1 = cell.call(inputs, h0) #调用call函数

print(h1.shape) # (32, 128)

Criar um multi-camada RNN

import tensorflow as tf
import numpy as np
# 每调用一次这个函数就返回一个BasicRNNCell
def get_a_cell():
   return tf.nn.rnn_cell.BasicRNNCell(num_units=128)
# 用tf.nn.rnn_cell MultiRNNCell创建3层RNN,每层神经元具有128个
cell = tf.nn.rnn_cell.MultiRNNCell([get_a_cell() for _ in range(3)]) # 3层RNN
# 得到的cell实际也是RNNCell的子类
# 它的state_size是(128, 128, 128)
# (128, 128, 128)并不是128x128x128的意思
# 而是表示共有3个隐层状态,每个隐层状态的大小为128
print(cell.state_size) # (128, 128, 128)
# 使用对应的call函数
inputs = tf.placeholder(np.float32, shape=(32, 100)) # 32 是 batch_size
h0 = cell.zero_state(32, np.float32) # 通过zero_state得到一个全0的初始状态,得到的输出为128
output, h1 = cell.call(inputs, h0)
print(h1) # tuple中含有3个32x128的向量

Aprenda a executar um multi-passo: tf.nn.dynamic_rnn

# inputs: shape = (batch_size, time_steps, input_size) 
# cell: RNNCell
# initial_state: shape = (batch_size, cell.state_size)。初始状态。一般可以取零矩阵
# inputs: shape = (batch_size, time_steps, input_size) 
# cell: RNNCell
# initial_state: shape = (batch_size, cell.state_size)。初始状态。一般可以取零矩阵

import tensorflow as tf

tf.reset_default_graph() 
batch_size = 32 # batch大小
input_size = 100 # 输入向量xt维度
state_size = 128 # 隐藏状态ht维度
time_steps = 10 # 序列长度  训练的循环次数,即训练每个词的预示范围

inputs = tf.random_normal(shape=[batch_size, time_steps, input_size], dtype=tf.float32)
print("inputs.shape:",inputs.shape) #(32,10,100)

lstm_cell = tf.nn.rnn_cell.BasicLSTMCell(num_units = state_size)
print(lstm_cell.state_size) #(c=128,h=128)

initial_state = lstm_cell.zero_state(batch_size, dtype = tf.float32)
print(initial_state.h, initial_state.c)  #(32,128),(32,128)

outputs, state = tf.nn.dynamic_rnn(lstm_cell, inputs, initial_state = initial_state)

print(outputs)  #(32,10,128)
print(state)    #(32,128) state是最终(最后一个time_step)的状态
print(state.h, state.c) #(32,128),(32,128)


Melhor compreensão da resposta:

processamento de texto, uma palavra em nome de uma iteração, a inferência quando apenas uma palavra por saída de palavra, e quando o trem, temos uma frase inteira, para que possa alimentar um número de palavras, como o Google é melhor do que a Apple, timeStep 5, e formação de metas é melhor do que a Apple [FIM].
Autor: Você Yang
link: https: //www.zhihu.com/question/271774530/answer/364711129
Fonte: sabemos quase

Quase mais conhecido em questão:

Como entender o passo LSTM vez em? - A resposta de Você Yang - sei quase https://www.zhihu.com/question/271774530/answer/364711129 rever outros usuários melhor pergunta é a seguinte:

[1] com o som de pássaros vão todos (Pergunta): Se o trem quando o passo de tempo é 5, que o peso e as dimensões da latitude não deve passo de tempo consistente isso? Assim, no teste, apenas para o passo de tempo de entrada de dados 1, e o peso da latitude não corresponde ah?

HankGuo (resposta): Esta não é uma dimensão, uma vez que é uma rede neural recorrente, o número de ciclos é arbitrária, passo de tempo é o número de ciclos. Cada ciclo é uma palavra, a palavra é um vector de dimensão palavra. Também treinar e teste quando o passo de tempo não deve consistente. seq2seq código é maior do que 1, a descodificação é igual a 1.

Você Yang (resposta): Quando é que o treinamento como [batch_size, time_step, word_dim] dimensões dos dados, a última dimensão é a incorporação de vector de cada palavra, cada ciclo [batch_size, word_dim] entrou uma vez, para um time_step entrada total vezes.

[2] Xun Nisshin (perguntas): perguntar, time_step é a unidade número RNN fazer?

Você Yang (resposta): os dois não são uma coisa, o número de RNN está escondido camada e dimensão estado celular, passo de tempo é o número de ciclos.

[3] q boneca (Pergunta): Olá, perguntar, na sequência de tempo, time_step como entender? Aguardamos a sua resposta, muito obrigado!

Você Yang (Resposta): Você tem como [lote, t, w] de dados, a primeira dimensão é Batch, a segunda dimensão é o comprimento da frase, cada palavra na terceira incorporação dimensão que é, ele vai RNN tempos de ciclo t, cada tomar os últimos resultados do ciclo, e desta vez [lote, w] y como entrada.

[4] sonho de cavalos (pergunta): Olá, tenho uma pergunta a fazer ao lado, passo de tempo é 1, não deve ser entendido como um ex-dados com dados para prever? Mas este sentimento é muito complicado?

Você Yang (resposta): Por causa do estado oculto, antes dos dados é realmente um [estado escondido, x], que é a integração de informações antes.

LSTM exemplo simples

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

mnist = input_data.read_data_sets('MINIST_data', one_hot=True)
#读出mnist数据

weight = {
    # 128====>hidden cell num ;
    'first': tf.Variable(tf.random_normal([28, 128])),#输入层权值矩阵,转化为128输出,输入到RNN层中
    'last': tf.Variable(tf.random_normal([128, 10]))#输出层权值矩阵
}
#权重字典

bias = {
    'first': tf.Variable(tf.constant(0.1, shape=[128, ])),
    'last': tf.Variable(tf.constant(0.1, shape=[10, ]))
}


def RNN(X, weights, biases):#X是一个三维数据[batch_size, step , pixel]
    X = tf.reshape(X, shape=[-1, 28]) #重构输入数据集,转化为2维输入,[批,输入尺寸]
    X_in = tf.matmul(X, weight['first']) + bias['first'] #全连接层实现
    X_in = tf.reshape(X_in, shape=[-1, 28, 128])#经过全连接层后X = [batch_size , step , output],这里的step指图片的相关性,
    # 用前28个数据预测该值,也可以说是句子的长度

    lstm_cell = tf.nn.rnn_cell.BasicLSTMCell(num_units=128)#创建一个LSTMCell层,隐层神经元有128个,即有128个输出
    init_state = lstm_cell.zero_state(128, dtype=tf.float32)#创建初始状态矩阵


    outputs, state = tf.nn.dynamic_rnn(lstm_cell, X_in, initial_state=init_state, time_major=False)#进行一次
    '''
    tf.nn.dynamic_rnn(
    cell,
    inputs,
    sequence_length=None,
    initial_state=None,
    dtype=None,
    parallel_iterations=None,
    swap_memory=False,
    time_major=False,
    scope=None
tf.nn.dynamic_rnn的返回值有两个:outputs和state
为了描述输出的形状,先介绍几个变量,batch_size是输入的这批数据的数量,max_time就是这批数据中序列的最长长度,
如果输入的三个句子,那max_time对应的就是最长句子的单词数量,cell.output_size其实就是rnn cell中神经元的个数。

outputs是一个tensor
如果time_major==True,outputs形状为 [max_time, batch_size, cell.output_size ](要求rnn输入与rnn输出形状保持一致)
如果time_major==False(默认),outputs形状为 [ batch_size, max_time, cell.output_size ]

state是一个tensor。state是最终的状态,也就是序列中最后一个cell输出的状态。一般情况下state的形状为 [batch_size, cell.output_size ],
但当输入的cell为BasicLSTMCell时,state的形状为[2,batch_size, cell.output_size ],其中2也对应着LSTM中的cell state和hidden state
)
    '''

    # results = tf.matmul(final_state[1], weight['last']) + bias['last']
    results = tf.layers.dense(outputs[:, -1, :], 10)#全连接层实现,将RNN网络输出值转化为10个输出 全连接层执行操作 outputs = activation(inputs.kernel+bias)
    """
    tf.layers.dense(
    inputs,
    units,
    activation=None,
    use_bias=True,
    kernel_initializer=None,  ##卷积核的初始化器
    bias_initializer=tf.zeros_initializer(),  ##偏置项的初始化器,默认初始化为0
    kernel_regularizer=None,    ##卷积核的正则化,可选
    bias_regularizer=None,    ##偏置项的正则化,可选
    activity_regularizer=None,   ##输出的正则化函数
    kernel_constraint=None,   
    bias_constraint=None,
    trainable=True,
    name=None,  ##层的名字
    reuse=None  ##是否重复使用参数
)
    """
    return results


x = tf.placeholder(tf.float32, [None, 28, 28])#图片尺寸
y = tf.placeholder(tf.float32, [None, 10])#输出层尺寸

pred = RNN(x, weight, bias)
# loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels=pred, logits=y))
loss = tf.losses.softmax_cross_entropy(onehot_labels=y, logits=pred)#计算损失值,交叉熵
train = tf.train.AdamOptimizer(0.01).minimize(loss)#ADAM优化

correct_pred = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))#对比测试矩阵中与标签矩阵中的相等数量
"""tf.equal(A, B)是对比这两个矩阵或者向量的相等的元素,如果是相等的那就返回True,反正返回False,返回的值的矩阵维度和A是一样的
import tensorflow as tf
import numpy as np
A = [[1,3,4,5,6]]
B = [[1,3,4,3,2]]
with tf.Session() as sess:
    print(sess.run(tf.equal(A, B)))
输出:[[ True True True False False]]
2、tf.argmax(input, axis=None, name=None, dimension=None)
此函数是对矩阵按行或列计算最大值,输出最大值的下标
参数
input:输入Tensor
axis:0表示按列,1表示按行
name:名称
dimension:和axis功能一样,默认axis取值优先。新加的字段
返回:Tensor 一般是行或列的最大值下标向量
"""

accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))#计算正确率

init = tf.global_variables_initializer()#初始化placeholder

with tf.Session() as sess:#执行会话
    sess.run(init)
    step = 0
    for step in range(1200):
        step += 1
        batch_x, batch_y = mnist.train.next_batch(128)
        batch_x = batch_x.reshape([128, 28, 28])
        sess.run(train, feed_dict={x: batch_x, y: batch_y})

        if step % 50 == 0:
            print(sess.run(accuracy, feed_dict={x: batch_x, y: batch_y}))

https://blog.csdn.net/littlely_ll/article/details/79671393
RNN função analítica

Publicado 17 artigos originais · ganhou elogios 1 · vista 3426

Acho que você gosta

Origin blog.csdn.net/weixin_43983570/article/details/105174736
Recomendado
Clasificación