我正在尝试使用keras.models.Sequential
测试许多机器学习模型。
我的想法是,一旦我有一个看起来像[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]) #当layers > 1时,如何在这里添加其他层? ])
但我在自动添加新层时遇到了困难。总结一下,我希望在迭代器的每一步中,keras
模型能够根据其值来表示。有什么方法可以做到这一点吗?
例如,当layers = 2
且units = (64,128)
时,代码应该如下所示:
model = keras.Sequential([ layers.Dense(64), layers.Dense(128)])
如果layers = 1
且units = 128
,代码必须是:
model = keras.Sequential([ layers.Dense(128)])
回答:
首先,你设置it
的方式存在问题。你当前的方法使其成为一个单一列表,而你需要一个包含n个列表的列表(这里n是3)。如果你按照以下方式定义it
,你就能按你期望的方式提取layers, units
。
it = [[1,[128]],[2,(64,128)],[3,(128,64,256)]]
如果你想要一个只有一个层的模型,你需要将单位数放在括号中,否则它将无法与其他架构兼容(因为索引问题)。接下来,我建议对代码进行一些必要的调整。首先,我建议使用另一种构建Sequential模型的方法(如下所示)。然后,你需要定义输入形状,否则模型将不知道如何构建。最后,在隐藏层生成循环之外为每个模型创建一个输出层。
我编写了这个玩具问题来适应你关于对10个训练样本和一个输入维度及一个输出维度进行模型迭代的想法。
from tensorflow.keras.models import Sequentialfrom tensorflow.keras.layers import Denseimport numpy as npx = 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)