问题描述
作为提问者,我是 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 (将#修改为@)