3日目 - RNNニューラルネットワークの学習ノート

単層の作成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)

多層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的向量

マルチステップを実行する方法を学ぶ: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)


良い答えを理解します:

テキスト処理、タイムステップの代わりに単語、推論時にワード出力によってのみ言葉;としたときに、このようなGoogleは、アップルよりも優れているなどの単語の数を、養うことができるように列車が、我々は、文全体を持っていますタイムステップ5、およびトレーニングの目標は、Apple [END]よりも優れています。
著者:あなたヤン
リンクします。https://www.zhihu.com/question/271774530/answer/364711129
出典:知っているほとんど

ほとんどより良い質問で知られています:

に時間ステップLSTMを理解するには? - あなたヤンの答えは - ほとんどhttps://www.zhihu.com/question/271774530/answer/364711129他のユーザーに確認を知って、より良い次のように質問です。

[1]鳥の音を持つすべての(質問)行く:列車場合、時間ステップは、重量及び緯度の寸法は、一貫したタイムステップそれはならないこと、5である場合?そう試験において、唯一のデータ入力時間ステップ1、及び緯度の重量のためにああ一致していませんか?

HankGuo(回答):これは、リカレントニューラルネットワークであるので、サイクルの数は任意であり、時間ステップは、サイクル数であり、寸法ではありません。各サイクルは、単語は、ディメンション・ワードのベクトルで、言葉です。また、訓練し、テスト時に時間ステップ一貫してはなりません。seq2seqコードが1より大きい場合、復号化は1に等しいです。

もしヤン(回答)としてトレーニング[BATCH_SIZE、time_step、word_dim]データの大きさ、最後の次元は、各単語のベクトルを埋め込むされるであろう場合、各サイクルは、[BATCH_SIZE、word_dim]は、総入力time_stepため、一度入力したであろう回。

[2]魯迅日清(質問):time_stepは数RNN単位は何である、頼みますか?

あなたヤン(答え):2は、RNNの数は層と細胞状態の寸法が隠されているものではありませんが、時間ステップは、サイクル数です。

[3] Q人形(質問):こんにちは、理解する方法を、時系列で、time_stepを頼みますか?お返事をお待ちしております、どうもありがとうございました!

もしヤン(回答):あなたが好きいる[バッチ、T、W]データ、第一次元がバッチで、第二次元は文の長さ、それがTサイクル時間をRNNであろう、ある三次元埋め込みの各ワードであり、各最後のサイクルの結果、このときの入力として[バッチ、W] Yを取ります。

[4]馬(質問)の夢:こんにちは、私は次の尋ねる質問があり、ステップが1にある時間は、予測するデータと元のデータとして理解されるべきではないでしょうか?しかし、この感覚は非常にトリッキーなのですか?

あなたヤン(答え):ので隠された状態の、データが実際にある前に[隠された状態で、x]は、それが前の情報の統合です。

LSTM簡単な例

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分析関数

公開された17元の記事 ウォンの賞賛1 ビュー3426

おすすめ

転載: blog.csdn.net/weixin_43983570/article/details/105174736