python - 在 for 循环中创建新的 Sequential 模型(使用 Keras)
问题描述
我想尝试用不同的超参数训练我的模型,所以我设置了一系列嵌套的 for 循环来遍历它们。
model = None
batch_generator = None
for sequence_length in all_sequence_length:
for label_periods in all_label_periods:
for num_layers in all_num_layers:
for num_units in all_num_units:
loadFiles()
createmodel()
trainmodel()
第一次迭代创建了一个这样的模型:
Layer (type) Output Shape Param #
=================================================================
cu_dnnlstm_1 (CuDNNLSTM) (None, 100, 75) 45300
_________________________________________________________________
dropout_1 (Dropout) (None, 100, 75) 0
_________________________________________________________________
cu_dnnlstm_2 (CuDNNLSTM) (None, 100, 75) 45600
_________________________________________________________________
dropout_2 (Dropout) (None, 100, 75) 0
_________________________________________________________________
cu_dnnlstm_3 (CuDNNLSTM) (None, 100, 75) 45600
_________________________________________________________________
dropout_3 (Dropout) (None, 100, 75) 0
_________________________________________________________________
cu_dnnlstm_4 (CuDNNLSTM) (None, 100, 75) 45600
_________________________________________________________________
dropout_4 (Dropout) (None, 100, 75) 0
_________________________________________________________________
cu_dnnlstm_5 (CuDNNLSTM) (None, 100, 75) 45600
_________________________________________________________________
dropout_5 (Dropout) (None, 100, 75) 0
_________________________________________________________________
dense_1 (Dense) (None, 3) 228
=================================================================
然后我打电话model.fit_generator()
来训练模型并且执行得很好。然后在下一次循环迭代中再次创建模型,摘要如下所示:
Layer (type) Output Shape Param #
=================================================================
cu_dnnlstm_6 (CuDNNLSTM) (None, 100, 75) 45300
_________________________________________________________________
dropout_6 (Dropout) (None, 100, 75) 0
_________________________________________________________________
cu_dnnlstm_7 (CuDNNLSTM) (None, 100, 75) 45600
_________________________________________________________________
dropout_7 (Dropout) (None, 100, 75) 0
_________________________________________________________________
cu_dnnlstm_8 (CuDNNLSTM) (None, 100, 75) 45600
_________________________________________________________________
dropout_8 (Dropout) (None, 100, 75) 0
_________________________________________________________________
cu_dnnlstm_9 (CuDNNLSTM) (None, 100, 75) 45600
_________________________________________________________________
dropout_9 (Dropout) (None, 100, 75) 0
_________________________________________________________________
cu_dnnlstm_10 (CuDNNLSTM) (None, 100, 75) 45600
_________________________________________________________________
dropout_10 (Dropout) (None, 100, 75) 0
_________________________________________________________________
dense_2 (Dense) (None, 3) 228
=================================================================
您会看到层 ID 增加了,这让我很惊讶,因为我为模型变量创建了一个新的 Sequential 模型,所以我希望得到与第一个相同的摘要。
当我打电话时,model.fit_generator()
我收到此错误:
InvalidArgumentError(参见上面的回溯):您必须为占位符张量“cu_dnnlstm_1_input”提供一个值,其 dtype 为 float 和 shape [?,100,74]
您会看到它需要一个 输入cu_dnnlstm_1_input
,这是第一次迭代模型的输入,而不是第二个模型的 cu_dnnlstm_6 输入。我创建模型的代码是在一个函数中完成的:
def createmodel():
global model
model = Sequential()
model.add( CuDNNLSTM(units=num_units, return_sequences=True, input_shape=(sequence_length, features_size) ) )
for _ in range(num_layers):
model.add( Dropout(dropout_rate) )
model.add( CuDNNLSTM(units=num_units, return_sequences=True) )
model.add( Dropout(dropout_rate) )
model.add( CuDNNLSTM(units=num_units, return_sequences=False) )
model.add( Dropout(dropout_rate) )
model.add( Dense(labels_size) )
model.compile(loss='mean_absolute_error', optimizer='adam')
model.summary()
使用此函数训练模型:
def trainmodel():
global model
model.fit_generator(generator=batch_generator,
epochs=num_epochs,
steps_per_epoch=num_steps_per_epoch,
validation_data=validation_data_tuple,
callbacks=callbacks)
谁能发现我的“故意”错误?
解决方案
我想这是因为 Keras 试图在同一个张量流图上创建不同的模型。由于您的模型具有不同的架构,因此无法做到这一点。
尝试导入张量流:
import tensorflow as tf
并以这种方式修改您的循环:
for sequence_length in all_sequence_length:
for label_periods in all_label_periods:
for num_layers in all_num_layers:
for num_units in all_num_units:
graph = tf.Graph()
with tf.Session(graph=graph):
loadFiles()
createmodel()
trainmodel()
推荐阅读
- laravel - laravel 管理员可以为用户设置用户名和密码
- maven - pom.xml 中的 selenium-central-framework
- android - 自定义底部导航栏图标
- android - 无法更改 Android 中少数屏幕的状态栏颜色
- javascript - ReactJS - 使用反应钩子防止模态的初始动画
- django - 在 Django 的自定义 AuthenticationForm 中使用 session.set_expiry()。
- node.js - 使用 node js 安装 appuim
- java - AWS ProjectionExpression 与 DynamoDBScanExpression
- c++ - 初始化列表中对象的生命周期可以延长吗?
- python - python - 如何区分argparse,python中的默认值和用户给定值?