将 tensorflow 数据管道用于 nlp 文本生成器

问题描述

作为提问者,我是 stackoverflow 的新手。我通常在这里仔细阅读答案,直到现在通常都不必问问题。我正在使用 tf.data.Dataset API 构建深度学习网络,但网络似乎没有正确引入数据集。

因此,为了设置我使用文本数据集的阶段,我已经将文本分解为标记,创建了一个唯一词字典,创建了一个嵌入矩阵以将标记转换为向量,然后计划使用 tf .data.Dataset 可以轻松使用内部管道和批处理大型数据集来管理培训。

'vect_doc' 变量是一个形状为 (35054,300) 的数组。

    vect_dataset = tf.data.Dataset.from_tensor_slices(vect_doc)

从这里开始,我对数据集进行了混洗,以便将其分解为训练集、测试集和验证集。

    vect_data_shuffle = vect_dataset.shuffle(len(proc_doc),reshuffle_each_iteration = False)
    
    train_dataset = vect_data_shuffle.take(train_size)
    test_dataset = vect_data_shuffle.skip(train_size)
    val_dataset = test_dataset.skip(val_size)
    test_dataset = test_dataset.take(test_size)

然后我对数据集进行批处理以创建 2*sequence_length 的样本,为简单起见,我将仅使用训练数据集进行演示。

     train_batch_ds = train_dataset.batch(2*self.sequence_length + 1,drop_remainder=True)

一旦数据集被分成几批,我就会运行以下过程:

     def vect_split_dataset(self,sample):
    
         dataset_Xy = tf.data.Dataset.from_tensors((sample[:self.sequence_length],sample[self.sequence_length]))
            
         for i in range(1,(len(sample) - 1) // 2):
        
             X_seq_batch = sample[i: i + self.sequence_length]
             y_nxwrd_batch = sample[i + self.sequence_length]
        
             Xy_samp = tf.data.Dataset.from_tensors((X_seq_batch,y_nxwrd_batch))
                    
             Xy_dataset = dataset_Xy.concatenate(Xy_samp)
    
        return Xy_dataset

    Xy_dataset = train_batch_ds.flat_map(train_set.vect_split_dataset)

    Xy_dataset = Xy_dataset.repeat(len(proc_doc)).shuffle(len(proc_doc)).batch(param_dict['batch_size'],drop_remainder=True)

上面的 Xy_dataset 返回的形状为 ((60,30,300),(60,300))。现在我已经创建了可以传递给我的 DNN 模型的数据集,这就是我开始遇到问题的地方。这是我用来构建模型的代码

    LSTM = tf.keras.layers.LSTM(units=self.rnn_units,kernel_initializer=self.initializer,activation=self.activation,recurrent_activation=self.activation_out,return_sequences=True)
    
    for i in range(self.num_layers):
        # Different layers should have different setups as indicated below
        if i == 0: # Initial layer also referred to as the input layer
                         
            self.model.add(tf.keras.layers.Embedding(input_dim=self.input_dim,input_shape=(self.sequence_length,self.spacy_len),output_dim=self.spacy_len,input_length=self.batch_size))
            
        elif i+1 == self.num_layers: # Output layer
            self.model.add(tf.keras.layers.Dropout(self.drop_rate))
            self.model.add(tf.keras.layers.Dense(units=self.num_units_out,activation=self.activation_out))
            self.model.add(tf.keras.layers.Activation(self.activation_out))
        else: # hidden layers basically anything that isn't an input or output layer
            self.model.add(tf.keras.layers.Bidirectional(LSTM))

基本上,我不断收到的错误是“ValueError: Input 0 of layer bidirectional is incompatible with the layer: expected ndim=3,found ndim=4.收到完整形状:[无、30、300、300]'

我不确定这是我处理嵌入错误的方式还是什么。当我将嵌入层静音并将其替换为双向时,我会在两个形状 (60,300) 和 (60,300) 之间出现不兼容错误

我的目标是让它在每个 epoch 的一些定义的批次中迭代整个数据集(在这个例子中我使用 60)。我已将每个时期的步数设置为整​​个文档的长度减去序列长度除以批次大小 'steps_per_epoch = (len(processed_doc) - self.sequence_length) // self.batch_size' 在调用 model.fit 命令时。

感谢您提供的有关解决此问题的任何意见或指导。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)