使用TensorFlow与Librosa生成TFRecord时遇类型错误求助
解决TFRecord写入时MFCC的类型错误问题
你遇到的核心问题是MFCC数组转成列表后是嵌套的二维结构,但tf.train.FloatList要求传入的是一维的浮点数序列,而非列表的列表,这才触发了类型错误。
错误原因拆解
你的mfcc是形状为(128,1293)的二维numpy数组,调用mfcc.tolist()后得到的是包含128个子列表的嵌套结构,每个子列表里有1293个浮点数。但tf.train.FloatList(value=...)只接受直接的一维浮点数集合,无法识别嵌套列表里的子列表元素,所以抛出了"expected one of: int, long, float"的错误。
修复方案
只需要把二维数组展平成一维再转成列表即可,同时注意你代码里的拼写小错误:feartures应该是features,这个细节也可能导致后续解析失败。修改后的关键代码片段如下:
example = tf.train.Example( features = tf.train.Features(feature={ "label":tf.train.Feature(int64_list=tf.train.Int64List(value=[index])), "mfcc":tf.train.Feature(float_list=tf.train.FloatList(value=mfcc.flatten().tolist())) }))
后续读取注意事项
当你后续从TFRecord读取数据时,记得要把展平后的一维数据重新reshape回(128,1293)的原始形状,才能恢复MFCC特征的结构,示例代码如下:
# 假设解析后得到的mfcc_tensor是一维张量 mfcc = tf.reshape(mfcc_tensor, (128, 1293))
内容的提问来源于stack exchange,提问作者tuffy chow
相关产品推荐
相关产品推荐

