Pytorch_非结构化数据-语音图像文本

非结构化数据

结构化
    结构化数据通常驻留在关系数据库(RDBMS)
非结构化 
  文本、图片 图像和音频/视频信息
  半结构化:XML、HTML、各类报表、

语音

torchaudio
语音格式: 
    将以下格式加载到Torch张量中
     mp3,wav,aac,ogg,flac,avr,cdda,cvs/vms,
     aiff,au,amr,mp2,mp4,ac3,avi,wmv,
     mpeg,ircam和libsox支持的任何其他格式。
方向:
  语音识别 +语音分离+语音合成+语音转换(变声器)	
   
   语音识别  自动语音识别技术(Automatic Speech Recognition)
   语音合成  -- TTS是Text To Speech的缩写,即“从文本到语音”,
   
 基本概念
    音素、重音标注、音素发音时长、基频F0
	声学模型 : 混合声学模型  端到端的声学模型
	帧长、帧移
	Token 声音的基本元素作为 Token  文字书写的最小单位作为 Token
 语音处理工具包SpeechBrain
 
 语音领域三大会议(INTERSPEECH’19, ICASSP’19, ASRU’19)
 数据集  
    Librispeech 数据集开始,960 hours;
	Timit 数据集相当于CV领域的mnist

图像

图像格式: jpg png 等
方向: 
   分类  目标检测  分割 追踪
基本概念:
   位置 类别
 组织形式
    01. 一种是整个数据集都在一个文件下,内部再另附一个label文件,说明每个文件的状态
	02. 数据集都在一个文件下,每个数据都有自己的label
	03. 把不同种类的数据分为不同的文件夹存放起来,可以从文件夹或文件名得到label
	
数据集
   Labelme:注释图像的大数据集
   ImageNet
   MS COCO

自带图像库的数据
   torchvision.datasets.FashionMNIST
   torchvision.transforms.ToTensor	
 Creating a Custom Dataset for your file  
   torch.utils.data.Dataset
   torch.utils.data.DataLoader

文本

文本格式: 编码格式和文本格式
   unicodeToAscii
文本NLP
 方向:
    文本分类: 商品的类目预测问题  情感分析
	语言翻译
      01.文本
      02.词向量(word embedding)-- word2vec工具包 -- 解决了文本表示的问题
      03.利用CNN/RNN等深度学习网络及其变体解决自动特征提取(即特征表达)
基本概念
   分词  词表
   词向量 embedding
   词典   vocab   vocabulary
   Turning Names into Tensors
知名数据集
    THUCNews数据集   今日头条新闻文本分类数据集 
    Stanford Sentiment Treebank:带有情感注释的标准情感数据集
     Google Books Ngrams:Google 书籍中的词汇集合		
   
常用的类
   Field	:用来定义字段以及文本预处理方法
   Example	: 用来表示一个样本,通常为“数据+标签”
   TabularDataset : 用来从文件中读取数据,生成Dataset, Dataset是Example实例的集合
   BucketIterator :迭代器,用来生成batch, 类似的有Iterator,Buckeiterator的功能较强大点,支持排序,动态padding等
    1.字符串形式的文本,我们需要将其分词成词语列表
     torchtext.data.data.TabularDataset
    2.torchtext 中使用 torchtext.data.TabularDataset 来导入自己的数据集
     TabularDataset 是 torchtext 内置的 Dataset 子类,其能够很方便的读取csv、json或tsv格式的文件
      torchtext.datasets.WikiText2
      torchtext.data.utils.get_tokenizer
      torchtext.vocab.build_vocab_from_iterator
	  
	自定义 Dataset
     一个dataloader需要以下内容:
       把所有text编码成数字,然后用subsampling预处理这些文字。
       保存vocabulary,单词count,normalized word frequency
       每个iteration sample一个中心词
       根据当前的中心词,返回context单词
       根据中心词sample一些negative单词,返回单词的count
    
    model
        torch.nn.Embedding	
        torch.nn.Transformer 
        torch.nn.TransformerEncoder
	    torch.nn.TransformerEncoderLayer			

示例代码

  class WordEmbeddingDataset(tud.Dataset):           # tud.Dataset父类
      def __init__(self, text, word_to_idx, idx_to_word, word_freqs, word_counts):
          ''' text: a list of words, all text from the training dataset
              word_to_idx: the dictionary from word to idx
              idx_to_word: idx to word mapping
              word_freq: the frequency of each word
              word_counts: the word counts
          '''
          super(WordEmbeddingDataset, self).__init__()                             # 初始化模型
          self.text_encoded = [word_to_idx.get(t, VOCAB_SIZE-1) for t in text]     # 取出text里每个单词word_to_idx字典里对应的索引,不在字典里返回"<unk>"的索引,get括号里第二个参数应该写word_to_idx["<unk>"]
          self.text_encoded = torch.LongTensor(self.text_encoded)                  # 变成Longtensor类型
  
          self.word_to_idx = word_to_idx             # 以下皆为保存数据
          self.idx_to_word = idx_to_word
          self.word_freqs = torch.Tensor(word_freqs)
          self.word_counts = torch.Tensor(word_counts)
  
      def __len__(self):
          ''' 返回整个数据集(所有单词)的长度
          '''
          return len(self.text_encoded)
  
      def __getitem__(self, idx):                    # 这里__getitem__函数是个迭代器,idx代表了所有的单词索引
          ''' 这个function返回以下数据用于训练
              - 中心词
              - 这个单词附近的(positive)单词
              - 随机采样的K个单词作为negative sample
          '''
          center_word = self.text_encoded[idx]        # 中心词索引
  
          pos_indices = list(range(idx-C, idx)) + list(range(idx+1, idx+C+1))   # 除中心词外,周围词的索引,比如idx=0时,pos_indices = [-3, -2, -1, 1, 2, 3]
          pos_indices = [i%len(self.text_encoded) for i in pos_indices]         # idx可能超出词汇总数,需要取余
          pos_words = self.text_encoded[pos_indices]                            # 周围词索引,是正例单词
  
          # 负例采样单词索引
          # torch.multinomial:对self.word_freqs做 K * pos_words.shape[0](正确单词数量)次取值,输出的是self.word_freqs对应的下标
          # 取样方式采用有放回的采样,并且self.word_freqs数值越大,取样概率越大
          neg_words = torch.multinomial(self.word_freqs, K * pos_words.shape[0], True)
  
          return center_word, pos_words, neg_words
  ###创建dataset和dataloader
  dataset = WordEmbeddingDataset(text, word_to_idx, idx_to_word, word_freqs, word_counts)
  dataloader = torch.utils.data.DataLoader(dataset, batch_size=BATCH_SIZE, shuffle=True, num_workers=4)

参考

   pytorch练习(一)词向量  https://www.cnblogs.com/douzujun/p/13429912.html
posted @ 2022-01-26 16:08  辰令  阅读(181)  评论(0编辑  收藏  举报