MCPcopy Create free account
hub / github.com/chinawithfrank/ChatBotCourse / model

Method model

chatbotv3/encoder_decoder_seq2seq.py:176–238  ·  view source on GitHub ↗
(self, x, y, weights, biases, training=True)

Source from the content-addressed store, hash-verified

174 return XY, Y
175
176 def model(self, x, y, weights, biases, training=True):
177 # 注:以下的6是one_hot_word_vectors_dim
178 # 取第一个样本的ABC
179 encoder_inputs = tf.slice(x, [0, 0, 0], [1, self.max_seq_len, self.word_vec_dim]) # shape=(1, 8, 128)
180 # 展开成2-D Tensor
181 encoder_inputs = tf.unstack(encoder_inputs, self.max_seq_len, 1) # [<tf.Tensor shape=(1, 128)>,...] 内含8个Tensor
182
183 # 取第一个样本的<EOS>WXYZ
184 decoder_inputs = tf.slice(x, [0, self.max_seq_len, 0], [1, self.max_seq_len, self.word_vec_dim]) # shape=(1, 8, 128)
185 decoder_inputs = decoder_inputs[0] # shape=(8, 128)
186 # 转成解码器的输入输出形状
187 decoder_inputs = tf.matmul(decoder_inputs, weights['enc2dec']) + biases['enc2dec']
188 # 展开成2-D Tensor
189 decoder_inputs = tf.unstack([decoder_inputs], axis=1) # [<tf.Tensor shape=(1, 6)>,...] 内含8个Tensor
190
191 # 取第一个样本的WXYZ
192 target_outputs = tf.slice(y, [0, 0, 0], [1, self.max_seq_len, self.one_hot_word_vectors_dim]) # shape=(1, 8, 6)
193 target_outputs = target_outputs[0] # shape=(8, 6)
194
195 # 构造网络结构:两层结构
196 encoder_layer1 = rnn.BasicLSTMCell(self.n_hidden, forget_bias=1.0)
197 encoder_layer2 = rnn.BasicLSTMCell(self.n_hidden, forget_bias=1.0)
198 decoder_layer1 = rnn.BasicLSTMCell(self.n_hidden, forget_bias=1.0)
199 decoder_layer2 = rnn.BasicLSTMCell(self.n_hidden, forget_bias=1.0)
200
201 # 输入是8个shape=(1, 128)的Tensor,输出是8个shape=(1, 1000)的Tensor
202 encoder_layer1_outputs, encoder_layer1_states = rnn.static_rnn(encoder_layer1, encoder_inputs, dtype=tf.float32, scope='encoder_layer1')
203 # 输入是8个shape=(1, 1000)的Tensor,输出是8个shape=(1, 1000)的Tensor
204 encoder_layer2_outputs, encoder_layer2_states = rnn.static_rnn(encoder_layer2, encoder_layer1_outputs, dtype=tf.float32, scope='encoder_layer2')
205 # 取解码器输入的<EOS>
206 # 输入是1个shape=(1, 6)的Tensor(<EOS>),输出是1个shape=(1, 1000)的Tensor
207 decoder_layer1_outputs, decoder_layer1_states = rnn.static_rnn(decoder_layer1, decoder_inputs[:1], initial_state=encoder_layer1_states, dtype=tf.float32, scope='decoder_layer1')
208 # 输入是1个shape=(1, 1000)的Tensor,输出是1个shape=(1, 1000)的Tensor
209 decoder_layer2_outputs, decoder_layer2_states = rnn.static_rnn(decoder_layer2, decoder_layer1_outputs, initial_state=encoder_layer2_states, dtype=tf.float32, scope='decoder_layer2')
210
211 decoder_layer2_outputs_combine = []
212 decoder_layer2_outputs_combine.append(decoder_layer2_outputs)
213 for i in range(self.max_seq_len - 1):
214 decoder_layer2_outputs = tf.unstack(decoder_layer2_outputs, axis=1)[0]
215 decoder_layer2_outputs = tf.matmul(decoder_layer2_outputs, weights['hid2tar']) + biases['hid2tar'][i]
216 # 输入是1个shape=(1, 6)的Tensor,输出是1个shape=(1, 1000)的Tensor
217 if training:
218 decoder_layer1_outputs, decoder_layer1_states = rnn.static_rnn(decoder_layer1, decoder_inputs[i+1:i+2], initial_state=decoder_layer1_states, dtype=tf.float32, scope='decoder_layer1')
219 else:
220 decoder_layer1_outputs, decoder_layer1_states = rnn.static_rnn(decoder_layer1, [decoder_layer2_outputs], initial_state=decoder_layer1_states, dtype=tf.float32, scope='decoder_layer1')
221 # 输入是1个shape=(1, 1000)的Tensor,输出是1个shape=(1, 1000)的Tensor
222 decoder_layer2_outputs, decoder_layer2_states = rnn.static_rnn(decoder_layer2, decoder_layer1_outputs, initial_state=decoder_layer2_states, dtype=tf.float32, scope='decoder_layer2')
223 decoder_layer2_outputs_combine.append(decoder_layer2_outputs)
224
225 # 下面的过程把8个shape=(1, 1000)的数组转成8个shape=(1, 1000)的Tensor
226 decoder_layer2_outputs_combine = tf.unstack(decoder_layer2_outputs_combine, axis=1)[0]
227 decoder_layer2_outputs_combine = tf.unstack(decoder_layer2_outputs_combine, axis=1)[0]
228 decoder_layer2_outputs_combine = tf.unstack([decoder_layer2_outputs_combine], axis=1)
229 # 重新对decoder_layer2_outputs赋值
230 decoder_layer2_outputs = decoder_layer2_outputs_combine
231
232 decoder_layer2_outputs = tf.unstack(decoder_layer2_outputs, axis=1)[0] # shape=(8, 1000)
233 decoder_layer2_outputs = tf.matmul(decoder_layer2_outputs, weights['hid2tar']) + biases['hid2tar'] # shape=(8, 6)

Callers 3

trainMethod · 0.95
testMethod · 0.95
predictMethod · 0.95

Calls 1

appendMethod · 0.45

Tested by

no test coverage detected