使用遗传算法自动化设计TensorFlow神经网络遇维度不匹配报错咨询
问题1:输出层定义校验
你当前的softmax输出层不符合你的业务场景:
- 你给出的期望输出有3个位置取值为1,属于多标签分类任务,softmax激活会强制所有输出值总和为1,仅支持单标签分类,无法同时输出多个接近1的得分。
- 修正方案:
- 若确认是多标签分类,输出层改为
output_layer = tensorflow.keras.layers.Dense(13, activation="sigmoid", name="output"),配套损失函数使用二元交叉熵BinaryCrossentropy。 - 若为示例标签写错、实际是单标签分类,当前softmax输出层定义正确,只需保证标签为独热编码格式,配套使用分类交叉熵
CategoricalCrossentropy即可。
- 若确认是多标签分类,输出层改为
问题2:层连接报错原因与修复
报错根因
你的代码存在3个核心问题,测试时偶现正常是因为测试用例覆盖不全,仅验证了种群数量为1的场景:
dense_layers列表定义在个体生成循环之外,每次生成新个体时不会清空,会累加之前所有个体的层,导致层的输入输出维度完全不匹配。- 你已经定义了输入维度为3的
input_layer,又额外添加了随机维度的input_for_dense_layer输入层,两个输入层连续堆叠会导致维度冲突。 - 生成Dense层时,上一层的输出维度和下一层要求的输入维度在多次循环累加后完全错位,传入固定3维的业务数据时就会触发维度不匹配错误。
修复代码逻辑
input_layer = tensorflow.keras.layers.InputLayer(3, name="input") output_layer = tensorflow.keras.layers.Dense(13, activation="softmax", name="output") self.text = f"Creating new generation" if (len(model_array) == 0): # 生成随机种群 for individual in range(self.population_size): # 每层的层列表放到循环内,每次生成新个体清空 dense_layers = [] # 去掉多余的InputLayer,第一层Dense自动适配输入层维度 hidden_dim = random.randint(3, 60) for i in range(random.randint(1,5)): dense_layer = tensorflow.keras.layers.Dense(hidden_dim, activation = "relu") dense_layers.append(dense_layer) hidden_dim = random.randint(3, 60) model = tensorflow.keras.Sequential() model.add(input_layer) for dense_layer in dense_layers: model.add(dense_layer) model.add(output_layer) model.compile(optimizer=random.choice(self.optimizer_array), loss=random.choice(self.loss_array), metrics=['accuracy']) model_array.append(model)
内容的提问来源于stack exchange,提问作者wookieluvr49
相关产品推荐
相关产品推荐

