神经互连网除了CNN之外的另一个大范围的品种是

来源:http://www.dlcdcx.com 作者:国际前线 人气:197 发布时间:2019-07-12
摘要:原标题:在浏览器中举办深度学习:TensorFlow.js (七)递归神经互联网 介绍 上一篇博客大家谈谈了CNN,卷积神经互连网。CNN布满应用于图像相关的吃水学习场景中。可是CNN也许有一部分

原标题:在浏览器中举办深度学习:TensorFlow.js (七)递归神经互联网

介绍

上一篇博客大家谈谈了CNN,卷积神经互连网。CNN布满应用于图像相关的吃水学习场景中。可是CNN也许有一部分限量:

  • 很难应用于队列数据
  • 输入数据和出口数据都以定位长度
  • 不了然上下文

那么些标题就足以由中华VNN来拍卖了。

神经网络除了CNN之外的另三个广阔的品类是RNN,递归/循环神经互连网。这里的Evoque其实是三种神经互连网,Recurrent:时间递归 , Recusive:结构递归。时间递归神经网络的神经细胞间连接构成有向图,而构造递归神经互连网利用一般的神经互连网结构递归构造更为复杂的吃水互联网。我们大多数日子讲的RAV4NN指的是前一种,时间递归神经互联网。

2138a太阳集团 1

EscortNN的构造如上海体育地方所示,为了化解上下文的主题材料,WranglerNN网路中,输入Xt,输出ht,何况输出ht回反馈回管理单元A。上海体育场所侧边是随时间张开的种类图。tn时间的出口hn反馈成为tn 1时间的输入,hn和Xn 1一同成为tn 1时间的输入。那样也就保存了上下文对模型的熏陶,以越来越好的对准时间连串建立模型。

如下图所示,LX570NN能够支持不相同的输入输出体系。

XC60NN有部分变体,常见的是LSTM和GRU

LSTM即Long Short Memory Network,长短时记得互连网。它实际是属于ENCORENN的一种变种,能够说它是为了克制GL450NN无法很好管理中距离注重而提议的。

GRU2138a太阳集团,即Gated Recurrent Unit,是LSTM的贰个变体。GRU保持了LSTM的成效还要又使组织特别简约,所以它也要命流行。

2138a太阳集团 2

奥德赛NN能够使得的应用在偏下的天地中:

  • 音乐作曲
  • 图像捕捉
  • 话音识别
  • 时序相当管理
  • 股票价格预测
  • 文件翻译

事例:用奥迪Q5NN达成加法运算

咱俩那边介绍一个施用CRUISERNN来兑现加法运算的例证,源代码在此地,大概去小编的Codepen运营小编的事例。那一个事例最早源自keras。

毫无疑问世界的论据(reasoning)格局有三种,演绎(deduction)和汇总(induction)。

所谓的推理就是根据已有个别理论,通过逻辑推演,得出结论。杰出的正是欧几里得的几何原理,利用核心的原理和公理演绎出了全体欧氏几何的摩天津高校楼。而机械学习则是第超级的归结法,数据先行,现存观测数据,然后采取数学建模,找到最能够解释当前观看数据的公式。那就如理论物历史学家和实验物军事学家,理论物管理学家利用演绎,依据理论推出万物运维的道理,实验物法学家通超过实际验数据,反推理论,证实或然否定理论。当然二种办法是对称的,都是科学的利器。

好了我们回去加法的例证,这里我们要用机器学习的方法来教会电脑加法,记得用归结并不是演绎。因为Computer是很擅长演绎的,加法的演绎是装有计算的基础之一,定义0,1,2=1 1,然后演绎出装有的加法。这里用归结,然计算机算法通过已有的加法例子数据找到什么样总结加法。这样做当然不是最平价的,不过很有趣。

我们来看例子吗。

首先是三个亟待多个字符表的类来治本字符到张量的酷炫:

class CharacterTable {

/**

* Constructor of CharacterTable.

* @param chars A string that contains the characters that can appear

* in the input.

*/

constructor(chars) {

this.chars = chars;

this.charIndices = {};

this.indicesChar = {};

this.size = this.chars.length;

for (let i = 0; i < this.size; i) {

const char = this.chars[i];

if (this.charIndices[澳门太阳集团2138,char] != null) {

throw new Error(`Duplicate character '${char}'`);

}

this.charIndices[this.chars[i]] = i;

this.indicesChar[i] = this.chars[i];

}

}

/**

* Convert a string into a one-hot encoded tensor.

*

* @param str The input string.

* @param numRows Number of rows of the output tensor.

* @returns The one-hot encoded 2D tensor.

* @throws If `str` contains any characters outside the `CharacterTable`'s

* vocabulary.

*/

encode(str, numRows) {

const buf = tf.buffer([numRows, this.size]);

for (let i = 0; i < str.length; i) {

const char = str[i];

if (this.charIndices[char] == null) {

throw new Error(`Unknown character: '${char}'`);

}

buf.set(1, i, this.charIndices[char]);

}

return buf.toTensor().as2D(numRows, this.size);

}

encodeBatch(strings, numRows) {

const numExamples = strings.length;

const buf = tf.buffer([numExamples, numRows, this.size]);

for (let n = 0; n < numExamples; n) {

const str = strings[n];

for (let i = 0; i < str.length; i) {

const char = str[i];

if (this.charIndices[char]2138com太阳集团, == null) {

throw new Error(`Unknown character: '${char}'`);

}

buf.set(1, n, i, this.charIndices[char]);

}

}

return buf.toTensor().as3D(numExamples, numRows, this.size);

}

/**

* Convert a 2D tensor into a string with the CharacterTable's vocabulary.

*

* @param x Input 2D tensor.

* @param calcArgmax Whether to perform `argMax` operation on `x` before

* indexing into the `CharacterTable`'s vocabulary.

* @returns The decoded string.

*/

decode(x, calcArgmax = true) {

return tf.tidy(() => {

if (calcArgmax) {

x = x.argMax(1);

}

const xData = x.dataSync(); // TODO(cais): Performance implication?

let output = "";

for (const index of Array.from(xData)) {

output = this.indicesChar[index];

}

return output;

});

}

}

这一个类存款和储蓄了加法运算所能用到的有着字符,“0123456789 ”,当中空格是占位符,两位数的2会产生“ 2”。

为了促成字符到目录的双向映射, 这一个类保存了八个表,charIndices是字符到目录,indicesChar是索引到字符。

encode方法把二个加法字符串映射为贰个one hot的tensor:

this.charTable.encode("1 2",3).print();

Tensor

[[0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0],

[0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

this.charTable.encode("3",1).print()

Tensor

[[0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],]

诸如对于“1 2”等于“3”,输入和输出的张量如上所示。

decode是上述encode方法的逆向操作,把张量映射为字符串。

接下来举行多少变化:

function generateData(digits, numExamples, invert) {

const digitArray = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];

const arraySize = digitArray.length;

const output = [];

const maxLen = digits 1 digits;

const f = () => {

let str = "";

while (str.length < digits) {

const index = Math.floor(Math.random() * arraySize);

str = digitArray[神经互连网除了CNN之外的另一个大范围的品种是瑞虎NN2138com太阳集团。index];

}

return Number.parseInt(str);

};

const seen = new Set();

while (output.length < numExamples) {

const a = f();

const b = f();

const sorted = b > a ? [a, b] : [b, a];

const key = sorted[0] "`" sorted[1];

if (seen.has(key)) {

continue;

神经互连网除了CNN之外的另一个大范围的品种是瑞虎NN2138com太阳集团。}

seen.add(key);

// Pad the data with spaces such that it is always maxLen.

const q = `${a} ${b}`;

const query = q " ".repeat(maxLen - q.length);

let ans = (a b).toString();

// Answer can be of maximum size `digits 1`.

ans = " ".repeat(digits 1 - ans.length);

if (invert) {

throw new Error("invert is not implemented yet");

}

output.push([query, ans]);

}

return output;

}

浮动测量检验数据的措施,输入是加法的位数和浮动多少例子。对于两位数的加法,输入补齐为5个字符,输出补齐到3个字符,空位用空格。

神经互连网除了CNN之外的另一个大范围的品种是瑞虎NN2138com太阳集团。神经互连网除了CNN之外的另一个大范围的品种是瑞虎NN2138com太阳集团。generateData(2,10,false);

["24 38", "62 "]

["2 0 ", "2 "]

["86 62", "148"]

["36 91", "127"]

["66 51", "117"]

["47 40", "87 "]

["97 96", "193"]

["98 83", "181"]

["45 30", "75 "]

["88 75", "163"]

下一步须要把转换的数目转化成张量:

function convertDataToTensors(data, charTable, digits) {

const maxLen = digits 1 digits;

const questions = data.map(datum => datum[0]);

const answers = data.map(datum => datum[1]);

return [

charTable.encodeBatch(questions, maxLen),

charTable.encodeBatch(answers, digits 1)

];

}

改变的多少是贰个2个要素的列表,第叁个成分是难题张量,第3个元素是答案张量。

数量变化好了,下一步正是创造神经网络模型:

function createAndCompileModel(

layers,

hiddenSize,

rnnType,

digits,

vocabularySize

) {

const maxLen = digits 1 digits;

const model = tf.sequential();

switch (rnnType) {

case "SimpleRNN":

model.add(

tf.layers.simpleRNN({

units: hiddenSize,

recurrentInitializer: "glorotNormal",

inputShape: [maxLen, vocabularySize]

})

);

break;

case "GRU":

神经互连网除了CNN之外的另一个大范围的品种是瑞虎NN2138com太阳集团。model.add(

tf.layers.gru({

units: hiddenSize,

recurrentInitializer: "glorotNormal",

inputShape: [maxLen, vocabularySize]

})

);

break;

case "LSTM":

model.add(

tf.layers.lstm({

units: hiddenSize,

recurrentInitializer: "glorotNormal",

inputShape: [maxLen, vocabularySize]

})

);

break;

default:

throw new Error(`Unsupported RNN type: '${rnnType}'`);

}

model.add(tf.layers.repeatVector({ n: digits 1 }));

switch (rnnType) {

神经互连网除了CNN之外的另一个大范围的品种是瑞虎NN2138com太阳集团。case "SimpleRNN":

model.add(

tf.layers.simpleRNN({

units: hiddenSize,

recurrentInitializer: "glorotNormal",

returnSequences: true

})

);

break;

case "GRU":

model.add(

tf.layers.gru({

units: hiddenSize,

recurrentInitializer: "glorotNormal",

returnSequences: true

})

);

break;

case "LSTM":

model.add(

tf.layers.lstm({

units: hiddenSize,

recurrentInitializer: "glorotNormal",

returnSequences: true

})

);

break;

default:

throw new Error(`Unsupported RNN type: '${rnnType}'`);

}

model.add(

tf.layers.timeDistributed({

layer: tf.layers.dense({ units: vocabularySize })

})

);

model.add(tf.layers.activation({ activation: "softmax" }));

model.compile({

loss: "categoricalCrossentropy",

optimizer: "adam",

metrics: ["accuracy"]

});

return model;

}

此地的多少个至关心重视要的参数是:

  • rnnType, 汉兰达NN的互联网项目,这里有三种,Simple猎豹CS6NN,GRU和LSTM
  • hiddenSize,遮盖层的Size,决定了隐蔽层神经单元的范围,
  • digits,出席加法运算的数位
  • vocabularySize, 字符表的分寸,大家的事例里应该是12, 也正是sizeof(“0123456789 ”)

互联网的组成如下图, 图中 digits=2,hiddenSize=128:

2138a太阳集团 3

repeatVector层把第八个KugaNN层的输入重复digits 1次,扩充二个维数,输出适配到要估量的size上。这里是营造昂科威NN网络的一个亟待规划的点。

从此接着的是另三个MuranoNN层。

接下来是一个有12(vocabularySize)个单元全联接层,使用timeDistributed对TucsonNN的输出打包,获得的输出是的形状为 [digits 1,12] 。提姆eDistributed层的功力正是把Dense层应用到1二十六个有血有肉的向量上,对每贰个向量进行了一个Dense操作。传祺NN之所以能够进行多对多的投射,也是应用了个这些作用。

聊到底是二个激活activate层,使用softmax。因为这几个互连网精神上是二个分拣,相当于把装有的输入分类到 digit 1 * 12 的归类。 表示的digit 1位的数字。也正是说三个n位数字的加法,结果是n 1位数字。

末了一步,使用“Adam”算法作为优化器,交叉熵作为损失函数,编写翻译整个模型。

模型创设好了,接下去就能够开始展览操练了。

教练的代码如下:

class AdditionRNN {

constructor(digits, trainingSize, rnnType, layers, hiddenSize) {

// Prepare training data.

const chars = '0123456789 ';

this.charTable = new CharacterTable(chars);

console.log('Generating training data');

const data = generateData(digits, trainingSize, false);

const split = Math.floor(trainingSize * 0.9);

this.trainData = data.slice(0, split);

this.testData = data.slice(split);

[this.trainXs, this.trainYs] =

convertDataToTensors(this.trainData, this.charTable, digits);

[this.testXs, this.testYs] =

convertDataToTensors(this.testData, this.charTable, digits);

this.model = createAndCompileModel(

layers, hiddenSize, rnnType, digits, chars.length);

}

async train(iterations, batchSize, numTestExamples) {

console.log("training started!");

const lossValues = [];

const accuracyValues = [];

const examplesPerSecValues = [];

for (let i = 0; i < iterations; i) {

console.log("training iter " i);

const beginMs = performance.now();

const history = await this.model.fit(this.trainXs, this.trainYs, {

epochs: 1,

batchSize,

validationData: [this.testXs, this.testYs],

yieldEvery: 'epoch'

});

const elapsedMs = performance.now() - beginMs;

const examplesPerSec = this.testXs.shape[0] / (elapsedMs / 1000);

const trainLoss = history.history['loss'][0];

const trainAccuracy = history.history['acc'][0];

const valLoss = history.history['val_loss'][0];

const valAccuracy = history.history['val_acc'][0];

document.getElementById('trainStatus').textContent =

`Iteration ${i}: train loss = ${trainLoss.toFixed(6)}; `

`train accuracy = ${trainAccuracy.toFixed(6)}; `

`validation loss = ${valLoss.toFixed(6)}; `

`validation accuracy = ${valAccuracy.toFixed(6)} `

`(${examplesPerSec.toFixed(1)} examples/s)`;

lossValues.push({'epoch': i, 'loss': trainLoss, 'set': 'train'});

lossValues.push({'epoch': i, 'loss': valLoss, 'set': 'validation'});

accuracyValues.push(

{'epoch': i, 'accuracy': trainAccuracy, 'set': 'train'});

accuracyValues.push(

{'epoch': i, 'accuracy': valAccuracy, 'set': 'validation'});

examplesPerSecValues.push({'epoch': i, 'examples/s': examplesPerSec});

}

}

}

Addition福特ExplorerNN类完毕了模型练习的要紧逻辑。

在构造函数重生成陶冶多少,在那之中70%的数量用于操练,一成用以测量检验声明。

在磨练中,循环调用model.fit方法进行磨炼。

教练好得了,大家就足以运用该模型实行预测了。

const input = demo.charTable.encode("10 20",5).expandDims(0);

const result = model.predict(input);

result.print()

console.log("10 20 = " demo.charTable.decode(result.as2D(result.shape[1], result.shape[2])));

Tensor

[[[0.0010424, 0.0037433, 0.2403527, 0.4702294, 0.2035268, 0.0607058, 0.0166195, 0.0021113, 0.0012174, 0.0000351, 0.0000088, 0.0004075],

[0.3456545, 0.0999702, 0.1198046, 0.0623895, 0.0079124, 0.0325381, 0.2000451, 0.0856998, 0.0255273, 0.0050597, 0.000007 , 0.0153919],

[0.0002507, 0.0000023, 0.0000445, 0.0002062, 0.0000298, 0.0000679, 0.0000946, 0.0000056, 7e-7 , 2e-7 , 1e-7 , 0.9992974]]]

10 20 = 40

接纳charTable的encode方法把“10 20”编码转换为Tensor,因为输入为八个数据,所以用expandDims方法把它扩大三维,产生唯有几个数量的Batch

对此预测结果,只要看每三个Tensor行中最大的多寡,就能够找到相应的揣测数据了。比方地点的例证对应的结果是:“30空格”。当然此次模型的教练多少比比较小,未能无误预测也很健康。

谈起底大家看看那一个奥迪Q5NN网络到底好不好用。使用digits=2,hiddenSize=128,trainIterations=300,batchSize=128

2138a太阳集团 4

在这些例子中,当教练多少达到3000的时候,LSTM和GRU都能得到比较好的教练结果。两千意味着大概25%的两位数加法的数码。也正是说当调控了轮廓上三分一的数额后,大家就可见相比有把握的预测其余的两位数的加法了。当教练多少是100的时候(1%),SimpleOdysseyNN也依然有43%的准确率,可以说是一定不错的模子了。

好了,但是为啥吧?为何悍马H2NN可以用来预测加法呢?那一个和时间体系又有何关联啊?要是您和自家有平等的问号,请阅读这两篇故事集:LEA福睿斯NING TO EXECUTE,Sequence to Sequence Learning with Neural Networks

参考:

  • Recurrent Neural Networks in DL4J
  • The Unreasonable Effectiveness of Recurrent Neural Networks
  • Fundamentals of Deep Learning – Introduction to Recurrent Neural Networks
  • keras中TimeDistributed的用法
  • When and How to use TimeDistributedDense
  • 什么在长长期回想(LSTM)互联网中运用TimeDistributed层
  • 人们都能看懂的GRU
  • LSTM神经互联网 和 GRU神经互连网
  • 在线图表制作

© 文章权归作者全部回来微博,查看更加的多

小编:

本文由2138com太阳集团发布于国际前线,转载请注明出处:神经互连网除了CNN之外的另一个大范围的品种是

关键词: 2138com太阳集团 2138a太阳集团

最火资讯