【发布时间】:2020-04-28 14:06:54
【问题描述】:
我在 TensorFlow 2 中有一个带有 1 个输入和 2 个输出的 Keras 模型。在调用 model.fit 时,我想将数据集作为 x=train_dataset 传递并调用 model.fit 一次。 train_dataset 是用 tf.data.Dataset.from_generator 生成的:x1, y1, y2。
我可以进行训练的唯一方法是:
for x1, y1,y2 in train_dataset:
model.fit(x=x1, y=[y1,y2],...)
如何告诉 TensorFlow 解包变量并在没有显式 for 循环的情况下进行训练?使用for 循环会使许多事情变得不那么实用,以及train_on_batch 的使用。
如果我想运行 model.fit(train_dataset, ...) 函数不明白 x 和 y 是什么,甚至模型定义如下:
model = Model(name ='Joined_Model',inputs=self.x, outputs=[self.network.y1, self.network.y2])
它抛出一个错误,它期望 2 个目标而得到 1,即使数据集有 3 个变量,可以在循环中迭代。
数据集和小批量生成如下:
def dataset_joined(self, n_epochs, buffer_size=32):
dataset = tf.data.Dataset.from_generator(
self.mbatch_gen_joined,
(tf.float32, tf.float32,tf.int32),
(tf.TensorShape([None, None, self.n_feat]),
tf.TensorShape([None, None, self.n_feat]),
tf.TensorShape([None, None])),
[tf.constant(n_epochs)]
)
dataset = dataset.prefetch(buffer_size)
return dataset
def mbatch_gen_joined(self, n_epochs):
for _ in range(n_epochs):
random.shuffle(self.train_s_list)
start_idx, end_idx = 0, self.mbatch_size
for _ in range(self.n_iter):
s_mbatch_list = self.train_s_list[start_idx:end_idx]
d_mbatch_list = random.sample(self.train_d_list, end_idx-start_idx)
s_mbatch, d_mbatch, s_mbatch_len, d_mbatch_len, snr_mbatch, label_mbatch, _ = \
self.wav_batch(s_mbatch_list, d_mbatch_list)
x_STMS_mbatch, xi_bar_mbatch, _ = \
self.training_example(s_mbatch, d_mbatch, s_mbatch_len,
d_mbatch_len, snr_mbatch)
#seq_mask_mbatch = tf.cast(tf.sequence_mask(n_frames_mbatch), tf.float32)
start_idx += self.mbatch_size; end_idx += self.mbatch_size
if end_idx > self.n_examples: end_idx = self.n_examples
yield x_STMS_mbatch, xi_bar_mbatch, label_mbatch
【问题讨论】:
-
能否在您定义和创建
Dataset实例的位置添加代码以及生成器代码? -
y1 和 y2 是什么?一个热门编码值?您能否解释一下您的目标数据。也可以请您分享代码。
-
嗨,我已经在@today上面的问题中添加了代码
标签: python tensorflow keras tensorflow2.0 tensorflow-datasets