其实是在工作时用到的一个代码,一开始仅仅为了快点写出来,处理的也是小数据,就写了惨不忍睹的一版。后来换了大数据了,需要跑两三分钟的数据预处理,这样的时间就是不能接受的了。
所以花了一上午+下午半个小时写了改进后的,现在也就需要10秒左右,做训练和测试都快了特别多。这样的任务场景估计不少见,但相应的函数却没有。所以在这里做个记录,也方便以后取用
可以简单修改后直接用哦
def newCutOff(List,leng,Type):
a = []
for i in range(len(List)):
a.extend([List[i][j: j + leng] for j in range(0, len(List[i]), leng)])
seq_len = []
for i in range(len(a)):
seq_len.extend([len(a[i])])
for i in range(len(a)):
if len(a[i])<leng:
if Type=='x':
a[i].extend([wordVector[0] for i in range(leng-len(a[i]))])
if Type=='y':
a[i].extend([0 for i in range(leng-len(a[i]))])
return a,seq_len
测试结果大概是这样的,还可以自己改
你想分析分析什么是能运行的屎?。。
def cutOff(a,leng,Type):
import copy
temp = copy.deepcopy(a)
iter_num_count = 0
for i in range(len(temp)):
del a[iter_num_count]
if len(temp[i]) / leng > int(len(temp[i]) / leng):
iter_num = int(len(temp[i]) / leng) + 1
elif len(temp[i]) / leng==int(len(temp[i]) / leng):
iter_num = int(len(temp[i]) / leng)
elif len(temp[i]) / leng < int(len(temp[i]) / leng):
assert (1 == -1)
for j in range(iter_num):
a.insert(iter_num_count, temp[i][0 + leng * j:leng + leng * j])
iter_num_count += iter_num
seq_len = copy.deepcopy(a)
for i in range(len(a)):
seq_len[i] = len(seq_len[i])
for i in range(len(a)):
if len(a[i])<leng:
if Type=='x':
a[i].extend([wordVector[0] for i in range(leng-len(a[i]))])
if Type=='y':
a[i].extend([0 for i in range(leng-len(a[i]))])
return seq_len
上面那个就是。。deepcopy乱用,太傻了
最近改进方法
不准重复造轮子!
from torch.nn.utils.rnn import pad_sequence
pad_sequence([torch.from_numpy(np.array(x)) for x in conv_x]
# ↑完美解决问题
# ↓顺便记一下
packed = pack_padded_sequence(x, seq_len, batch_first=True, enforce_sorted=False)
x, lens_x = pad_packed_sequence(packed, batch_first=True)
# ↑padded和packed,专门用于RNN里,pytorch中。具体的有空写个整合版本的
Q.E.D.
Comments | 0 条评论