Python 上根据迭代器调用函数时如何添加代码行

How to add code lines when calling a function depending on an iterator on Python

我正在尝试使用 keras.models.Sequential 测试许多 ML 模型。

我的想法是,一旦我有一个看起来像 [num_layers, num_units_per_layers] 的迭代器,例如 [(1, 64),(2, (64,128))],使用一种 for 循环 运行 创建一个脚本,迭代器将是能够创建一个 keras 顺序模型,其中包含迭代器每个步骤中的层数和单元数。

这就是我正在尝试的:

it = [[(1, 128),(2, (64,128)), (3,(128,64,256))]]
for layers, units in it:
    model = keras.Sequential([
        layers.Dense(units[0])
        #How to get another layers here when layers > 1.
    ])

但是我在自动添加新图层时卡住了。综上所述,迭代器的每一步我想要的是它的值所代表的keras模型。 有什么办法吗?

例如,当 layers = 2units = (64,128) 时,代码应如下所示:

model = keras.Sequential([
    layers.Dense(64),
    layers.Dense(128)
])

如果 layers = 1units = 128 代码必须是:

model = keras.Sequential([
    layers.Dense(128)
])

嗯,第一个问题是您设置的方式 it。你这样做的方式使它成为一个列表,你想要一个 n 列表的列表(这里 n 是 3)。如果你定义it如下,你可以提取layers, units你正在寻找的方式。

it = [[1,[128]],[2,(64,128)],[3,(128,64,256)]]

如果你想要一个只有一层的模型,你需要把单位的数量放在括号里,否则它不能很好地与其他架构一起工作(因为索引)。接下来,我建议对代码进行一些必要的调整。首先,我会使用不同的方式来构建一个顺序模型(如下所示)。然后,您需要定义输入形状,否则模型将不知道如何构建。最后,只需在隐藏层生成器循环之外为每个模型创建一个输出层。

我写这个玩具问题是为了满足您对 10 个训练样本、一个输入维度和一个输出维度的模型进行迭代的想法。

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
import numpy as np

x = np.random.rand(10,1)
y = np.random.rand(10,1)

it = [[1,[128]],[2,(64,128)],[3,(128,64,256)]]
for layers, units in it:
    model = Sequential()
    for i in range(layers):
        model.add(Dense(units[i],input_shape=(1,)))
    model.add(Dense(1))
    model.summary()
    model.compile(loss='mse',optimizer='Adam')
    model.fit(x,y,batch_size=1,epochs=1)