def train_gru(): logging.info('GRU original ...') num_epochs, num_steps, batch_size, lr, clipping_theta = 160, 35, 32, 1e2, 1e-2 pred_period, pred_len, prefixes = 40, 50, ['分开', '不分开'] train_and_predict_rnn(gru, get_params, init_gru_state, num_hiddens, vocab_size, device, corpus_indices, idx_to_char, char_to_idx, False, num_epochs, num_steps, lr, clipping_theta, batch_size, pred_period, pred_len, prefixes) logging.info('GRU with PyTorch ...') lr = 1e-2 # 注意调整学习率 gru_layer = nn.GRU(input_size=vocab_size, hidden_size=num_hiddens) model = RNNModel(gru_layer, vocab_size).to(device) train_and_predict_rnn_pytorch(model, num_hiddens, vocab_size, device, corpus_indices, idx_to_char, char_to_idx, num_epochs, num_steps, lr, clipping_theta, batch_size, pred_period, pred_len, prefixes)
H = state_h C = state_c outputs = [] for X in inputs: I = nd.sigmoid(nd.dot(X, W_xi) + nd.dot(H, W_hi) + b_i) F = nd.sigmoid(nd.dot(X, W_xf) + nd.dot(H, W_hf) + b_f) O = nd.sigmoid(nd.dot(X, W_xo) + nd.dot(H, W_ho) + b_o) C_tilda = nd.tanh(nd.dot(X, W_xc) + nd.dot(H, W_hc) + b_c) C = F * C + I * C_tilda H = O * nd.tanh(C) Y = nd.dot(H, W_hy) + b_y outputs.append(Y) return (outputs, H, C) seq1 = '分开' seq2 = '不分开' seq3 = '战争中部队' seqs = [seq1, seq2, seq3] utils.train_and_predict_rnn(rnn=lstm_rnn, is_random_iter=False, epochs=200, num_steps=35, hidden_dim=hidden_dim, learning_rate=.2, clipping_norm=5, batch_size=32, pred_period=20, pred_len=100, seqs=seqs, get_params=get_params, get_inputs=get_inputs, ctx=ctx, corpus_indices=corpus_indices, idx_to_char=idx_to_char, char_to_idx=char_to_idx, is_lstm=True)
Z = torch.sigmoid(torch.matmul(X, W_xz) + torch.matmul(H, W_hz) + b_z) R = torch.sigmoid(torch.matmul(X, W_xr) + torch.matmul(H, W_hr) + b_r) H_tilda = torch.tanh( torch.matmul(X, W_xh) + R * torch.matmul(H, W_hh) + b_h) H = Z * H + (1 - Z) * H_tilda Y = torch.matmul(H, W_hq) + b_q outputs.append(Y) return outputs, (H, ) print('训练并创作歌词') num_epochs, num_steps, batch_size, lr, clipping_theta = 300, 35, 32, 1e2, 1e-2 pred_period, pred_len, prefixes = 40, 50, ['可爱女人', '龙卷风'] utils.train_and_predict_rnn(gru, get_params, init_gru_state, num_hiddens, vocab_size, device, corpus_indices, idx_to_char, char_to_idx, False, num_epochs, num_steps, lr, clipping_theta, batch_size, pred_period, pred_len, prefixes) ''' 训练并创作歌词 epoch 40, perplexity 101.107354, time 2.45 sec - 可爱女人 我想要你的爱写 像在我的爱你 让我们 你不是 快兽人 的灵魂 有一种 三颗 一直两 一颗 三颗 一 - 龙卷风 我想要你的爱人 让我们 你不是 一颗两 三颗 一颗 三颗 一颗 三颗 三颗 有一种 三颗 一直两 epoch 80, perplexity 7.574267, time 2.49 sec - 可爱女人 沉许在美索不达米亚平原 爷爷泡的茶 有一种味道叫做家 他羽泡的茶 听说名和利 不拿跳动 全天用双截 - 龙卷风 我会怕着二碎人人就能眼泪 别手不能够永远不及 难道这不是我要的天堂景象 沉沦假象 你只会感到更 epoch 120, perplexity 1.670065, time 2.59 sec - 可爱女人 沉亮的欢乐琴上的红色油漆 反射出儿时天真的嬉戏模样 被期待 被覆盖 蜕变的公式我学不来 难道这 - 龙卷风 我想要你想远想一点汗融戏 最后再一个人慢慢的回忆 没有了过去 我将往事抽离 如果我遇见你是一场悲剧 epoch 160, perplexity 1.094771, time 2.59 sec - 可爱女人 沉不容易不要再让 没有你梦的有 一本又抱半岛铁 爷爷泡的茶 像幅泼墨的山水画 唐朝千年的风沙 现在