新加坡联合早报中文网即时报道亚洲和国际的评论、商业、体育、生活、科技与多媒体新闻,从世界各个维度报道世界经济新闻,时政新闻,突发新闻等。

当前位置:主页 > 新闻 > 用 TensorFlow 让你的机器人唱首原创给你听

用 TensorFlow 让你的机器人唱首原创给你听

来源:联合早报中文网作者:邵湖心更新时间:2020-09-01 22:20:03阅读:

本篇文章4098字,读完约10分钟

雷锋。本文将使用一个简单的模型在张量流上实现一个音频发生器。原作者杨发表在作者的个人博客上。授权雷(公开号:雷)出版。

我想看看人工智能今天是如何作曲的。

本文将使用张量流来编写一个音乐生成器。

当你对机器人说:我想要一首能表达希望和奇迹的歌时,会发生什么?

计算机将首先把你的声音转换成单词,提取关键词并把它们转换成单词向量。

然后我们将使用一些标记的音乐数据,它们是各种各样的人类情感。然后,通过在这些数据上训练模型,在模型被训练之后,可以产生具有所需关键词的音乐。

程序的最终输出结果是一些和弦,他会选择一些最接近主人需要输出的情感关键词的和弦。

当然,你不仅可以听它,还可以把它作为创作音乐的参考,这样你就可以很容易地创作音乐,即使你没有练习10,000个小时。

机器学习实际上是为了扩展我们的大脑和能力。

Deepmind发表了一篇名为wavenet的论文,介绍了音乐生成和文本转换为语音的艺术。

一般来说,语音生成模型是串联的。这意味着,如果我们想从一些文本样本中生成语音,我们需要一个非常大的语音片段数据库。通过截取其中的一些并重新组合在一起,我们可以形成一个完整的句子。

音乐的生成也是如此,但是它有一个很大的困难:当你组合一些静态的成分时,很难自然地和情绪化地生成声音。

一个理想的方法是,我们可以将生成音乐所需的所有信息保存到模型的参数中。报纸上是这么说的。

我们不需要将输出结果传递给信号处理算法来得到语音信号,而是直接处理语音信号的波形。

他们使用的模型是美国有线电视新闻网。在这个模型的每一个隐藏层中,每一个扩展因子都可以相互关联并呈指数增长。每个步骤中生成的样本将被放回网络,并用于生成下一步。

我们可以看看这个模型的图表。输入数据是单个节点。作为一个粗糙的声波,它需要为以下操作进行预处理。

然后我们对它进行编码,生成一个张量,它有一些样本和通道。

然后把它放到cnn网络的第一层。该层将生成通道数,以便进行更简单的处理。

然后合并所有输出结果并增加其维数。然后将尺寸添加到通道的原始编号中。

将这个结果放入损失函数中,以衡量我们的模型训练得有多好。

最后,这个结果将被再次输入网络,以生成下一个时间点所需的声波数据。

重复这个过程,生成更多的语音。

这个网络非常大,在他们的gpu集群上需要90分钟,而且只能产生一秒钟的音频。

接下来,我们将使用一个更简单的模型在张量流上实现一个音频发生器。

1.介绍包:数据科学包numpy,数据分析包熊猫,tqdm可以生成一个进度条来显示培训进度。

importnumpyasnp

importpandasaspd

importmsgpackeimportglob

importtensorflowastf

from sensorflow . python . opsimportcontrol _ flow _ ops

fromtqdmimporttqdm

importmidi _操纵

我们将使用神经网络模型RBM-限制性玻尔兹曼机作为生成模型。

它是一个两层网络:第一层是可见的,第二层是隐藏的。同一层的节点之间没有连接,不同层的节点相互连接。每个节点必须决定是否需要将接收到的数据发送到下一层,这个决定是随机的。

2.定义超级参数:首先定义模型需要生成的注释范围

low _ note = midi _ operation . lowerbond # lower的索引

最高音符= midi _ operation . upper bond #最高音符的索引

注意范围=最高注意-最低注意#注意范围

然后你需要定义时间步长的大小,可见层和隐藏层。

num _ timesteps = 15 #这是我们一次将创建的时间步长数

n _ visible = 2 * note _ range * num _ time steps #这是可见层的大小。

n _ hidden = 50 #这是隐藏层的大小123123

培训时间、批处理大小和学习率。

num _ epochs = 200 #我们将要运行的训练时段数。对于每个时期,我们都要浏览整个数据集。

batch _ size = 100 #我们一次将通过rbm发送的训练示例数。

lr = tf .常量(0.005,TF . float 32)#我们模型的学习率

3.定义变量:X是放入网络的数据

w用于存储权重矩阵,或两层之间的关系

另外,需要两种偏置,一种是隐藏层的bh,另一种是可见层的bv

x=tf.placeholder(tf.float32,[none,n_visible],name = " x ")# the placeholder variablethattholdsourdata

w = TF . variable(TF . random _ normal([n _ visible,n_hidden],0.01),name = " w ")# wethightmaxthatstoresedge weights

bh=tf.variable(tf.zeros([1,n_hidden],tf.float32,name = " BH ")# the biasevectorforthehiddenlayer

bv=tf.variable(tf.zeros([1,n_visible],tf.float32,name = " bv ")# the biasevectorforthevevisible layer

然后,使用辅助方法gibbs_sample从输入数据x和隐藏层的样本中创建样本:

Gibbs_sample是一种能够从多个概率分布中提取样本的算法。

它可以生成一个统计模型,其中每个状态依赖于前一个状态,并随机生成符合分布的样本。

# sample of x

x_sample=gibbs_sample(1)

#的完成,从x的可视状态开始

h =样本(tf.sigmoid(tf.matmul(x,w)+bh))

# hiddennodes的示例,从x_sample的可视状态开始

h _ sample = sample(TF . sigmoid(TF . mat mul(x _ sample,w)+bh))

更新变量:size _ Bt = tf.cast (tf.shape (x) [0],tf.float32)

w_adder = tf.mul(lr/size_bt,tf.sub(tf.matmul(tf .转置(x),h),tf.matmul(tf .转置(x_sample),h_sample)))

bv_adder = tf.mul(lr/size_bt,tf.reduce_sum(tf.sub(x,x_sample),0,true))

bh_adder = tf.mul(lr/size_bt,tf.reduce_sum(tf.sub(h,h_sample),0,true))

#当我们运行sess.run(updt)时,tensorflow将运行所有3个更新步骤

updt = [w.assign_add(w_adder),bv.assign_add(bv_adder),bh.assign_add(bh_adder)]

5.接下来,运行图表算法图:5.1首先用会话初始化变量:

#首先,湿雨模型

#模型的变量

init = TF . initialize _ all _ variables()

sess.run(init)

首先,我们需要重塑每首歌曲,以便相应的矢量表示可以更好地用于训练模型。

范围(num _ epochs)):

forsonginsongs:

# songsarestoretimexnotes format . the zeofeachsongsistimesteps _ in _ song x2 * note _ range

#此处是shapethe songsoteachtrainingxampleisavectorwithnum _ timestapsx2 * note _ range elements

歌曲=np.array(歌曲)

歌曲=歌曲[:np.floor(歌曲. shape[0]/num _ time steps)* num _ time steps]

歌曲= NP . resform(歌曲,[歌曲.形状[0]/num_timesteps,歌曲.形状[1]*num_timesteps])

5.2接下来,训练rbm模型,一次一个样本,范围(1,len(歌曲),批量大小):

tr _ x =歌曲[I:I+批量大小]

sess.run(updt,feed_dict={x:tr_x})

模型经过充分训练后,可以用来生成音乐。

5.3有必要训练吉布斯链,其中可见节点被初始化为0,以生成一些样本。

然后将矢量重新整形为更好的格式以便回放。

样本=gibbs_sample(1)。eval(session=sess,feed_dict={x:np.zeros((10,n_visible))})

for line range(sample . shape[0]):

ifnotany(样本[i,]):

继续

#我们在这里创建了vector betimex notes,并保存了vector rasamidifile

s = NP . resform(样本[i,],(num_timesteps,2*note_range))

5.4最后,打印出生成的和弦midi _。格式(一))

总而言之,有线电视新闻网被用来参数化地产生声波。

使用rbm,可以很容易地从训练数据中生成音频样本,

吉布斯算法可以帮助我们得到基于概率分布的训练样本。

本文是基于siraj视频,视频链接和github源代码在这里提供参考。

雷锋文章版权所有。严禁擅自转载。详情请参考转载说明。

标题:用 TensorFlow 让你的机器人唱首原创给你听

地址:http://www.6st8.com/zbxw/4968.html

免责声明:联合早报中文网从世界各个维度报道世界经济新闻,时政新闻,突发新闻等,本篇的部分内容来自于网络,不为其真实性负责,只为传播网络信息为目的,非商业用途,如有异议请及时联系btr2018@163.com,联合早报中文网的小编将予以删除。

返回顶部