DL4J---导入Keras模型进行使用

使用Java深度学习框架DL4J导入Keras模型

应工作需要,需要使用Java来调用Keras构建的深度学习模型
注: DL4J框架对 Keras 后端TensorFlow版本具有要求:
TensorFlow版本2.0以下作后端所支持的 Keras 构建的h5模型可成功导入,预测
当前成功版本:TensorFlow 1.15.0 + Keras 2.2.5 on python3.7
TensorFlow版本2.0作后端所支持的 Keras 构建的h5模型无法成功导入,预测

血泪史

由于笔者使用的是TensorFlow2.0版本中Keras所构建的h5模型,DL4J未成功导入,便想着先将 h5 模型转为 pb 模型,再使用Java 导入 pb 模型进行使用。至今未成功…
笔者发现 keras模型保存时,所保存的内容不包含每层的名称(name=“input”),即输入输出层的层名不会保存,这导致在转入pb 模型时,仍旧不会指定具体的输入之处,进而导致 Java 加载pb模型后,无法找到模型的输入之处(报错,can not find [input]),也就无处输入并进行预测。查了许多博客仍未解决…

后来转过来看DL4J对h5模型的调用,发现路径改为全英文后(路径中包含中文,会报错指出无法打开模型文件),成功的完成了模型的读取并预测,也是surprise!(当然此处 h5 文件为TensorFlow2.0之下的 keras 构建)

正文

述说完血泪史后,进行实操

模型训练、

Keras 包含两种构建模型的方式Sequential() 和 Functional API
以 Keras内置数据集,波士顿房价预测,为例。

Sequential
from keras.datasets import boston_housing
from keras import layers,Sequential
import numpy as np

# 数据准备
(x_train, y_train), (x_test, y_test) = boston_housing.load_data()

# 模型搭建
model = Sequential()

model.add(layers.Dense(64,activation="relu",input_dim=13))
model.add(layers.Dense(32,activation="relu"))
model.add(layers.Dense(16,activation="relu"))
model.add(layers.Dense(1,activation="relu"))

model.compile(optimizer = "rmsprop", loss = 'mse', metrics=['mae','mape'])
model.summary()
model.fit(x_train,y_train,epochs=10,batch_size=12,verbose=0)

# 对单个样本预测
x_test[0] 
#array([ 18.0846,   0.    ,  18.1   ,   0.    ,   0.679 ,   6.434 ,
       100.    ,   1.8347,  24.    , 666.    ,  20.2   ,  27.25  ,
        29.05  ])
        
model.predict(x_test[0].reshape(1,13))
# 结果: array([[0.9662409]], dtype=float32)

# 模型保存
model.save("path/model_Sequential.h5")
Functional
from keras.datasets import boston_housing
from keras import layers,Sequential
import numpy as np

# 数据准备
(x_train, y_train), (x_test, y_test) = boston_housing.load_data()

# 模型搭建
x_in = Input(shape=(13,))
h = layers.Dense(64,activation="relu")(x_in)
h = layers.Dense(32,activation="relu")(h)
h = layers.Dense(16,activation="relu")(h)
x_out = layers.Dense(1,activation="relu")(h)

model = Model(x_in,x_out)
model.compile(optimizer = "rmsprop",loss = 'mse',metrics=['mae','mape'])
model.summary()

model.fit(x_train,y_train,epochs=10,batch_size=12,verbose=0)
model.predict(x_test[0].reshape(1,13))
#结果: array([[12.07417]], dtype=float32)  # 结果不同是因为训练的轮次不同

# 模型保存
model.save("path/model_Functional.h5")

DL4J调用

在DL4J的 github 中下载 DeepLearning4j Example
在包modelimport中的ImportDeepMoji.java文件中,main文件如下

public static void main(String[] args) throws Exception {
		// Sequential构建的Keras模型
    	MultiLayerNetwork model = KerasModelImport.importKerasSequentialModelAndWeights("path/model_Sequential.h5");
    	// Functional构建的Keras模型
    	ComputationGraph  model = KerasModelImport.importKerasModelAndWeights("path/model_Functional.h5");
    	double[][] x_in = {{18.0846, 0.0, 18.1, 0., 0.679, 6.434, 100., 1.8347, 24., 666., 20.2, 27.25, 29.05}};
    	INDArray input = Nd4j.create(x_in);
    	System.out.println(model.output(input)[0]);
    	// 查看模型结构
        System.out.println(model.summary());
    }
// 输出结果
Sequential模型的输出结果0.9662
Functional模型的输出结果12.074
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值