首页 > 编程知识 正文

pytorch自定义数据集,双向长短期记忆网络

时间:2023-05-04 03:31:57 阅读:16388 作者:3949

不说多馀的话,直接看看代码吧~

打印(NP.shape (x ) ) (1920,45,20 ) ) ) ) ) )。

x=sequence.pad_sequences(x,maxlen=100,padding='post ' ) ) ) ) ) ) ) ) ) )。

打印(NP.shape (x ) ) (1920,100,20 ) )。

模型=sequential ()

model.add (掩蔽(mask _ value=0,input _ shape=(100,20 ) )

模型. add (lstm (128,dropout_W=0.5,dropout_U=0.5 ) )

模型. add (dense (13,activation='softmax ' ) )

model.com pile (loss=' categorical _ cross entropy ',

最佳化程式=' Adam ',

测量结果=[ ' accuracy ' ] )

#保存验证集误差最小的参数,当验证集误差减少时保存

check pointer=model check point (文件路径=' keras _ rnn.HD F5 ',verbose=1,save_best_only=True,)

历史=loss history (

result=model.fit(x,y,batch_size=10,

nb_epoch=500,verbose=1,validation_data=(testx,testY ),

callbacks=[checkpointer,history] )

model.save (keras _ rnn _ epochend.HD F5 ) )

补充知识: rnn(lstm )数据格式及填充操作处理变长的时序dynamic_rnn

萨马利

RNN

与示例一样,计算出的状态值和输出结构一致。 也就是说,如果当前输入值也与前面的状态值相同,则当前状态值和当前输出结果一致。 这是因为当前的培训没有更新权重参数和偏置

RNN最终状态值与最终时刻的输出值一致

输入数据请求格式为shape=(batch_size,step_time_size,input_size ),state的shape=) batch_size,state_size output的shape=(batch_size、step_time_size、state_size )和最后一个有效输出(有效序列长度,不包含填充的部分)与状态值相同

LSTM

LTM与RNN大致匹配,但其状态有两个c_state和h_state,与它们的shape一样,输出值output的最后一个有效输出与h_state匹配

对于可变长度RNN训练,输入格式必须保持shape=(batch_size、step_time_size、input_size ) ),但每个批次中每个样本的有效方案

应该注意,无效序列长度部分的所有填充并不是因为0而输出全部为0,而是状态不变化,这是因为输出值和状态值的计算不仅取决于当前时间点的输入值,还取决于上一时间点的状态值。 其内部原理是使用掩码矩阵来标记有效部分和无效部分,而不必在无效部分进行计算。 也就是说,这一部分不是反向传播时参数的更新。 当然,如果填充不为零,则填充的这一部分的输出和状态也与填充为零的结果相同

''''

#示例数据以(batch_size,time_step_size,input_size[embedding_size] )的形式,其中samples=4,timesteps=3

''''

导入pandas as PD

import numpy as np

导入tensor flow as TF

train _ x=NP.array ([ [ 0,1,2 ],[ 9,8,7 ],[ 3,6,8 ],

[ 3,4,5 ],[ 0,10,110 ],[ 0,0,0 ],

[ 6,7,8 ],[ 6,5,4 ],[ 1,7,4 ],

[ 9,0,1 ]、[ 3,7,4 ]、[ 0,0,0 ]、

[ 9,0,1 ],[ 3,3,4 ],[ 0,0,0 ] ]

] )

sequence _ length=[ 3,1,3,2,2 ]

train_X.shape,train _ x [ :2:3, ].RES

hape(5, 3)

tf.reset_default_graph()

x = tf.placeholder(tf.float32, shape=(None, 3, 3)) # 输入数据只需能够迭代并符合要求shape即可,list也行,shape不指定表示没有shape约束,任意shape均可

rnn_cell = tf.nn.rnn_cell.BasicRNNCell(num_units=6) # state_size[hidden_size]

lstm_cell = tf.nn.rnn_cell.BasicLSTMCell(num_units=6) # state_size[hidden_size]

outputs1, state1 = tf.nn.dynamic_rnn(rnn_cell, x, dtype=tf.float32, sequence_length=sequence_length)

outputs2, state2 = tf.nn.dynamic_rnn(lstm_cell, x, dtype=tf.float32, sequence_length=sequence_length)

with tf.Session() as sess:

sess.run(tf.global_variables_initializer()) # 初始化rnn_cell中参数变量

outputs1, state1 = sess.run((outputs1, state1), feed_dict={x: train_X})

outputs2, state2 = sess.run([outputs2, state2], feed_dict={x: train_X})

print(outputs1.shape, state1.shape) # (4, 3, 5)->(batch_size, time_step_size, state_size), (4, 5)->(batch_size, state_size)

print(outputs2.shape) # state2为LSTMStateTuple(c_state, h_state)

print("---------output1state1-----------")

print(outputs1) # 可以看出output1的最后一个时刻的输出即为state1, 即output1[:,-1,:]与state1相等

print(state1)

print(np.all(outputs1[:,-1,:] == state1))

print("---------output2state2-----------")

print(outputs2) # 可以看出output2的最后一个时刻的输出即为LSTMStateTuple中的h

print(state2)

print(np.all(outputs2[:,-1,:] == state2[1]))

再来怼怼dynamic_rnn中数据序列长度tricks

思路样例代码

from collections import Counter

import numpy as np

origin_data = np.array([[1, 2, 3],

[3, 0, 2],

[1, 1, 4],

[2, 1, 2],

[0, 1, 1],

[2, 0, 3]

])

# 按照指定列索引进行分组(看作RNN中一个样本序列),如下为按照第二列分组的结果

# [[[1, 2, 3], [0, 0, 0], [0, 0, 0]],

# [[3, 0, 2], [2, 0, 3], [0, 0, 0]],

# [[1, 1, 4], [2, 1, 2], [0, 1, 1]]]

# 第一步,将原始数据按照某列序列化使之成为一个序列数据

def groupby(a, col_index): # 未加入索引越界判断

max_len = max(Counter(a[:, col_index]).values())

for i in set(a[:, col_index]):

d[i] = []

for sample in a:

d[sample[col_index]].append(list(sample))

# for key in d:

# d[key].extend([[0]*a.shape[1] for _ in range(max_len-len(d[key]))])

return list(d.values()), [len(_) for _ in d.values()]

samples, sizes = groupby(origin_data, 2)

# 第二步,根据当前这一批次的中最大序列长度max(sizes)作为padding标准(不同批次的样本序列长度可以不一样,但同一批次要求一样(包括padding的部分)),当然也可以一次性将所有样本(不按照批量)按照最大序列长度padding也行,可能空间浪费

paddig_samples = np.zeros([len(samples), max(sizes), 3])

for seq_index, seq in enumerate(samples):

paddig_samples[seq_index, :len(seq), :] = seq

paddig_samples

以上这篇keras在构建LSTM模型时对变长序列的处理操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持云海天教程。

原文链接:https://blog.csdn.net/xinfeng2005/article/details/68926800

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。