Exemple #1
0
    def create_convolution1d(self, klayer, kclayer):
        config = kclayer["config"]
        input_shape = klayer.get_input_shape_at(0)
        # batch, steps, dim, batch is None here, so you cannot use it directly.
        stack_size = int(input_shape[2])

        bpadW, bpadH = self.to_bigdl_2d_padding(klayer.border_mode)
        seq = BLayer.Sequential()
        seq.add(
            BLayer.Reshape([int(input_shape[1]), 1,
                            int(input_shape[2])], True))
        blayer = BLayer.SpatialConvolution(
            n_input_plane=stack_size,
            n_output_plane=klayer.nb_filter,
            kernel_w=1,
            kernel_h=klayer.filter_length,
            stride_w=1,
            stride_h=klayer.subsample_length,
            pad_w=bpadW,
            pad_h=bpadH,
            n_group=1,
            propagate_back=True,
            wRegularizer=self.to_bigdl_reg(config["W_regularizer"]),
            bRegularizer=self.to_bigdl_reg(config["b_regularizer"]),
            init_weight=None,
            init_bias=None,
            init_grad_weight=None,
            init_grad_bias=None,
            with_bias=config["bias"],
            data_format="NHWC",
            bigdl_type="float")
        seq.add(blayer)
        seq.add(BLayer.Squeeze(3))
        return self.combo_parameter_layer(seq, config)
Exemple #2
0
    def create_globalaveragepooling1d(self, klayer, kclayer):
        input_shape = klayer.get_input_shape_at(0)  # batch, step, dim
        b_kw = 1
        b_kh = int(input_shape[1])

        seq = BLayer.Sequential()
        seq.add(
            BLayer.View([int(input_shape[1]), 1,
                         int(input_shape[2])],
                        num_input_dims=2))
        blayer = BLayer.SpatialAveragePooling(kw=b_kw,
                                              kh=b_kh,
                                              dw=0,
                                              dh=0,
                                              pad_w=0,
                                              pad_h=0,
                                              global_pooling=False,
                                              ceil_mode=False,
                                              count_include_pad=False,
                                              divide=True,
                                              format="NHWC",
                                              bigdl_type="float")
        seq.add(blayer)
        seq.add(BLayer.Squeeze(
            2, num_input_dims=2))  # the index start from one but without batch
        seq.add(BLayer.Squeeze(1, num_input_dims=1))

        return seq
Exemple #3
0
    def create_globalmaxpooling2d(self, klayer, kclayer):
        bigdl_order = self.get_bdim_order(kclayer)
        input_shape = klayer.get_input_shape_at(0)
        if bigdl_order == "NCHW":
            b_kw = int(input_shape[3])
            b_kh = int(input_shape[2])
        else:
            b_kw = int(input_shape[2])
            b_kh = int(input_shape[1])

        seq = BLayer.Sequential()
        blayer = BLayer.SpatialMaxPooling(kw=b_kw,
                                          kh=b_kh,
                                          dw=b_kw,
                                          dh=b_kh,
                                          pad_w=0,
                                          pad_h=0,
                                          to_ceil=False,
                                          format=bigdl_order,
                                          bigdl_type="float")
        seq.add(blayer)
        if bigdl_order == "NCHW":
            seq.add(BLayer.Squeeze(3, num_input_dims=3))
            seq.add(BLayer.Squeeze(2, num_input_dims=2))
        else:
            seq.add(BLayer.Squeeze(2, num_input_dims=3))
            seq.add(BLayer.Squeeze(1, num_input_dims=2))
        return seq
Exemple #4
0
    def create_embedding(self, klayer, kclayer):
        config = kclayer["config"]
        input_shape = klayer.get_input_shape_at(0)  # batch, seq_len
        seq_len = int(input_shape[1])
        if klayer.input_length and klayer.input_length != seq_len:
            raise Exception("The input_length doesn't match: %s vs %s" %
                            (seq_len, klayer.input_length))

        if (hasattr(klayer, "dropout") and klayer.dropout != 0):
            raise Exception("We don't support dropout for now")

        if (hasattr(klayer, "mask_zero") and klayer.mask_zero != False):
            raise Exception("We don't support mask_zero for now")

        bseq = BLayer.Sequential()
        blayer = BLayer.LookupTable(n_index=klayer.input_dim,
                                    n_output=klayer.output_dim,
                                    padding_value=0.0,
                                    norm_type=2.0,
                                    should_scale_grad_by_freq=False,
                                    wRegularizer=self.to_bigdl_reg(
                                        config["W_regularizer"]),
                                    bigdl_type="float")
        bseq.add(BLayer.AddConstant(
            1.0, inplace=True))  # Add 1 as BigDL is one-based index
        bseq.add(blayer)
        return bseq
Exemple #5
0
 def __generate_zeropadding2d(self, dim1, dim2, n_input_dim, pad1, pad2,
                              pad3, pad4):
     model = BLayer.Sequential()
     paddinglayer1 = BLayer.Padding(dim=dim1,
                                    pad=pad1,
                                    n_input_dim=n_input_dim,
                                    value=0.0,
                                    n_index=1,
                                    bigdl_type="float")
     paddinglayer2 = BLayer.Padding(dim=dim1,
                                    pad=pad2,
                                    n_input_dim=n_input_dim,
                                    value=0.0,
                                    n_index=1,
                                    bigdl_type="float")
     paddinglayer3 = BLayer.Padding(dim=dim2,
                                    pad=pad3,
                                    n_input_dim=n_input_dim,
                                    value=0.0,
                                    n_index=1,
                                    bigdl_type="float")
     paddinglayer4 = BLayer.Padding(dim=dim2,
                                    pad=pad4,
                                    n_input_dim=n_input_dim,
                                    value=0.0,
                                    n_index=1,
                                    bigdl_type="float")
     model.add(paddinglayer1)
     model.add(paddinglayer2)
     model.add(paddinglayer3)
     model.add(paddinglayer4)
     return model
Exemple #6
0
    def create_globalaveragepooling2d(self, klayer, kclayer):
        bigdl_order = self.get_bdim_order(kclayer)
        input_shape = klayer.get_input_shape_at(0)
        if bigdl_order == "NCHW":
            b_kw = int(input_shape[3])
            b_kh = int(input_shape[2])
        else:
            b_kw = int(input_shape[2])
            b_kh = int(input_shape[1])

        seq = BLayer.Sequential()
        blayer = BLayer.SpatialAveragePooling(kw=b_kw,
                                              kh=b_kh,
                                              dw=b_kw,
                                              dh=b_kh,
                                              pad_w=0,
                                              pad_h=0,
                                              global_pooling=False,
                                              ceil_mode=False,
                                              count_include_pad=False,
                                              divide=True,
                                              format=bigdl_order,
                                              bigdl_type="float")
        seq.add(blayer)
        if bigdl_order == "NCHW":
            seq.add(BLayer.Squeeze(3, num_input_dims=3))
            seq.add(BLayer.Squeeze(2, num_input_dims=2))
        else:
            seq.add(BLayer.Squeeze(2, num_input_dims=3))
            seq.add(BLayer.Squeeze(1, num_input_dims=2))
        return seq
Exemple #7
0
 def _construct_bigdl_sequence(self):
     bseq = BLayer.Sequential()
     layerConverter = LayerConverter()
     for layer in self.kmodel.layers:
         blayer = layerConverter.create(
             layer, self.node_id_to_config_layer[layer.name])
         bseq.add(blayer)
     return bseq
Exemple #8
0
 def __return_sequences(self, return_sequences, blayer):
     # For recurrent layers, handle whether to return the last output sentence or the full sequence.
     if return_sequences:
         return blayer
     else:
         model = BLayer.Sequential()
         model.add(blayer)
         model.add(BLayer.Select(2, -1))
         return model
Exemple #9
0
def build_model(class_num):
    model = layer.Sequential()
    model.add(layer.Reshape([1, 28, 28]))
    model.add(layer.SpatialConvolution(1, 6, 5, 5))
    model.add(layer.Tanh())
    model.add(layer.SpatialMaxPooling(2, 2, 2, 2))
    model.add(layer.Tanh())
    model.add(layer.SpatialConvolution(6, 12, 5, 5))
    model.add(layer.SpatialMaxPooling(2, 2, 2, 2))
    model.add(layer.Reshape([12 * 4 * 4]))
    model.add(layer.Linear(12 * 4 * 4, 100))
    model.add(layer.Tanh())
    model.add(layer.Linear(100, class_num))
    model.add(layer.LogSoftMax())
    return model
Exemple #10
0
 def create_zeropadding3d(self, klayer, kclayer):
     padding = tuple(klayer.padding)
     input_shape = klayer.get_input_shape_at(0)
     model = BLayer.Sequential()
     paddinglayer1 = BLayer.Padding(dim=2,
                                    pad=-padding[0],
                                    n_input_dim=len(input_shape) - 1,
                                    value=0.0,
                                    n_index=1,
                                    bigdl_type="float")
     paddinglayer2 = BLayer.Padding(dim=2,
                                    pad=padding[0],
                                    n_input_dim=len(input_shape) - 1,
                                    value=0.0,
                                    n_index=1,
                                    bigdl_type="float")
     paddinglayer3 = BLayer.Padding(dim=3,
                                    pad=-padding[1],
                                    n_input_dim=len(input_shape) - 1,
                                    value=0.0,
                                    n_index=1,
                                    bigdl_type="float")
     paddinglayer4 = BLayer.Padding(dim=3,
                                    pad=padding[1],
                                    n_input_dim=len(input_shape) - 1,
                                    value=0.0,
                                    n_index=1,
                                    bigdl_type="float")
     paddinglayer5 = BLayer.Padding(dim=4,
                                    pad=-padding[2],
                                    n_input_dim=len(input_shape) - 1,
                                    value=0.0,
                                    n_index=1,
                                    bigdl_type="float")
     paddinglayer6 = BLayer.Padding(dim=4,
                                    pad=padding[2],
                                    n_input_dim=len(input_shape) - 1,
                                    value=0.0,
                                    n_index=1,
                                    bigdl_type="float")
     model.add(paddinglayer1)
     model.add(paddinglayer2)
     model.add(paddinglayer3)
     model.add(paddinglayer4)
     model.add(paddinglayer5)
     model.add(paddinglayer6)
     return model
Exemple #11
0
    def create_maxpooling1d(self, klayer, kclayer):
        input_shape = klayer.get_input_shape_at(0)  # batch, steps, dim
        bpadW, bpadH = self.to_bigdl_2d_padding(klayer.border_mode)

        seq = BLayer.Sequential()
        seq.add(
            BLayer.View([1, int(input_shape[1]),
                         int(input_shape[2])],
                        num_input_dims=3))
        blayer = BLayer.SpatialMaxPooling(kw=klayer.pool_length,
                                          kh=1,
                                          dw=klayer.stride,
                                          dh=1,
                                          pad_w=bpadW,
                                          pad_h=bpadH,
                                          to_ceil=False,
                                          format="NHWC",
                                          bigdl_type="float")
        seq.add(blayer)
        return seq
Exemple #12
0
 def create_merge(self, klayer, kclayer):
     self.__check_is_share_weights(kclayer)
     input_shape = klayer.get_input_shape_at(0)
     #TODO: dot_axes, node_indices, tensor_indices not supported.
     if klayer.output_shape and not isinstance(klayer.output_shape, tuple):
         raise Exception(
             "Only output_shape=None or a shape tuple is supported for now."
         )
     if klayer.output_mask:
         raise Exception("Argument `output_mask` is not supported for now.")
     if klayer.mode == "concat":
         blayer = BLayer.JoinTable(dimension=klayer.concat_axis,
                                   n_input_dims=len(input_shape[0]) - 1,
                                   bigdl_type="float")
     elif klayer.mode == "sum":
         blayer = BLayer.CAddTable(inplace=False, bigdl_type="float")
     elif klayer.mode == "mul":
         blayer = BLayer.CMulTable(bigdl_type="float")
     elif klayer.mode == "max":
         blayer = BLayer.CMaxTable(bigdl_type="float")
     elif klayer.mode == "dot":
         if len(input_shape[0]) >= 3:
             raise Exception(
                 "Merge mode `dot` doesn't support 3D input or above for now."
             )
         if input_shape[0][0] == None:
             raise Exception(
                 "For merge mode `dot`, please specify `batch_input_shape`."
             )
         model = BLayer.Sequential()
         blayer = model.add(BLayer.DotProduct(bigdl_type="float"))\
             .add(BLayer.Reshape([input_shape[0][0], 1]))
     elif klayer.mode in ['ave', 'cos']:
         raise Exception(
             "Merge mode `%s` not supported for now" %
             klayer.mode)  # TODO: whether to support cosine and average
     else:  # invalid mode or lambda functions
         raise Exception(
             "Invalid merge mode: `%s`. Lambda/function as merge mode is not supported for now."
             % klayer.mode)
     return blayer
Exemple #13
0
    def create_globalmaxpooling1d(self, klayer, kclayer):
        input_shape = klayer.get_input_shape_at(0)  # batch, step, dim
        b_kw = 1
        b_kh = int(input_shape[1])

        seq = BLayer.Sequential()
        seq.add(
            BLayer.View([int(input_shape[1]), 1,
                         int(input_shape[2])],
                        num_input_dims=2))
        blayer = BLayer.SpatialMaxPooling(kw=b_kw,
                                          kh=b_kh,
                                          dw=0,
                                          dh=0,
                                          pad_w=0,
                                          pad_h=0,
                                          to_ceil=False,
                                          format="NHWC",
                                          bigdl_type="float")
        seq.add(blayer)
        seq.add(BLayer.Squeeze(2, num_input_dims=2))
        seq.add(BLayer.Squeeze(1, num_input_dims=1))
        return seq
Exemple #14
0
 def fuse(self, src_blayer, activation):  # activation is a string
     seq = BLayer.Sequential()
     seq.add(src_blayer)
     seq.add(activation)
     seq.set_name(src_blayer.name())
     return seq