原始Python';对于';环路降低TensorFlow的训练性能

原始Python';对于';环路降低TensorFlow的训练性能,python,performance,tensorflow,for-loop,bytecode,Python,Performance,Tensorflow,For Loop,Bytecode,当只有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

当只有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”循环会降低训练性能。这是真的吗?

我发现没有必要使用“for”循环。我可以通过仅使用Keras来避免使用“for”循环,同时我仍然可以使用多个XE,但不再使用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()]);

您可以调整from_tensor_切片,使其保持由2个元素组成的元组,其中第一个元素本身就是元组

工作示例:

将numpy导入为np
导入tensorflow作为tf
input_1=tf.keras.input(shape=(10,))
密度_1=tf.keras.layers.density(4)(输入_1)
input_2=tf.keras.input(shape=(10,))
致密_2=tf.keras.layers.dense(4)(输入_2)
x=tf.keras.layers.Concatenate()([dense_1,dense_2])
y=tf.keras.layers.致密(2)(x)
model=tf.keras.model([input_1,input_2],y)
model.summary()
数据集大小=16
批量大小=4
输入值=np.random.random((数据集大小,10))
输入值=np.random.random((数据集大小,10))
输出值=np.random.random((数据集大小,2))
dataset=tf.data.dataset.from_张量_切片((输入_1_值,输入_1_值),输出_值))
dataset=dataset.repeat().shuffle(缓冲区大小=4).批处理(批处理大小)
步骤=10
编译(optimizer=“adam”,loss=“binary\u交叉熵”)
拟合(数据集,历元=1,每历元步长=步长)
将数据集合并为单个数据集的另一个选项也可以是使用