Python:return后变量尺寸变化,np.vstack致Word2Vec文本分类输入维度异常
问题根源
np.vstack的作用是沿垂直方向(行方向)堆叠数组,你的每个样本经过padding后是(250, 250)的二维数组(250个词,每个词250维embedding),6个样本用np.vstack堆叠后会变成(6*250, 250) = (1500, 250)的数组,自然len(train_X)就是1500,和Y的长度不匹配。你需要的是沿新的样本维度堆叠,保留每个样本的二维结构,应该用np.stack而不是np.vstack。- 长文本截断的代码逻辑失效:你写的
enc_essay[:249]没有赋值回变量,相当于截断操作根本没有执行,实际运行时长文本不会被截断。 - 截断长度写错了:你要保留前250个词,应该取
enc_essay[:250]而不是[:249]。
修复代码
1. 修复padding和截断逻辑
def get_padded_encoded_essays(encoded_essays): """ for short essays, we prepend zero padding so all input to RNN has same length, for long essays, we truncate it to the first 250 words """ padded_essays_encoding = [] for enc_essay in encoded_essays: # 先转成numpy数组避免tensor操作兼容问题 enc_essay = np.array(enc_essay) if get_word_count(enc_essay) > 250: # 修复:截断后赋值回变量,取前250个词 enc_essay = enc_essay[:250] else: zero_padding_cnt = 250 - enc_essay.shape[0] pad = np.zeros((zero_padding_cnt, 250)) # 优化:不用循环拼接,一次性生成对应长度的padding直接拼接,效率更高 enc_essay = np.concatenate((pad, enc_essay), axis=0) padded_essays_encoding.append(enc_essay) return padded_essays_encoding
2. 修复preprocess里的数组堆叠逻辑
def preprocess(df): """ encode text value to numeric value """ # encode words into word2vec essays = df['corrected'].tolist() print("essay length:" + str(len(essays))) encoded_essays = get_word2vec_enc(essays) padded_encoded_essays = get_padded_encoded_essays(encoded_essays) print("padded_encoded_essays length:" + str(len(padded_encoded_essays))) # encoded ses sess = df['father'].tolist() encoded_ses = [ses_encode(ses) for ses in sess] # 修复:用np.stack沿样本维度堆叠,输出shape为(样本数, 250, 250) X = np.stack(padded_encoded_essays, axis=0) print("X length:" + str(len(X))) Y = np.vstack(encoded_ses) return X, Y
修复后效果
运行后train_X的shape为(6, 250, 250),len(train_X)返回6,和train_Y长度完全匹配,同时是合法的多维数组,可以直接转换为张量输入RNN模型,不会出现转换报错。
内容的提问来源于stack exchange,提问作者karyn-h
相关产品推荐
相关产品推荐

