将Keras模型导入DL4J时报错:Batch norm层输入类型不符合要求
DL4J导入Keras Conv1D+BatchNormalization模型报错解决方案
报错根因
报错核心是1.0.0-M1版本DL4J的Keras模型导入模块对Conv1D层输出的特征类型推断错误,将其识别为
InputTypeRecurrent(循环输入类型),但该版本内置的BatchNormalization层仅支持CNN、CNN Flat、FF三种输入类型,二者不匹配触发异常。官方的对应修复补丁仅在1.0.0-M2及之后的版本正式上线,M1版本未包含该修复,不是配置遗漏导致的问题。
可落地解决方案
- 方案1(优先推荐):将DL4J依赖版本升级到1.0.0-M2及以上正式版本,升级后无需修改原有模型、导入代码即可正常加载。
- 方案2(不升级DL4J,修改Python侧模型):保存模型前显式指定BatchNormalization层的归一化维度,避免DL4J导入时的维度识别歧义,修改后的Python代码如下:
from tensorflow.keras.layers import Input, Conv1D, BatchNormalization from tensorflow.keras.models import Model in_layer = Input((25, 25,)) x = Conv1D(filters=10, kernel_size=2)(in_layer) # 显式指定axis为特征所在的最后一维 out_layer = BatchNormalization(axis=-1)(x) model = Model(in_layer, out_layer) model.save("batchNormError_fixed.h5")
- 方案3(不修改模型,兼容现有M1版本):导入模型时手动指定输入类型,覆盖自动推断的错误结果,DL4J侧代码修改如下:
import org.deeplearning4j.nn.api.InputType; import org.deeplearning4j.nn.modelimport.keras.KerasModelImport; import org.deeplearning4j.nn.graph.ComputationGraph; import java.util.HashMap; import java.util.Map; String modelPath ="batchNormError.h5"; // 手动指定输入层类型为1维卷积输入,参数依次为序列长度、特征通道数 Map<String, InputType> inputTypes = new HashMap<>(); inputTypes.put("input_1", InputType.convolutional1D(25, 25)); // 第三个参数设置为false表示不强制严格校验层配置 ComputationGraph model = KerasModelImport.importKerasModelAndWeights(modelPath, inputTypes, false);
内容的提问来源于stack exchange,提问作者Joel Acevedo
相关产品推荐
相关产品推荐

