Python AllenNLP DatasetReader:仅加载单个实例,而不是迭代训练数据集中的所有实例
我正在使用AllenNLP训练层次化的注意力网络模型。我的训练数据集由一个JSON对象列表组成(例如,列表中的每个对象都是一个JSON对象,其键为:=[“text”,“label”])。与文本键关联的值是一个列表列表,例如: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
[{"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
- 当设置为
时,模型能够进行训练,但是,我观察到,当我的数据集包含~100时,实际上只加载了一个训练和一个开发实例True
- 当设置为
时,我已将False
中的\u read
行修改为yield
;但是,这会在基本词汇表类中导致类型错误。我还尝试保持return
设置为yield
时的状态;在这种情况下,根本不会加载任何实例,因为instance的集合ces为空,词汇表没有实例化,嵌入类抛出错误False
非常感谢您提供调试的指针和/或提示。在阅读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"]))