使用张量流概率的路缘石MDN层。

keras-mdn-layer的Python项目详细描述


路缘石混合密度网络层

Build StatusMIT LicenseDOIPyPI version

基于tensorflow分布模型的路缘石混合密度网络(mdn)层。这使得用神经网络来预测多个实值变量的实验变得更加简单,这些变量可以具有多个同样可能的值。

这一层可以帮助构建类似于RoboJamSketch-RNNhandwriting generation,甚至world models中使用的MDN RNN。您可以用MDN做很多很酷的事情!

此实现的一个好处是可以预测任意数量的实际值。tensorflow的MixtureCategoricalMultivariateNormalDiag分布函数用于生成损失函数(多元正态分布与对角协方差矩阵的混合的概率密度函数)。在以前的工作中,损失函数通常是手工指定的,这对于1d或2d预测来说是很好的,但是之后会变得更加烦人。

为训练和预测提供了两个重要功能:

  • get_mixture_loss_func(output_dim, num_mixtures):此函数生成具有正确输出维数和混合数的损失函数。
  • sample_from_output(params, output_dim, num_mixtures, temp=1.0):这个函数从模型输出的混合分布中抽取样本。

安装

此项目需要Python3.6+。您可以通过pip轻松地从PyPI安装此软件包,如下所示:

python3 -m pip install keras-mdn-layer

最后,在python中导入mdn模块:import mdn

或者,您可以克隆或下载此存储库,然后通过python setup.py install安装,或者将mdn文件夹复制到您自己的项目中。

示例

笔记本目录中提供了一些示例。

有适合多值函数的脚本,一个标准的mdn toy问题:

Keras MDN Demo

还有一个脚本用于生成假汉字:

kanji test 1

最后,为了学习如何生成带有时间成分的音乐触摸屏表演:

Robojam Model Examples

如何使用

mdn层应该是网络中的最后一层,您应该使用get_mixture_loss_func来生成丢失函数。下面是一个简单网络的例子,它有一个密集层,后面跟着mdn。

import keras
import mdn

N_HIDDEN = 15  # number of hidden units in the Dense layer
N_MIXES = 10  # number of mixture components
OUTPUT_DIMS = 2  # number of real-values predicted by each mixture component

model = keras.Sequential()
model.add(keras.layers.Dense(N_HIDDEN, batch_input_shape=(None, 1), activation='relu'))
model.add(mdn.MDN(OUTPUT_DIMS, N_MIXES))
model.compile(loss=mdn.get_mixture_loss_func(OUTPUT_DIMS,N_MIXES), optimizer=keras.optimizers.Adam())
model.summary()

正常安装:

history = model.fit(x=x_train, y=y_train)

来自网络的预测是混合模型的参数,因此必须应用sample_from_output函数来生成样本。

y_test = model.predict(x_test)
y_samples = np.apply_along_axis(sample_from_output, 1, y_test, OUTPUT_DIMS, N_MIXES, temp=1.0)

在jupyter笔记本中查看笔记本目录中的示例!

致谢

参考文献

  1. 克里斯托弗M.毕晓普。1994年。混合密度网络。Technical Report NCRG/94/004。阿斯顿大学神经计算研究小组。http://publications.aston.ac.uk/373/
  2. 阿克塞尔·布兰多。2017年。用于分布和不确定度估计的混合密度网络(mdn)。硕士论文。加泰罗尼亚政治大学。
  3. 格雷夫斯。2013年。用递归神经网络生成序列。Arxiv电子印刷品(2013年8月)。https://arxiv.org/abs/1308.0850
  4. 大卫哈和道格拉斯艾克。2017年。草图的神经表示法。ARXIV电子印刷品(2017年4月)。https://arxiv.org/abs/1704.03477
  5. 查尔斯·马丁和吉姆·托雷森。2018年。Robojam:用于协作触摸屏交互的音乐混合密度网络。在进化和生物启发的音乐、声音、艺术和设计中:Evomusart'18,A.Liapis等人。(编辑)。计算机科学讲义,第10783卷。斯普林格国际出版公司。doi:10.1007/9778-3-319-77583-8_11

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java使用CSPRNG中的序列种子PRNG安全吗?   java如何使JTable列大小与内容精确(或紧密)匹配?   java Android textview具有两种不同大小的文本   java在任意事物的列表(数组)中创建关联的最佳方法是什么?   java保存可扩展字符串?   java成员类(内部类)如何访问外部类的实例变量?   java使用Android 6.0(API级别23)使用rest的最佳方式是什么   java为什么我会收到“学习记录”。Student@25a43blb'尝试显示链接列表中的所有对象时?   java如何将SVG文本转换为SVG路径?   java Paypal返回URL参数支付状态   java Libgdx:导出到可运行Jar   java JPA获取连接实体的最小/最大属性   附加到类型变量的java编号?   java Object[]到底是什么?   java如何在安卓中的片段和活动之间共享数据   java使用MinGW为windows构建linux库   java将变量值传递给eval函数   java仅在转换完成时使方法返回   Java二维数组对角线