为了账号安全,请及时绑定邮箱和手机立即绑定

原始 Python 'for' 循环是否会降低 TensorFlow 的训练性能

原始 Python 'for' 循环是否会降低 TensorFlow 的训练性能

慕盖茨4494581 2023-02-22 15:44:19
当只有 1 个输入(输入到占位符)时,使用 tf.data.Dataset 是最佳的:Data = tf.data.Dataset.from_tensor_slices((Inp,Exp));Data = Data.repeat().shuffle(Dsize).batch(Bsize);Steps  = 1000;Epochs = round(Steps/(Dsize/Bsize));...Model.fit(Data, epochs=Epochs, steps_per_epoch=round(Dsize/Bsize));然而,当有多个输入时(提供给多个占位符),Keras 不允许提供多个数据集,因此使用原始 Python 'for' 循环来提供批次:Data = tf.data.Dataset.from_tensor_slices((Inp1,Inp2,Exp));Data = Data.repeat().shuffle(Dsize).batch(Bsize);Iter = iter(Data);Steps = 1000;...for I in range(Steps):  X1,X2,Y = next(Iter);  Model.fit(x=[X1,X2], y=Y);因为 Python 是解释器并在字节码上运行,所以“for”循环应该很慢。恐怕使用自定义“for”循环会降低训练性能。是真的吗?
查看完整描述

2 回答

?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

您可以调整 from_tensor_slices 以使其保持为 2 个元素的元组,并且第一个元素本身就是一个元组。


工作示例:


import numpy as np

import tensorflow as tf



input_1 = tf.keras.Input(shape=(10,))

dense_1 = tf.keras.layers.Dense(4)(input_1)

input_2 = tf.keras.Input(shape=(10,))

dense_2 = tf.keras.layers.Dense(4)(input_2)

x = tf.keras.layers.Concatenate()([dense_1, dense_2])

y = tf.keras.layers.Dense(2)(x)


model = tf.keras.Model([input_1, input_2], y)

model.summary()


dataset_size = 16

batch_size = 4

input_1_values = np.random.random((dataset_size, 10))

input_2_values = np.random.random((dataset_size, 10))

output_values = np.random.random((dataset_size, 2))


dataset = tf.data.Dataset.from_tensor_slices(((input_1_values, input_1_values), output_values))

dataset = dataset.repeat().shuffle(buffer_size=4).batch(batch_size)


steps = 10

model.compile(optimizer="adam", loss="binary_crossentropy")

model.fit(dataset, epochs=1, steps_per_epoch=steps)

将数据集合并为单个数据集的另一种选择也可能是使用zip 方法


查看完整回答
反对 回复 2023-02-22
?
函数式编程

TA贡献1807条经验 获得超9个赞

我发现没有必要使用“for”循环。我可以通过仅使用 Keras 来避免使用“for”循环,同时我仍然可以使用多个 Xes,但不再使用 tf.data.Dataset:


Steps  = 1000;

Epochs = round(Steps/(Dsize/Bsize)); 

Lline  = 10;

Lafte  = round(Epochs/Lline);

if Lafte==0: Lafte=1;


#Train: Loop

L = Model.evaluate(x=[Inp1,Inp2], y=Exp, steps=round(Dsize/Bsize), batch_size=Bsize, 

                   verbose=0);

print(f"Initavg batch loss: {L:.9f}");                   


Model.fit(x=[Inp1,Inp2], y=Exp, epochs=Epochs, batch_size=Bsize, shuffle=True, 

          verbose=0, callbacks=[callback()]);


查看完整回答
反对 回复 2023-02-22
  • 2 回答
  • 0 关注
  • 183 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号