周杰伦几乎陪伴了每个90后的青春,那如果AI写杰伦风格的歌词会写成怎样呢?

首先当然我们需要准备杰伦的歌词,这里一共收录了他的十几张专辑,近5000多行歌词。

原文档格式:

第一步数据预处理

def preprocess(data):"""对文本中的字符进行替换,空格转换成逗号;换行变为句号。"""data = data.replace(' ', ',')data = data.replace('\n', '。')words = jieba.lcut(data, cut_all=False) # 全模式切词return words

处理后结果:

前10个词: ['想要', '有', '直升机', '。', '想要', '和', '你', '飞到', '宇宙', '去']

将处理完的数据写入内存并将文本转换完数字

# 构造词典及映射vocab = set(text)vocab_to_int = {w: idx for idx, w in enumerate(vocab)}int_to_vocab = {idx: w for idx, w in enumerate(vocab)}# 转换文本为整数int_text = [vocab_to_int[w] for w in text]

构建神经网络

a. 构建输入层

def get_inputs():inputs = tf.placeholder(tf.int32, [None, None], name='inputs')targets = tf.placeholder(tf.int32, [None, None], name='targets')learning_rate = tf.placeholder(tf.float32, name='learning_rate')return inputs, targets, learning_rate

b. 构建堆叠RNN单元

其中rnn_size指的是RNN隐层神经元个数


def get_init_cell(batch_size, rnn_size):lstm = tf.contrib.rnn.BasicLSTMCell(rnn_size)cell = tf.contrib.rnn.MultiRNNCell([lstm])initial_state = cell.zero_state(batch_size, tf.float32)initial_state = tf.identity(initial_state, 'initial_state')return cell, initial_state

c. Word Embedding

因为单词太多,所以需要进行embedding,模型中加入Embedding层来降低输入词的维度

def get_embed(input_data, vocab_size, embed_dim):embedding = tf.Variable(tf.random_uniform([vocab_size, embed_dim], -1, 1))embed = tf.nn.embedding_lookup(embedding, input_data)return embed

d. 构建神经网络,将RNN层与全连接层相连

其中cell为RNN单元; rnn_size: RNN隐层结点数量;input_data即input tensor;vocab_size:词汇表大小; embed_dim: 嵌入层大小

def build_nn(cell, rnn_size, input_data, vocab_size, embed_dim):embed = get_embed(input_data, vocab_size, embed_dim)outputs, final_state = build_rnn(cell, embed)logits = tf.contrib.layers.fully_connected(outputs, vocab_size, activation_fn=None)return logits, final_state

e. 构造batch

这里我们根据batch_size和seq_length分为len//(batch_size*seq_length)个batch,每个batch包含输入和对应的目标输出

def get_batches(int_text, batch_size, seq_length):'''构造batch'''batch = batch_size * seq_lengthn_batch = len(int_text) // batchint_text = np.array(int_text[:batch * n_batch]) # 保留能构成完整batch的数量int_text_targets = np.zeros_like(int_text)int_text_targets[:-1], int_text_targets[-1] = int_text[1:], int_text[0]# 切分x = np.split(int_text.reshape(batch_size, -1), n_batch, -1)y = np.split(int_text_targets.reshape(batch_size, -1), n_batch, -1)return np.stack((x, y), axis=1) # 组合

模型训练

from tensorflow.contrib import seq2seqtrain_graph = tf.Graph()with train_graph.as_default():vocab_size = len(int_to_vocab) # vocab_sizeinput_text, targets, lr = get_inputs() # 输入tensorinput_data_shape = tf.shape(input_text)# 初始化RNNcell, initial_state = get_init_cell(input_data_shape[0], rnn_size)logits, final_state = build_nn(cell, rnn_size, input_text, vocab_size, embed_dim)# 计算softmax层概率probs = tf.nn.softmax(logits, name='probs')# 损失函数cost = seq2seq.sequence_loss(logits,targets,tf.ones([input_data_shape[0], input_data_shape[1]]))# 优化函数optimizer = tf.train.AdamOptimizer(lr)# Gradient Clippinggradients = optimizer.compute_gradients(cost)capped_gradients = [(tf.clip_by_value(grad, -1., 1.), var) for grad, var in gradients if grad is not None]train_op = optimizer.apply_gradients(capped_gradients)

训练结果

Epoch  72 Batch   24/33   train_loss = 0.108Epoch  75 Batch   25/33   train_loss = 0.104Epoch  78 Batch   26/33   train_loss = 0.096Epoch  81 Batch   27/33   train_loss = 0.111Epoch  84 Batch   28/33   train_loss = 0.119Epoch  87 Batch   29/33   train_loss = 0.130Epoch  90 Batch   30/33   train_loss = 0.141Epoch  93 Batch   31/33   train_loss = 0.138Epoch  96 Batch   32/33   train_loss = 0.153Model Trained and Saved

train_loss还不错,不过可能过拟合了。

最后让我们加载模型,看看生成情况

 # 加载模型loader = tf.train.import_meta_graph(save_dir + '.meta')loader.restore(sess, save_dir)# 获取训练的结果参数input_text, initial_state, final_state, probs = get_tensors(loaded_graph)# Sentences generation setupgen_sentences = [prime_word]prev_state = sess.run(initial_state, {input_text: np.array([[1]])})# 生成句子for n in range(gen_length):dyn_input = [[vocab_to_int[word] for word in gen_sentences[-seq_length:]]]dyn_seq_length = len(dyn_input[0])# 预测probabilities, prev_state = sess.run([probs, final_state],{input_text: dyn_input, initial_state: prev_state})# 选择单词进行文本生成,用来以一定的概率生成下一个词pred_word = pick_word(probabilities[0][dyn_seq_length - 1], int_to_vocab)gen_sentences.append(pred_word)

哎哟不错哦!

最后的最后我还扩大了歌词库,这次引入了更多流行歌手,来看看效果吧。

好像更不错了!

如果你也喜欢杰伦,请点赞并分享生成的歌词。

点击这里→了解更多精彩内容

除了方文山,用TA你也能帮周杰伦写歌词了相关推荐

  1. 薄盒 | 方文山原创数字潮玩《庞克猫史汀》系列正在展出中

    文章来源于薄盒 2021 年 11 月 21 日至 2022 年 2 月 20 日,著名词人方文山首次跨界举办艺术创作巡回个展<方道文山流>在北京索卡艺术中心进行展出. 本次展览展出内容包 ...

  2. 不用叫方文山!AI 能拯救杰伦的土味歌词

    硅谷Live / 实地探访 / 热点探秘 / 深度探讨 前两天,当小探第一次听到周杰伦的<不爱我就拉倒>时,虽然做好了心理准备,但还是被歌词里愉快的乡土气息给震到了: "哥练的胸 ...

  3. 东风破 -词:方文山 曲:周杰伦

    东风破 -词:方文山 曲:周杰伦 东风破   一盏离愁孤单伫立在窗口 我在门後假装你人还没走 旧地如重游月圆更寂寞 夜半清醒的烛火不忍苛责我 *一壶漂泊浪迹天涯难入喉 你走之後酒暖回忆思念瘦 水向东流 ...

  4. 东风破 苏轼 喜欢的词,方文山的歌词好象就是这样借过来的。

    一盏离愁 孤单窗前自鬓头 奄奄门后 人未走 月圆寂寞 旧地重游 夜半清醒泪 烛火空留 一壶漂泊浪迹天涯难入喉 君去后 酒暖思谁瘦 水向东流 三春如梦向谁偷 花开却错 谁家琵琶东风破 岁月流离 不解时候 ...

  5. 进军NFT?方文山×周杰伦联名款公仔今日发售,将引入NFT防伪认证!

    进军NFT?方文山×周杰伦联名款公仔今日发售,将引入NFT防伪认证! 线上加密防伪认证NFT 索卡艺术宣布将推出方文山与周杰伦联名款<庞克猫史汀>(青花瓷款)收藏品公仔.据悉,本款公仔以周 ...

  6. 方文山、周杰伦那些漂亮得让人落泪的句子……

    引导语:大家还记得当年的周杰伦是如何成名吗?凭借着方文山,两个人的合作亲密无间,也成就了现在如此多的美句,一起来欣赏下. 1.最美的不是下雨天,是曾与你躲过雨的屋檐.--<不能说的秘密> ...

  7. 潮玩华猫来袭丨继周杰伦联名款后 ,方文山携上链购再推“华流”顶流联名款公仔数藏

    作为华流音乐泰斗大师级人物--方文山,将他对东方文学的钻研和喜爱研磨成艺术作品,于2021年年底跨界推出<庞克猫史汀>潮玩公仔,首款便推出"方文山X周杰伦"的联名款&q ...

  8. 献给母亲节的歌 - 江蕙 -《落雨声》,方文山词,周杰伦曲

    江蕙 -<落雨声>,方文山词,周杰伦曲 - [老掉牙] <<  小红莓乐队 The Cranberries | 首 页 | <忍者乱太郎>片头曲  >> ...

  9. 周杰伦《青花瓷》歌词欣赏-----方文山作词,周杰伦谱曲

    我一向不是一个非常崇拜某个人的音乐的人,只是有喜欢的歌就可以,不会盲目的崇拜某个人,只是喜欢某一首歌,当然还会看一下是谁的词和曲!周杰伦大部分的词都是方文山写的,而这首新歌< 青花瓷 >显 ...

  10. 人工智能VS方文山:究竟谁能更胜一筹

    昨晚周杰伦的新歌<红颜如霜>一出来,就以优美的中国风歌词和动人的旋律获得了无数网友的好评,其中还是不少网友称方文山把最好的歌词都给了周杰伦等等.方文山作为周杰伦的御用词人,自然才华和文笔堪 ...

最新文章

  1. 怎么两边同时取ln_脏辫发型怎么编编发教程图解简单易学!
  2. Keil编译产生的RO,RW和ZI是什么
  3. Linux系统入门学习:在Debian或Ubuntu上安装完整的内核源码
  4. Java SE 7、8、9 –推进Java
  5. PostGIS导入shp数据
  6. coin3D中导入机器人模型
  7. 关于flash player的问题
  8. 淘宝无线端一键直达微博自助生成工具
  9. python中保留字pass_Python包含的保留字
  10. 鸿蒙系统反应慢,系统优化非常的关键 鸿蒙2.0和iOS14的反应速度测试
  11. Vulnhub靶机 it is october
  12. 深恶痛绝重写setter和getter
  13. Spring的ioc控制反转
  14. Word文档使用Mathtype如何实现公式自动居中并右对齐编号?
  15. 创建系统映像时包含了 D、E 盘
  16. 基于Springboot社区居民健康档案管理系统 毕业设计-附源码220940
  17. 2. ZK客户端与服务端建立连接的过程(基于NIO)
  18. 【计算机与UNIX汇编原理⑫】——汇编考前复习【重要知识点 + 基础题 + 易错题 + 难题解析】
  19. 如何获取系统当前时间
  20. Spring官网阅读(四)BeanDefinition(上)

热门文章

  1. ARM嵌入式的位绑定原理
  2. 病毒之Worm.Win32.AutoRun
  3. 微软收购雅虎不如收购摩托罗拉
  4. PostgreSQL 数据库跨版本升级常用方案
  5. Android中自定义农历日历,Android实现自定义日历
  6. 【自然语言处理】【实体匹配】PromptEM:用于低资源广义实体匹配的Prompt-tuning
  7. Servlert项目部署到服务器,web初学之serverlet开发综述(一)
  8. 关于我想往自己写的管理系统登陆界面插个背景图片却一直被复制粘贴的网络方法误导这件事---JFrame设置背景图片
  9. 智者务其实,愚者争虚名
  10. XCTF密码学(入门二)