11"""Sequence-to-Sequence word2vec."""
2-
32import keras .models
43from keras .optimizers import RMSprop
54from keras .layers import Input , Reshape
65from keras .layers .core import Dense
76from keras .layers .wrappers import TimeDistributed
8- from keras .layers import Conv2D
7+ from keras .layers import Conv2D , LSTM
98from keras .layers .pooling import MaxPool2D
109from keras .models import Model
11- from keras import regularizers
1210
1311from yklz import MaskConv , ConvEncoder , MaskConvNet
1412from yklz import MaskToSeq , MaskPooling , Pick
15- from yklz import RNNDecoder , LSTMPeephole , RNNCell
13+ from yklz import RNNDecoder , RNNCell
1614
1715from seq2vec .transformer import CharEmbeddingOneHotTransformer
1816from seq2vec .transformer import WordEmbeddingTransformer
@@ -40,7 +38,7 @@ def __init__(
4038 word2vec_model ,
4139 max_index = 10000 ,
4240 max_length = 10 ,
43- embedding_size = 300 ,
41+ char_embedding_size = 300 ,
4442 learning_rate = 0.0001 ,
4543 conv_size = 5 ,
4644 channel_size = 10 ,
@@ -57,24 +55,32 @@ def __init__(
5755 word2vec_model ,
5856 max_length ,
5957 )
60- self .embedding_size = embedding_size
58+ self .char_embedding_size = char_embedding_size
6159 self .max_index = max_index
6260 self .conv_size = conv_size
6361 self .channel_size = channel_size
6462 self .encoding_size = (
65- self .embedding_size // self .conv_size * self .channel_size
63+ self .char_embedding_size // self .conv_size * self .channel_size
6664 )
6765
6866 super (Seq2VecC2RChar , self ).__init__ (
6967 max_length ,
7068 latent_size ,
7169 learning_rate
7270 )
71+ self .custom_objects ['RNNDecoder' ] = RNNDecoder
72+ self .custom_objects ['MaskPooling' ] = MaskPooling
73+ self .custom_objects ['MaskToSeq' ] = MaskToSeq
74+ self .custom_objects ['MaskConv' ] = MaskConv
75+ self .custom_objects ['MaskConvNet' ] = MaskConvNet
76+ self .custom_objects ['ConvEncoder' ] = ConvEncoder
77+ self .custom_objects ['RNNCell' ] = RNNCell
78+ self .custom_objects ['Pick' ] = Pick
7379
7480 def create_model (
7581 self ,
7682 rho = 0.9 ,
77- decay = 0.01 ,
83+ decay = 0.0 ,
7884 ):
7985
8086 inputs = Input (
@@ -85,16 +91,15 @@ def create_model(
8591 )
8692 char_embedding = TimeDistributed (
8793 Dense (
88- self .embedding_size ,
94+ self .char_embedding_size ,
8995 use_bias = False ,
90- kernel_regularizer = regularizers .l2 (0.001 ),
9196 activation = 'tanh'
9297 )
9398 )(inputs )
9499
95100 char_embedding = Reshape ((
96101 self .max_length ,
97- self .embedding_size ,
102+ self .char_embedding_size ,
98103 1
99104 ))(char_embedding )
100105 masked_embedding = MaskConv (0.0 )(char_embedding )
@@ -109,19 +114,18 @@ def create_model(
109114 (2 , self .conv_size ),
110115 strides = (1 , self .conv_size ),
111116 activation = 'tanh' ,
112- padding = 'valid ' ,
117+ padding = 'same ' ,
113118 use_bias = False ,
114- kernel_regularizer = regularizers .l2 (0.001 )
115119 )
116120 )(masked_embedding )
117121
118- final_window_size = self .max_length - 1
119- final_feature_size = self .channel_size * self .embedding_size // self .conv_size
120-
121122 mask_feature = MaskPooling (
122123 MaxPool2D (
123- (final_window_size , 1 ),
124- padding = 'valid'
124+ (
125+ self .max_length ,
126+ 1
127+ ),
128+ padding = 'same'
125129 ),
126130 pool_mode = 'max'
127131 )(char_feature )
@@ -132,28 +136,25 @@ def create_model(
132136
133137 dense_input = RNNDecoder (
134138 RNNCell (
135- LSTMPeephole (
139+ LSTM (
136140 units = self .latent_size ,
137141 return_sequences = True ,
138142 implementation = 2 ,
139143 unroll = False ,
140- dropout = 0.1 ,
141- recurrent_dropout = 0.1 ,
142- kernel_regularizer = regularizers .l2 (0.001 ),
143- recurrent_regularizer = regularizers .l2 (0.001 ),
144+ dropout = 0. ,
145+ recurrent_dropout = 0. ,
144146 ),
145147 Dense (
146- units = final_feature_size ,
148+ units = self . encoding_size ,
147149 activation = 'tanh'
148150 ),
149- dense_dropout = 0.1
151+ dense_dropout = 0.
150152 )
151153 )(encoded_feature )
152154
153155 outputs = TimeDistributed (
154156 Dense (
155157 self .word_embedding_size ,
156- kernel_regularizer = regularizers .l2 (0.001 ),
157158 activation = 'tanh'
158159 )
159160 )(dense_input )
@@ -170,32 +171,18 @@ def create_model(
170171 model .compile (loss = 'cosine_proximity' , optimizer = optimizer )
171172 return model , encoder
172173
173- def load_customed_model (self , file_path ):
174- return keras .models .load_model (
175- file_path , custom_objects = {
176- 'RNNDecoder' : RNNDecoder ,
177- 'MaskPooling' : MaskPooling ,
178- 'MaskToSeq' : MaskToSeq ,
179- 'MaskConv' : MaskConv ,
180- 'MaskConvNet' : MaskConvNet ,
181- 'ConvEncoder' : ConvEncoder ,
182- 'LSTMPeephole' :LSTMPeephole ,
183- 'RNNCell' :RNNCell ,
184- 'Pick' :Pick
185- }
186- )
187-
188174 def load_model (self , file_path ):
189175 self .model = self .load_customed_model (file_path )
190176 picked = Pick ()(self .model .get_layer (index = 7 ).output )
191177 self .encoder = Model (
192178 self .model .input ,
193179 picked
194180 )
195- self .embedding_size = self .model .get_layer (index = 1 ).output_shape [2 ]
181+ self .char_embedding_size = self .model .get_layer (index = 1 ).output_shape [2 ]
196182 self .max_length = self .model .get_layer (index = 0 ).output_shape [1 ]
197183 self .max_index = self .model .input_shape [2 ]
198- self .conv_size = self .embedding_size // self .model .get_layer (index = 4 ).output_shape [2 ]
184+ self .conv_size = self .char_embedding_size \
185+ // self .model .get_layer (index = 4 ).output_shape [2 ]
199186 self .channel_size = self .model .get_layer (index = 4 ).output_shape [3 ]
200187 self .encoding_size = self .encoder .output_shape [1 ]
201188 self .latent_size = self .model .get_layer (index = 8 ).layer .recurrent_layer .units
0 commit comments