Skip to content

Commit

Permalink
Save Keras-like model to pure keras or tensorflow protobuf. (intel-an…
Browse files Browse the repository at this point in the history
…alytics#1600)

* checkpoint

* some update

* refine api

* some update

* fix build fail

* meet code review

* style check

* fix typo

* fix style check
  • Loading branch information
qiuxin2012 committed Sep 9, 2019
1 parent 803fd1b commit 7e18cd9
Showing 1 changed file with 55 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,16 @@ package com.intel.analytics.zoo.pipeline.api

import com.intel.analytics.bigdl.nn.abstractnn.{AbstractModule, Activity}
import com.intel.analytics.bigdl.nn.{CAddTable, SpatialCrossMapLRN}
import com.intel.analytics.bigdl.optim.L2Regularizer
import com.intel.analytics.bigdl.tensor.Tensor
import com.intel.analytics.bigdl.utils.{Shape, T}
import com.intel.analytics.bigdl.utils.{RandomGenerator, Shape, T}
import com.intel.analytics.bigdl.utils.caffe.{CaffeLoader => BigDLCaffeLoader}
import com.intel.analytics.zoo.pipeline.api.autograd.Variable
import com.intel.analytics.zoo.pipeline.api.keras.ZooSpecHelper
import com.intel.analytics.zoo.pipeline.api.keras.layers.utils.KerasUtils
import com.intel.analytics.zoo.pipeline.api.keras.layers.{Dense, Input, KerasLayerWrapper}
import com.intel.analytics.zoo.pipeline.api.keras.models.{KerasNet, Model => ZModel}
import com.intel.analytics.zoo.pipeline.api.keras.layers._
import com.intel.analytics.zoo.pipeline.api.keras.models.{KerasNet, Sequential, Model => ZModel}
import com.intel.analytics.zoo.pipeline.api.net.TFNet

import scala.util.Random

Expand Down Expand Up @@ -155,4 +157,54 @@ class NetSpec extends ZooSpecHelper{
val result = model.forward(Tensor[Float](2, 4).rand())
result.toTensor[Float].size() should be (Array(2, 2))
}

"Save to tensorflow" should "works" taggedAs(Keras2Test) in {
RandomGenerator.RNG.setSeed(10)
val tmpDir = createTmpDir()
val modelGraph = Sequential[Float]().setName("model")
// get 13 * 52 input matrix
val reshape = Reshape[Float](Array(13, 52), inputShape = Shape(676))
// get 52 * 13 input matrix
val transpose = Permute[Float](Array(2, 1))
val layer1 = LSTM[Float](outputDim = 100, returnSequences = true)
val layer2 = LSTM[Float](outputDim = 100, returnSequences = false)
val denseLayer = Dense[Float](2, activation = "softmax")
modelGraph.add(reshape.setName("reshape"))
modelGraph.add(transpose.setName("transpose"))
modelGraph.add(layer1.setName("lstm1"))
modelGraph.add(layer2.setName("lstm2"))
modelGraph.add(denseLayer.setName("output"))
Net.saveToTf[Float](modelGraph, tmpDir.getAbsolutePath)

val input = Tensor[Float](2, 676).rand()
val o = modelGraph.forward(input)
val inputs = "reshape_input:0"
val outputs = "output/Softmax:0"
val tfModel = TFNet(tmpDir + "/frozen_inference_graph.pb",
Array(inputs), Array(outputs))
val tfOutput = tfModel.forward(input)

o should be (tfOutput)
}

"Save to keras2" should "work" taggedAs(Keras2Test) in {
val tmpDir = createTmpDir()
val modelGraph = Sequential[Float]().setName("model")
// get 13 * 52 input matrix
val reshape = Reshape[Float](Array(13, 52), inputShape = Shape(676))
// get 52 * 13 input matrix
val transpose = Permute[Float](Array(2, 1))
val layer1 = LSTM[Float](outputDim = 100, returnSequences = true)
val layer2 = LSTM[Float](outputDim = 100, returnSequences = false)
val dropout = Dropout[Float](0.5)
val denseLayer = Dense[Float](2, activation = "softmax")
modelGraph.add(reshape.setName("reshape"))
modelGraph.add(transpose.setName("transpose"))
modelGraph.add(layer1.setName("lstm1"))
modelGraph.add(layer2.setName("lstm2"))
modelGraph.add(dropout.setName("dropout"))
modelGraph.add(denseLayer.setName("output"))
Net.saveToKeras2[Float](modelGraph, tmpDir + "/model.h5")
}

}

0 comments on commit 7e18cd9

Please sign in to comment.