Python AllenNLP DatasetReader:仅加载单个实例,而不是迭代训练数据集中的所有实例

Python AllenNLP DatasetReader:仅加载单个实例,而不是迭代训练数据集中的所有实例,python,nlp,pytorch,allennlp,Python,Nlp,Pytorch,Allennlp,我正在使用AllenNLP训练层次化的注意力网络模型。我的训练数据集由一个JSON对象列表组成(例如,列表中的每个对象都是一个JSON对象,其键为:=[“text”,“label”])。与文本键关联的值是一个列表列表,例如: [{"text":[["i", "feel", "sad"], ["not", "sure", "i", "guess&qu

我正在使用AllenNLP训练层次化的注意力网络模型。我的训练数据集由一个JSON对象列表组成(例如,列表中的每个对象都是一个JSON对象,其键为:=[“text”,“label”])。与文本键关联的值是一个列表列表,例如:

[{"text":[["i", "feel", "sad"], ["not", "sure", "i", "guess", "the", "weather"]], "label":0} ... {"text":[[str]], "label":int}] 
我的DatasetReader类看起来像:

@DatasetReader.register("my_reader")
class TranscriptDataReader(DatasetReader):
    def __init__(self,
                 token_indexers: Optional[Dict[str, TokenIndexer]] = None,
                 lazy: bool = True) -> None:
        super().__init__(lazy)
        self._token_indexers = token_indexers or {'tokens': SingleIdTokenIndexer()}

    def _read(self, file_path: str) -> Iterator[Instance]:
        with open(file_path, 'r') as f:
            data = json.loads(f.read())
            for _,data_json in enumerate(data):
                sent_list = []
                for segment in data_json["text"]:
                    sent_list.append(self.get_text_field(segment))
                yield self.create_instance(sent_list, str(data_json["label"]))

    def get_text_field(self, segment):
        return TextField([Token(token.lower()) for token in segment],self._token_indexers)


    def create_instance(self, sent_list, label):
        label_field = LabelField(label, skip_indexing=False)
        fields = {'tokens': ListField(sent_list), 'label': label_field}
        return Instance(fields)

在我的配置文件中,我有:

{
  dataset_reader: {
    type: 'my_reader',
  },

  train_data_path: 'data/train.json',
  validation_data_path: 'data/dev.json',

 data_loader: {
    batch_sampler: {
      type: 'bucket',
      batch_size: 10
    }
 },

我已经尝试(或者)将数据集读取器的
lazy
参数设置为
True
False

  • 当设置为
    True
    时,模型能够进行训练,但是,我观察到,当我的数据集包含~100时,实际上只加载了一个训练和一个开发实例
  • 当设置为
    False
    时,我已将
    \u read
    中的
    yield
    行修改为
    return
    ;但是,这会在基本词汇表类中导致类型错误。我还尝试保持
    yield
    设置为
    False
    时的状态;在这种情况下,根本不会加载任何实例,因为instance的集合ces为空,词汇表没有实例化,嵌入类抛出错误

非常感谢您提供调试的指针和/或提示。

在阅读json文件后,您能否打印并告诉我们加载了多少实例(为了清晰起见,在下面添加了打印命令)


如果您使用的是
allennlp>=v2.0.0
,则
DatasetReader
构造函数中的
lazy
参数已被弃用。因此,您的
super()。\uuuu初始化\uuuu(lazy)
将被解释为新的构造函数参数
max_instances
,即
max_instances=True
,它相当于
max_instances=1

您使用的AllenNLP是什么版本?由于2.0,数据集读取器总是懒惰的,因此不再出现这种区别。
def _read(self, file_path: str) -> Iterator[Instance]:
        with open(file_path, 'r') as f:
            data = json.loads(f.read())
            print(len(data))
            for _,data_json in enumerate(data):
               sent_list = []
                for segment in data_json["text"]:
                    sent_list.append(self.get_text_field(segment))
                yield self.create_instance(sent_list, str(data_json["label"]))