| 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) |