主要内容

图像字幕使用注意

这个例子展示了如何训练图像的深度学习模型使用注意字幕。

大多数pretrained深度学习网络配置为单标牌分类。例如,给定一个形象,一个典型的办公桌上,网络可能预测单个类“键盘”或“鼠标”。相比之下,一个图像字幕模型结合卷积和反复操作生成一个文本描述的是什么形象,而不是一个单一的标签。

这个模型训练在这个示例使用一个encoder-decoder架构。编码器是pretrained Inception-v3网络用于特征提取器。解码器是一个递归神经网络(RNN),提取的特征作为输入,并生成一个标题。译码器包含了一个注意机制允许的解码器关注部分编码输入而生成标题。

编码器模型是pretrained Inception-v3模型,提取的特征“mixed10”层,其次是完全连接和ReLU操作。

译码器模型嵌入由一个词,一个关注机制,一个封闭的复发性单元(格勒乌),和两个完全连接操作。

负载Pretrained网络

加载一个pretrained Inception-v3网络。这一步需要深度学习工具箱™模型Inception-v3网络万博1manbetx支持包。如果你没有安装所需的支持包,然后软件提供一个下载链接。万博1manbetx

网= inceptionv3;inputSizeNet = net.Layers (1) .InputSize;

网络转换为一个dlnetwork对象特征提取和删除过去的四层,离开“mixed10”层的最后一层。

lgraph = layerGraph(净);lgraph = removeLayers (lgraph, (“avg_pool”“预测”“predictions_softmax”“ClassificationLayer_predictions”]);

网络的输入层。Inception-v3网络使用symmetric-rescale正常化的最小值为0,最大值为255。

lgraph.Layers (1)
ans = ImageInputLayer属性:名称:“input_1”InputSize: [299 299 3] Hyperparameters DataAugmentation:“没有”正常化:“rescale-symmetric”NormalizationDimension:“汽车”马克斯:255分钟:0

定制培训不支持这个正常化,所以你必须禁用网络中的归万博1manbetx一化和循环执行定制的规范化培训。保存的最小值和最大值变量命名的双打inputMininputMax分别和替换输入层与图像输入层没有规范化。

inputMin =双(lgraph.Layers (1) .Min);inputMax =双(lgraph.Layers (1) .Max);层= imageInputLayer (inputSizeNet正常化=“没有”、名称=“输入”);lgraph = replaceLayer (lgraph,“input_1”层);

确定网络的输出尺寸。使用analyzeNetwork功能的激活大小最后一层。分析网络定制培训循环工作流程,设置TargetUsage选项“dlnetwork”

analyzeNetwork (lgraph TargetUsage =“dlnetwork”)

2021 - 06 - 30 - _18 30 - 15. png

创建一个变量命名outputSizeNet包含网络输出大小。

outputSizeNet = (2048 8);

转换层图dlnetwork对象,并查看输出层。输出层“mixed10”层Inception-v3网络。

净= dlnetwork (lgraph)
dlnet = dlnetwork属性:层:[311×1 nnet.cnn.layer.Layer]连接:[345×2表]可学的:(376×3表)状态:[188×3表]InputNames:{“输入”}OutputNames: {“mixed10”}

进口可可数据集

从数据集下载图片和注释“2014训练图像”和“2014火车/ val注释”,分别https://cocodataset.org/下载。将图片和注释解压到一个文件夹命名“可可”。2014收集的数据集是可可可可财团

从文件中提取标题“captions_train2014.json”使用jsondecode函数。

dataFolder = fullfile (tempdir,“可可”);文件名= fullfile (dataFolder,“annotations_trainval2014”,“注释”,“captions_train2014.json”);str = fileread(文件名);data = jsondecode (str)
data =结构体字段:信息(1×1结构):图片:[82783×1 struct]许可证:[8×1 struct]注释:(414113×1结构)

注释结构的字段包含图像字幕所需的数据。

data.annotations
ans =414113×1结构体数组字段:image_id id标题

为每个图像数据集包含多个标题。以确保相同的图片没有出现在训练集和验证集,确定独特的图像数据集使用独特的函数使用的idimage_id字段的注释字段的数据,然后查看独特的图像的数量。

numObservationsAll =元素个数(data.annotations)
numObservationsAll = 414113
imageid = [data.annotations.image_id];imageIDsUnique =独特(imageid);numUniqueImages =元素个数(imageIDsUnique)
numUniqueImages = 82783

每个图片都有至少五个标题。创建一个结构体annotationsAll这些字段:

  • ImageID⁠——形象标识

  • 文件名⁠——图像的文件名

  • 标题⁠——原始标题的字符串数组

  • CaptionIDs⁠——矢量指数相应的标题data.annotations

简化合并,形象的注释id。

[~,idx] = ([data.annotations.image_id])进行排序;data.annotations= data.annotations(idx);

循环在注释和必要时合并多个注释。

我= 0;j = 0;imageIDPrev = 0;我<元素个数(data.annotations)我= + 1;imageID = data.annotations .image_id;标题=字符串(data.annotations(我).caption);如果imageID ~ = imageIDPrev%创建新条目j = + 1;annotationsAll (j)。ImageID= imageID; annotationsAll(j).Filename = fullfile(dataFolder,“train2014”,“COCO_train2014_”+垫(字符串(imageID) 12“左”,“0”)+“jpg”);annotationsAll (j)。标题= caption; annotationsAll(j).CaptionIDs = i;其他的%添加标题annotationsAll (j)。标题= [annotationsAll(j).Captions; caption]; annotationsAll(j).CaptionIDs = [annotationsAll(j).CaptionIDs; i];结束imageIDPrev = imageID;结束

分区数据为训练集和验证集。坚持5%的观测进行测试。

本量利= cvpartition(元素个数(annotationsAll),坚持= 0.05);idxTrain =培训(cvp);idxTest =测试(cvp);annotationsTrain = annotationsAll (idxTrain);annotationsTest = annotationsAll (idxTest);

该结构包含三个字段:

  • id——标题的惟一标识符

  • 标题——图像标题,指定为一个特征向量

  • image_id——唯一标识符相对应的图像标题

查看图像和相应的标题,定位图像文件的文件名“train2014 \ COCO_train2014_XXXXXXXXXXXX.jpg”,在那里“XXXXXXXXXXXX”对应于图像ID left-padded长度12 0。

imageID = annotationsTrain (1) .ImageID;标题= annotationsTrain (1) .Captions;文件名= annotationsTrain (1) .Filename;

查看图像,使用imreadimshow功能。

img = imread(文件名);图imshow (img)标题(字幕)

准备培训资料

准备字幕进行训练和测试。提取文本标题字段包含训练和测试数据的结构体(annotationsAll),擦掉标点符号,将文本转换为小写的。

annotationsAll.Captions captionsAll =猫(1);captionsAll = erasePunctuation (captionsAll);captionsAll =低(captionsAll);

为了生成标题,RNN解码器需要特殊的启动和停止标记指示何时启动和停止生成文本,分别。添加自定义令牌“<开始>”“<停止>”开始和结束的字幕,分别。

captionsAll =“<开始>”+ captionsAll +“<停止>”;

标记使用的标题tokenizedDocument功能和指定启动和停止令牌使用CustomTokens选择。

documentsAll = tokenizedDocument (captionsAll CustomTokens = (“<开始>”“<停止>”]);

创建一个wordEncoding对象地图语言数字指标。减少内存需求通过指定一个词汇量大小为5000对应最频繁的训练数据中观察到的字。为了避免偏见,只使用训练集对应的文档。

内附= wordEncoding (documentsAll (idxTrain) MaxNumWords = 5000,订单=“频率”);

创建一个包含图像的增强图像数据存储相应的标题。设置输出大小来匹配输入的大小卷积网络。保持图像同步字幕,指定一个表的数据存储的文件名重建图像文件名使用ID。返回灰度图像作为三路RGB图像,设置ColorPreprocessing选项“gray2rgb”

annotationsTrain.Filename tblFilenames =表(猫(1));augimdsTrain = augmentedImageDatastore (inputSizeNet tblFilenames ColorPreprocessing =“gray2rgb”)
augimdsTrain = augmentedImageDatastore属性:NumObservations: 78644 MiniBatchSize: 1 DataAugmentation:“没有一个”ColorPreprocessing:“gray2rgb”OutputSize: 299年[299]OutputSizeMode:“调整”DispatchInBackground: 0

初始化模型参数

初始化模型参数。指定512隐藏的单位词嵌入维数为256。

embeddingDimension = 256;numHiddenUnits = 512;

初始化结构体包含编码器的参数模型。

  • 初始化的重量完全使用Glorot初始化连接操作,指定的initializeGlorot函数,列出的例子。指定的输出大小相匹配的嵌入维解码器(256)和一个输入大小匹配pretrained网络的输出通道的数量。的“mixed10”层Inception-v3网络的输出数据与2048个频道。

* outputSizeNet numFeatures = outputSizeNet (1) (2);inputSizeEncoder = outputSizeNet (3);parametersEncoder =结构;%完全连接parametersEncoder.fc。重量= dlarray (initializeGlorot (embeddingDimension inputSizeEncoder));parametersEncoder.fc。偏见= dlarray (0 (embeddingDimension [1],“单身”));

初始化结构体包含解码器参数模型。

  • 初始化这个词嵌入权重的大小由嵌入维度和词汇量大小+ 1,额外的条目对应于填充的值。

  • 初始化的重量和偏见Bahdanau注意机制与大小对应于隐藏单位的格勒乌操作的数量。

  • 初始化权重和偏见的格勒乌操作。

  • 初始化两个完全连接操作的重量和偏见。

为模型解码器参数,初始化每个的重量和偏见Glorot初始化和0,分别。

inputSizeDecoder = enc.NumWords + 1;parametersDecoder =结构;%字嵌入parametersDecoder.emb。重量= dlarray (initializeGlorot (embeddingDimension inputSizeDecoder));%的关注parametersDecoder.attention。Weights1 = dlarray (initializeGlorot (numHiddenUnits embeddingDimension));parametersDecoder.attention。Bias1 = dlarray (0 (numHiddenUnits [1],“单身”));parametersDecoder.attention。Weights2 = dlarray (initializeGlorot (numHiddenUnits numHiddenUnits));parametersDecoder.attention。Bias2 = dlarray (0 (numHiddenUnits [1],“单身”));parametersDecoder.attention。numHiddenUnits WeightsV = dlarray (initializeGlorot (1));parametersDecoder.attention。BiasV = dlarray (0 (1, - 1,“单身”));%格勒乌parametersDecoder.gru。InputWeights = dlarray (initializeGlorot (3 * numHiddenUnits, 2 * embeddingDimension));parametersDecoder.gru。RecurrentWeights = dlarray (initializeGlorot (3 * numHiddenUnits numHiddenUnits));parametersDecoder.gru。偏见= dlarray (0 (3 * numHiddenUnits, 1,“单身”));%完全连接parametersDecoder.fc1。重量= dlarray (initializeGlorot (numHiddenUnits numHiddenUnits));parametersDecoder.fc1。偏见= dlarray (0 (numHiddenUnits [1],“单身”));%完全连接parametersDecoder.fc2。重量= dlarray (initializeGlorot (enc.NumWords + 1, numHiddenUnits));parametersDecoder.fc2。偏见= dlarray (0 ([enc。NumWords + 1,“单身”));

定义模型函数

创建函数modelEncodermodelDecoder上市的例子,计算编码器和译码器的输出模型,分别。

modelEncoder函数,列出的编码器模型函数部分的示例中,需要数组作为输入的激活X从pretrained网络的输出并将其传递通过一个完全连接操作和ReLU操作。因为pretrained网络不需要跟踪自动分化,提取编码器外特性模型函数的计算效率。

modelDecoder函数,列出的译码器模型函数部分的示例,需要输入一个时间步对应一个输入单词,译码器模型参数,从编码器的功能,和网络状态,并返回下一个时间步的预测,更新网络状态,关注权重。

指定培训选项

指定的选项进行训练。火车30时代mini-batch大小为128,显示在一块训练进展。

miniBatchSize = 128;numEpochs = 30;情节=“训练进步”;

火车在GPU如果一个是可用的。使用GPU需要并行计算工具箱™和支持GPU设备。万博1manbetx支持设备的信息,请参阅万博1manbetxGPU计算的需求(并行计算工具箱)

executionEnvironment =“汽车”;

列车网络的

列车网络使用自定义训练循环。

在每个时代的开始,慢慢的输入数据。保持图像增强图像数据存储和字幕同步,创建一个数组的索引,索引洗成两个数据集。

为每个mini-batch:

  • 重新调节图像的大小pretrained网络预计。

  • 对于每一个图像,选择一个随机的标题。

  • 将文字转换为序列的指数。指定right-padding与填充序列的值对应的索引填充令牌。

  • 将数据转换为dlarray对象。对于图像,指定尺寸标签“SSCB”(空间、空间、通道、批)。

  • GPU培训,将数据转换为gpuArray对象。

  • 提取图像特征使用pretrained网络和重塑他们编码器预计大小。

  • 评估损失和梯度模型使用dlfevalmodelLoss功能。

  • 更新编码器和解码器使用的模型参数adamupdate函数。

  • 显示在一块训练进展。

亚当优化器的初始化参数。

trailingAvgEncoder = [];trailingAvgSqEncoder = [];trailingAvgDecoder = [];trailingAvgSqDecoder = [];

初始化培训进展阴谋。创建一个动画线条,情节损失对相应的迭代。

如果情节= =“训练进步”图lineLossTrain = animatedline(颜色= [0.85 0.325 0.098]);包含(“迭代”)ylabel (“损失”网格)ylim([0正])结束

火车模型。

迭代= 0;numObservationsTrain =元素个数(annotationsTrain);numIterationsPerEpoch =地板(numObservationsTrain / miniBatchSize);开始=抽搐;%循环时期。时代= 1:numEpochs%洗牌数据。idxShuffle = randperm (numObservationsTrain);%在mini-batches循环。i = 1: numIterationsPerEpoch迭代=迭代+ 1;%确定mini-batch指数。idx =(张)* miniBatchSize + 1:我* miniBatchSize;idxMiniBatch = idxShuffle (idx);% mini-batch读取的数据。台= readByIndex (augimdsTrain idxMiniBatch);猫(X = 4, tbl.input {:});注释= annotationsTrain (idxMiniBatch);%为每个图像,选择随机的标题。idx = cellfun (@ (captionIDs) randsample (captionIDs, 1), {annotations.CaptionIDs});文件= documentsAll (idx);%创建一批数据。[X, T] = createBatch (X,文档、净、inputMin inputMax, enc, executionEnvironment);%计算模型和梯度使用dlfeval损失% modelLoss函数。[损失,gradientsEncoder, gradientsDecoder] = dlfeval (@modelLoss parametersEncoder,parametersDecoder X, T);%更新使用adamupdate编码器。[parametersEncoder, trailingAvgEncoder trailingAvgSqEncoder] = adamupdate (parametersEncoder,gradientsEncoder、trailingAvgEncoder trailingAvgSqEncoder迭代);%更新使用adamupdate解码器。[parametersDecoder, trailingAvgDecoder trailingAvgSqDecoder] = adamupdate (parametersDecoder,gradientsDecoder、trailingAvgDecoder trailingAvgSqDecoder迭代);%显示培训进展。如果情节= =“训练进步”D =持续时间(0,0,toc(开始),格式=“hh: mm: ss”);addpoints (lineLossTrain、迭代、双(损失))标题(”时代:“+时代+”,过去:“+ drawnow字符串(D))结束结束结束

预测新标题

字幕生成过程不同于训练的过程。在培训期间,在每个时间步,解码器使用前面的时间步的真正价值作为输入。这就是所谓的“老师”。当新数据做出预测,解码器使用先前的预测价值,而不是真正的价值观。

预测最可能的词序列中的每个步骤可能导致次优的结果。例如,如果解码器预测一个标题的第一个词是“a”,当给定一个大象的形象,然后的概率预测下一个单词“大象”变得更加不可能,因为极低概率的“大象”这个词出现在英语文本。

为了解决这个问题,您可以使用束搜索算法:而不是将最有可能的预测序列中的每一步,顶部k预测(梁指数),为每个步骤后,保持顶部k根据总体评分预测序列到目前为止。

生成一个新形象的字幕提取图像特征,输入编码器,然后使用beamSearch函数,列出的束搜索功能部分的例子。

img = imread (“laika_sitting.jpg”);X = extractImageFeatures(净,img, inputMin inputMax, executionEnvironment);beamIndex = 3;maxNumWords = 20;(话说,attentionScores) = beamSearch (X, beamIndex parametersEncoder parametersDecoder, enc, maxNumWords);标题=加入(字)
标题= "一只狗站在瓷砖地板上”

显示图像标题。

图imshow (img)标题(标题)

预测数据集字幕

预测集的标题图片,遍历mini-batches数据存储的数据和从图像中提取的功能使用extractImageFeatures函数。然后遍历图像mini-batch并生成标题使用beamSearch函数。

创建一组增强图像数据存储和输出大小来匹配输入的大小卷积网络。三路输出灰度图像RGB图像,设置ColorPreprocessing选项“gray2rgb”

annotationsTest.Filename tblFilenamesTest =表(猫(1));augimdsTest = augmentedImageDatastore (inputSizeNet tblFilenamesTest ColorPreprocessing =“gray2rgb”)
augimdsTest = augmentedImageDatastore属性:NumObservations: 4139 MiniBatchSize: 1 DataAugmentation:“没有一个”ColorPreprocessing:“gray2rgb”OutputSize: 299年[299]OutputSizeMode:“调整”DispatchInBackground: 0

生成测试数据的标题。预测说明在大数据集可以需要一些时间。如果你有并行计算工具箱™,那么你可以通过生成标题在一个并行预测parfor看。如果你没有并行计算工具。然后parfor在连续循环运行。

beamIndex = 2;maxNumWords = 20;numObservationsTest =元素个数(annotationsTest);numIterationsTest =装天花板(numObservationsTest / miniBatchSize);captionsTestPred =字符串(1、numObservationsTest);numObservationsTest documentsTestPred = tokenizedDocument(字符串(1));我= 1:numIterationsTest% Mini-batch指数。idxStart =(张)* miniBatchSize + 1;idxEnd = min(我* miniBatchSize numObservationsTest);idx = idxStart: idxEnd;深圳=元素个数(idx);%读取图像。台= readByIndex (augimdsTest idx);%提取图像特征。猫(X = 4, tbl.input {:});X = extractImageFeatures(净,X, inputMin inputMax, executionEnvironment);%生成标题。captionsPredMiniBatch =字符串(深圳);documentsPredMiniBatch = tokenizedDocument(字符串(深圳));parforj = 1:深圳的话= beamSearch (X (:,:, j), beamIndex, parametersEncoder, parametersDecoder, enc, maxNumWords);captionsPredMiniBatch (j) =加入(单词);documentsPredMiniBatch (j) = tokenizedDocument(话说,TokenizeMethod =“没有”);结束captionsTestPred (idx) = captionsPredMiniBatch;documentsTestPred (idx) = documentsPredMiniBatch;结束
工人们…做分析和传输文件。

查看一个测试图像与相应的标题,使用imshow功能和预测将标题设置为标题。

idx = 1;台= readByIndex (augimdsTest idx);img = tbl.input {1};图imshow (img)标题(captionsTestPred (idx))

评估模型的准确性

评估的准确性标题使用蓝色得分,计算每个标题的蓝色分数(候选人)对相应的标题使用的测试集(引用)bleuEvaluationScore函数。使用bleuEvaluationScore功能,您可以比较一个候选文档到多个参考文档。

bleuEvaluationScore相似函数,默认情况下,分数使用通过四字格的长度。标题很短,这种行为会导致不提供信息的结果大部分分数都接近于零。将语法长度设置为一个通过两个通过设置NgramWeights选择一个双元素向量相等的权重。

ngramWeights = (0.5 - 0.5);i = 1: numObservationsTest注释= annotationsTest(我);captionIDs = annotation.CaptionIDs;候选人= documentsTestPred(我);引用= documentsAll (captionIDs);分数= bleuEvaluationScore(候选人、引用NgramWeights = NgramWeights);分数(i) =分数;结束

查看的意思是蓝色的分数。

scoreMean =意味着(分数)
scoreMean = 0.4224

在一个柱状图可视化的分数。

图直方图(分数)包含(“蓝色分数”)ylabel (“频率”)

注意函数

注意函数计算上下文向量并使用Bahdanau注意力关注权重。

函数[contextVector, attentionWeights] =注意(隐藏、特性、weights1bias1、weights2 bias2、weightsV biasV)%模型维度。[embeddingDimension, numFeatures miniBatchSize] =大小(特性);numHiddenUnits =大小(weights1, 1);%完全连接。日元=重塑(特性、embeddingDimension numFeatures * miniBatchSize);日元= fullyconnect (Y1, weights1, bias1 DataFormat =“CB”);日元=重塑(Y1, numHiddenUnits, numFeatures miniBatchSize);%完全连接。Y2 = fullyconnect(隐藏、weights2 bias2, DataFormat =“CB”);Y2 =重塑(Y2, numHiddenUnits 1 miniBatchSize);%,双曲正切。成绩=双曲正切(Y1 + Y2);成绩=重塑(分数,numHiddenUnits, numFeatures * miniBatchSize);softmax %完全连接。attentionWeights = fullyconnect(分数,weightsV, biasV DataFormat =“CB”);attentionWeights =重塑(attentionWeights 1 numFeatures miniBatchSize);attentionWeights = softmax (attentionWeights DataFormat =“渣打银行”);%的上下文。contextVector = attentionWeights。*功能;contextVector =挤压(sum (contextVector, 2));结束

嵌入函数

嵌入函数的数组索引映射到一个序列的嵌入向量。

函数嵌入(Z = X,重量)%重塑输入向量[N T] =大小(X, 1:2);X =重塑(X N * T 1);%索引嵌入矩阵Z =重量(:,X);%重塑输出序列通过将批处理和维度Z =重塑(Z, [], N, T);结束

特征提取功能

extractImageFeatures函数作为输入训练dlnetwork的对象,一个输入图像,统计图像重新调节,和执行环境,并返回一个dlarray包含从pretrained中提取网络的特性。

函数X = extractImageFeatures(净,X, inputMin inputMax, executionEnvironment)%调整和重新调节。inputSize = net.Layers (1) .InputSize (1:2);X = imresize (X, inputSize);X =重新调节(X, 1, 1, InputMin = InputMin InputMax = InputMax);%转换为dlarray。X = dlarray (X,“SSCB”);%转换为gpuArray。如果(executionEnvironment = =“汽车”& & canUseGPU) | | executionEnvironment = =“图形”X = gpuArray (X);结束%提取特征和重塑。X =预测(净,X);深圳=大小(X);numFeatures =深圳(1)*深圳(2);inputSizeEncoder =深圳(3);miniBatchSize =深圳(4);X =重塑(X, [numFeatures inputSizeEncoder miniBatchSize]);结束

批量创建函数

createBatch函数mini-batch作为输入数据,标记化的标题,pretrained网络统计数据图像重新调节,一个字编码,执行环境,相应的数据,并返回一个mini-batch提取图像特征和标题进行训练。

函数[X, T] = createBatch (X,文档、净、inputMin inputMax, enc, executionEnvironment) X = extractImageFeatures(净,X, inputMin inputMax, executionEnvironment);%将文档转换为序列的指数。T = doc2sequence (enc,文档,PaddingDirection =“正确”,PaddingValue = enc.NumWords + 1);T =猫(1 T {:});% dlarray mini-batch的数据转换。T = dlarray (T);%如果训练在GPU,然后将数据转换成gpuArray。如果(executionEnvironment = =“汽车”& & canUseGPU) | | executionEnvironment = =“图形”T = gpuArray (T);结束结束

编码器模型函数

modelEncoder函数作为输入激活的数组X并将其传递通过一个完全连接操作和ReLU操作。完全连接操作,操作通道尺寸。应用完全连接跨通道操作维度,其他渠道扁平成一个单一的维度和指定这个维度作为批处理维度使用DataFormat选择的fullyconnect函数。

函数Y = modelEncoder (X, parametersEncoder) [numFeatures、inputSizeEncoder miniBatchSize] = (X)大小;%完全连接重量= parametersEncoder.fc.Weights;偏见= parametersEncoder.fc.Bias;embeddingDimension =大小(重量、1);X =排列(X, [2 1 3]);X =重塑(X, inputSizeEncoder numFeatures * miniBatchSize);Y = fullyconnect (X,重量、偏见、DataFormat =“CB”);Y =重塑(Y, embeddingDimension, numFeatures miniBatchSize);% ReLUY = relu (Y);结束

译码器模型函数

modelDecoder函数作为输入一个时间步X,译码器模型参数,从编码器的功能,和网络状态,并返回下一个时间步的预测,更新网络状态,关注权重。

函数[Y、州attentionWeights] = modelDecoder (X, parametersDecoder功能,状态)hiddenState = state.gru.HiddenState;%的关注weights1 = parametersDecoder.attention.Weights1;bias1 = parametersDecoder.attention.Bias1;weights2 = parametersDecoder.attention.Weights2;bias2 = parametersDecoder.attention.Bias2;weightsV = parametersDecoder.attention.WeightsV;biasV = parametersDecoder.attention.BiasV;[contextVector, attentionWeights] =注意(hiddenState、特性weights1、bias1 weights2, bias2, weightsV, biasV);%嵌入重量= parametersDecoder.emb.Weights;嵌入(X = X,重量);%连接Y =猫(1 contextVector X);%格勒乌inputWeights = parametersDecoder.gru.InputWeights;recurrentWeights = parametersDecoder.gru.RecurrentWeights;偏见= parametersDecoder.gru.Bias;[Y, hiddenState] =格勒乌(Y, hiddenState, inputWeights recurrentWeights,偏见,DataFormat =“认知行为治疗”);%更新状态state.gru。HiddenState = HiddenState;%完全连接重量= parametersDecoder.fc1.Weights;偏见= parametersDecoder.fc1.Bias;Y = fullyconnect (Y,重量、偏见、DataFormat =“CB”);%完全连接重量= parametersDecoder.fc2.Weights;偏见= parametersDecoder.fc2.Bias;Y = fullyconnect (Y,重量、偏见、DataFormat =“CB”);结束

模型的损失

modelLoss函数作为输入编码器和译码器参数,编码器特性X,目标说明T,并返回损失,编码器和译码器参数的梯度的损失,和预测。

函数(损失、gradientsEncoder gradientsDecoder YPred] =modelLoss (parametersEncoder parametersDecoder X T) miniBatchSize =大小(X, 3);sequenceLength =大小(T) 2) - 1;vocabSize =大小(parametersDecoder.emb.Weights, 2);%模型编码器特点= modelEncoder (X, parametersEncoder);%初始化状态numHiddenUnits =大小(parametersDecoder.attention.Weights1, 1);状态=结构;state.gru。HiddenState = dlarray (0 ([numHiddenUnits miniBatchSize),“单身”));YPred = dlarray (0 ([vocabSize miniBatchSize sequenceLength),“喜欢”,X));损失= dlarray(单(0));padToken = vocabSize;t = 1: sequenceLength decoderInput = t (:, t);YReal = T (:, T + 1);[YPred (:,:, t)状态]= modelDecoder (decoderInput, parametersDecoder、特征、状态);掩码= YReal ~ = padToken;损失=损失+ sparseCrossEntropyAndSoftmax (YPred (:,:, t), YReal,面具);结束%计算梯度[gradientsEncoder, gradientsDecoder] = dlgradient(损失,parametersEncoder parametersDecoder);结束

稀疏的交叉熵和Softmax损失函数

sparseCrossEntropyAndSoftmax作为输入的预测Y,相应的目标T序列填充的面具,和应用softmax函数和返回叉损失。

函数损失= sparseCrossEntropyAndSoftmax (Y, T,面具)miniBatchSize =大小(Y, 2);% Softmax。Y = softmax (Y, DataFormat =“CB”);%找到行相应的目标的话。idx = sub2ind(大小(Y), T ', 1: miniBatchSize);Y = Y (idx);%会远离零。Y = max (Y,单(1 e-8));%掩盖损失。损失=日志(Y)。*面具》;损失=总和(损失,“所有”)。/ miniBatchSize;结束

束搜索功能

beamSearch函数作为输入的图像特征X、一束指数、编码器和译码器网络的参数,一个字编码,最大序列长度,并返回标题文字图像使用定向搜索算法。

函数(话说,attentionScores) = beamSearch (X, beamIndex parametersEncoder parametersDecoder,enc, maxNumWords)%模型尺寸numFeatures =大小(X, 1);numHiddenUnits =大小(parametersDecoder.attention.Weights1, 1);%提取特征特点= modelEncoder (X, parametersEncoder);%初始化状态状态=结构;state.gru。HiddenState = dlarray (0 (numHiddenUnits [1],“喜欢”,X));%初始化的候选人候选人=结构;候选人。=状态;候选人。话说=“<开始>”;候选人。分数= 0;候选人。AttentionScores = dlarray (0 ([numFeatures maxNumWords),“喜欢”,X));候选人。StopFlag = false;t = 0;%循环的话t < maxNumWords t = t + 1;candidatesNew = [];%循环候选人i = 1:元素个数(候选人)%停止停止令牌时生成预测如果候选人.StopFlag(我)继续结束%候选人细节状态=(我).State候选人;话说=候选人(我).Words;得分=(我).Score候选人;.AttentionScores attentionScores =候选人(我);%预测下一个令牌decoderInput = word2ind (enc,话说(结束));[YPred、州attentionScores (:, t)] = modelDecoder (decoderInput, parametersDecoder、特征、状态);YPred = softmax (YPred DataFormat =“CB”);[scoresTop, idxTop] = maxk (extractdata (YPred) beamIndex);idxTop =收集(idxTop);%循环前的预测j = 1: beamIndex候选人=结构;candidateWord = ind2word (enc, idxTop (j));candidateScore = scoresTop (j);如果candidateWord = =“<停止>”候选人。StopFlag = true;attentionScores (t + 1::结束)= [];其他的候选人。StopFlag = false;结束候选人。=状态;候选人。话说=[words candidateWord]; candidate.Score = score + log(candidateScore); candidate.AttentionScores = attentionScores; candidatesNew = [candidatesNew candidate];结束结束%得到最高的候选人[~,idx] = maxk ([candidatesNew.Score], beamIndex);候选人= candidatesNew (idx);%停止预测当所有候选人都停止令牌如果([candidates.StopFlag])打破结束结束%得到顶级候选人话说=候选人(1).Words (2: end-1);attentionScores = (1) .AttentionScores候选人;结束

Glorot重初始化函数

initializeGlorot函数生成一个数组的权重根据Glorot初始化。

函数重量= initializeGlorot numOut, numIn varWeights =√(6 / (numIn + numOut));重量= varWeights *(2 *兰德([numOut numIn],“单身”)- 1);结束

另请参阅

(文本分析工具箱)|(文本分析工具箱)|(文本分析工具箱)|||||||||(文本分析工具箱)|

相关的话题