主要内容gydF4y2Ba

训练一个用于降维的暹罗网络gydF4y2Ba

这个例子展示了如何训练一个暹罗网络来比较使用降维的手写数字。gydF4y2Ba

Siamese网络是一种深度学习网络,它使用两个或多个具有相同架构并共享相同参数和权重的相同子网络。暹罗网络通常用于寻找两个可比较事物之间关系的任务。Siamese网络的一些常见应用包括面部识别、签名验证[1]或释义识别[2]。Siamese网络在这些任务中表现良好,因为它们共享的权重意味着在训练过程中需要学习的参数更少,并且它们可以用相对少量的训练数据产生良好的结果。gydF4y2Ba

Siamese网络在有大量类的情况下特别有用,每个类的观察数量很少。在这种情况下,没有足够的数据来训练深度卷积神经网络来将图像分类为这些类别。相反,Siamese网络可以确定两张图像是否属于同一类。该网络通过降低训练数据的维数并使用基于距离的代价函数来区分类别来实现这一点。gydF4y2Ba

本例使用Siamese网络对一组手写数字图像进行降维。Siamese架构通过将具有相同类别的图像映射到低维空间中的附近点来降低维数。然后使用约简特征表示从数据集中提取与测试图像最相似的图像。本例中的训练数据是大小为28 × 28 × 1的图像,初始特征维数为784。Siamese网络将输入图像的维数降为两个特征,并训练为具有相同标签的图像输出相似的降为特征。gydF4y2Ba

您还可以使用暹罗网络通过直接比较来识别相似的图像。有关示例,请参见gydF4y2Ba训练暹罗网络来比较图像gydF4y2Ba.gydF4y2Ba

加载和预处理训练数据gydF4y2Ba

加载由手写数字图像组成的训练数据。这个函数gydF4y2BadigitTrain4DArrayDatagydF4y2Ba加载数字图像及其标签。gydF4y2Ba

[XTrain,TTrain] = digitTrain4DArrayData;gydF4y2Ba

XTraingydF4y2Ba是一个28 × 28 × 1 × 5000数组,包含5000个单通道图像,每个图像的大小为28 × 28。每个像素的值在gydF4y2Ba0gydF4y2Ba而且gydF4y2Ba1gydF4y2Ba.gydF4y2BaTTraingydF4y2Ba包含每个观察值的标签的分类向量,这些标签是与所写数字的值对应的从0到9的数字。gydF4y2Ba

显示随机选择的图像。gydF4y2Ba

perm = randperm(数字(TTrain),9);imshow (imtile (XTrain(:,:,:,烫),ThumbnailSize = (100 - 100)));gydF4y2Ba

创建相似和不相似的图像对gydF4y2Ba

为了训练网络,必须将数据分组成相似或不相似的图像对。在这里,相似的图像被定义为具有相同的标签,而不相似的图像具有不同的标签。这个函数gydF4y2BagetSiameseBatchgydF4y2Ba(定义于gydF4y2Ba金宝app支持功能gydF4y2Ba这个例子的部分)创建随机的相似或不相似的图像对,gydF4y2BapairImage1gydF4y2Ba而且gydF4y2BapairImage2gydF4y2Ba.该函数还返回标签gydF4y2BapairLabelgydF4y2Ba,它可以识别这对图像彼此是否相似。类似的图片已经出现了gydF4y2BapairLabel = 1gydF4y2Ba,而不同的配对则有gydF4y2BapairLabel = 0gydF4y2Ba.gydF4y2Ba

例如,创建一个由五对图像组成的小型代表性集合gydF4y2Ba

batchSize = 10;[pairImage1,pairImage2,pairLabel] = getSiameseBatch(XTrain,TTrain,batchSize);gydF4y2Ba

显示生成的图像对。gydF4y2Ba

图tiledlayout (gydF4y2Ba“流”gydF4y2Ba)gydF4y2Ba为gydF4y2Bai = 1: batchSize nexttile imshow ([pairImage1 (::,:, i) pairImage2(::,:,我)]);gydF4y2Ba如果gydF4y2BapairLabel(i) == 1 s =gydF4y2Ba“相似”gydF4y2Ba;gydF4y2Ba其他的gydF4y2Bas =gydF4y2Ba“不同”gydF4y2Ba;gydF4y2Ba结束gydF4y2Ba标题(年代)gydF4y2Ba结束gydF4y2Ba

在本例中,为训练循环的每次迭代创建了一批新的180对图像。这确保了网络是在大量随机图像对上训练的,相似和不同图像对的比例大致相等。gydF4y2Ba

定义网络架构gydF4y2Ba

Siamese网络架构如下图所示。gydF4y2Ba

在本例中,两个相同的子网被定义为一系列具有ReLU层的完全连接层。创建一个接受28 × 28 × 1图像的网络,并输出用于简化特征表示的两个特征向量。该网络将输入图像的维数降低到2,这个值比初始的784维数更容易绘制和可视化。gydF4y2Ba

对于前两个全连接层,指定输出大小为1024并使用He权重初始化器。gydF4y2Ba

对于最后的全连接层,指定输出大小为2,并使用He权重初始化器。gydF4y2Ba

layers = [imageInputLayer([28 28],归一化=gydF4y2Ba“没有”gydF4y2Ba) fullyConnectedLayer(1024年,WeightsInitializer =gydF4y2Ba“他”gydF4y2Ba) reluLayer fullyConnectedLayer(1024,WeightsInitializer=gydF4y2Ba“他”gydF4y2Ba) reluLayer fullyConnectedLayer(2,WeightsInitializer=gydF4y2Ba“他”gydF4y2Ba));gydF4y2Ba

要使用自定义训练循环训练网络并启用自动区分,请将层数组转换为agydF4y2BadlnetworkgydF4y2Ba对象。gydF4y2Ba

Net = dlnetwork(layers);gydF4y2Ba

定义模型损失函数gydF4y2Ba

创建函数gydF4y2BamodelLossgydF4y2Ba(定义于gydF4y2Ba金宝app支持功能gydF4y2Ba部分)。的gydF4y2BamodelLossgydF4y2Ba函数取暹罗体gydF4y2BadlnetworkgydF4y2Ba对象gydF4y2Ba网gydF4y2Ba和一小批输入数据gydF4y2BaX1gydF4y2Ba而且gydF4y2BaX2gydF4y2Ba用他们的标签gydF4y2BapairLabelsgydF4y2Ba.该函数返回相对于网络的可学习参数的损失值和损失的梯度。gydF4y2Ba

Siamese网络的目标是为每张图像输出一个特征向量,这样,对于相似的图像,特征向量是相似的,对于不相似的图像,特征向量是明显不同的。通过这种方式,网络可以区分两个输入。gydF4y2Ba

找出最后一个全连接层的输出之间的对比损失,即特征向量gydF4y2Bafeatures1gydF4y2Ba而且gydF4y2Bafeatures1gydF4y2Ba从gydF4y2BapairImage1gydF4y2Ba而且gydF4y2BapairImage2gydF4y2Ba,分别。一对的相对损耗由[3]给出gydF4y2Ba

损失gydF4y2Ba =gydF4y2Ba 1gydF4y2Ba 2gydF4y2Ba ygydF4y2Ba dgydF4y2Ba 2gydF4y2Ba +gydF4y2Ba 1gydF4y2Ba 2gydF4y2Ba (gydF4y2Ba 1gydF4y2Ba -gydF4y2Ba ygydF4y2Ba )gydF4y2Ba 马克斯gydF4y2Ba (gydF4y2Ba 米gydF4y2Ba 一个gydF4y2Ba rgydF4y2Ba ggydF4y2Ba 我gydF4y2Ba ngydF4y2Ba -gydF4y2Ba dgydF4y2Ba ,gydF4y2Ba 0gydF4y2Ba )gydF4y2Ba 2gydF4y2Ba ,gydF4y2Ba

在哪里gydF4y2Ba ygydF4y2Ba 是对标签的值(gydF4y2Ba ygydF4y2Ba =gydF4y2Ba 1gydF4y2Ba 对于类似的图像;gydF4y2Ba ygydF4y2Ba =gydF4y2Ba 0gydF4y2Ba 对于不同的图像),以及gydF4y2Ba dgydF4y2Ba 两个特征向量之间的欧氏距离是多少gydF4y2Ba f1gydF4y2Ba 而且gydF4y2Ba f2gydF4y2Ba :gydF4y2Ba dgydF4y2Ba =gydF4y2Ba 为gydF4y2Ba f1gydF4y2Ba -gydF4y2Ba f2gydF4y2Ba 为gydF4y2Ba 2gydF4y2Ba .gydF4y2Ba

的gydF4y2Ba 米gydF4y2Ba 一个gydF4y2Ba rgydF4y2Ba ggydF4y2Ba 我gydF4y2Ba ngydF4y2Ba 参数用于约束:如果一对图像中的两张图像不相似,那么它们的距离应该至少为gydF4y2Ba 米gydF4y2Ba 一个gydF4y2Ba rgydF4y2Ba ggydF4y2Ba 我gydF4y2Ba ngydF4y2Ba ,否则会造成损失。gydF4y2Ba

对比损失有两项,但对于给定的图像对,只有一项是非零的。在相似图像的情况下,第一项可以是非零,并通过减少图像特征之间的距离来最小化gydF4y2Ba f1gydF4y2Ba 而且gydF4y2Ba f2gydF4y2Ba .在不同图像的情况下,第二项可以是非零,并通过增加图像特征之间的距离来最小化,至少为的距离gydF4y2Ba 米gydF4y2Ba 一个gydF4y2Ba rgydF4y2Ba ggydF4y2Ba 我gydF4y2Ba ngydF4y2Ba .的值越小gydF4y2Ba 米gydF4y2Ba 一个gydF4y2Ba rgydF4y2Ba ggydF4y2Ba 我gydF4y2Ba ngydF4y2Ba 对于不同的配对在发生损失之前的接近程度的限制就越少。gydF4y2Ba

指定培训项目gydF4y2Ba

指定的值gydF4y2Ba 米gydF4y2Ba 一个gydF4y2Ba rgydF4y2Ba ggydF4y2Ba 我gydF4y2Ba ngydF4y2Ba 训练时使用。gydF4y2Ba

Margin = 0.3;gydF4y2Ba

指定在培训期间使用的选项。训练3000次迭代。gydF4y2Ba

numIterations = 3000;miniBatchSize = 180;gydF4y2Ba

指定Adam优化的选项:gydF4y2Ba

  • 设置学习率为gydF4y2Ba0.0001gydF4y2Ba.gydF4y2Ba

  • 初始化尾随平均梯度和尾随平均梯度平方衰减率gydF4y2Ba[]gydF4y2Ba.gydF4y2Ba

  • 设置梯度衰减因子为gydF4y2Ba0.9gydF4y2Ba平方梯度衰减因子gydF4y2Ba0.99gydF4y2Ba.gydF4y2Ba

learningRate = 1e-4;trailingAvg = [];trailingAvgSq = [];gradDecay = 0.9;gradDecaySq = 0.99;gydF4y2Ba

初始化训练损失进度图的图参数。gydF4y2Ba

图C = colororder;lineLossTrain = animatedline(Color=C(2,:));Ylim ([0 inf]) xlabel(gydF4y2Ba“迭代”gydF4y2Ba) ylabel (gydF4y2Ba“损失”gydF4y2Ba网格)gydF4y2Ba在gydF4y2Ba

火车模型gydF4y2Ba

使用自定义训练循环训练模型。遍历训练数据并在每次迭代中更新网络参数。gydF4y2Ba

对于每个迭代:gydF4y2Ba

  • 方法提取一批图像对和标签gydF4y2BagetSiameseBatchgydF4y2Ba节中定义的函数gydF4y2Ba批量创建镜像对gydF4y2Ba.gydF4y2Ba

  • 将图像数据转换为gydF4y2BadlarraygydF4y2Ba具有基础类型的对象gydF4y2Ba单gydF4y2Ba并指定尺寸标签gydF4y2Ba“SSCB”gydF4y2Ba(空间,空间,通道,批次)。gydF4y2Ba

  • 在GPU上训练(如果有的话)。使用GPU需要并行计算工具箱™和受支持的GPU设备。金宝app有关受支持设备的信息,请参见金宝appgydF4y2BaGPU计算要求gydF4y2Ba(并行计算工具箱)gydF4y2Ba.gydF4y2Ba

  • 评估模型损失和梯度使用gydF4y2BadlfevalgydF4y2Ba和gydF4y2BamodelLossgydF4y2Ba函数。gydF4y2Ba

  • 方法更新网络参数gydF4y2BaadamupdategydF4y2Ba函数。gydF4y2Ba

开始= tic;gydF4y2Ba在小批上循环。gydF4y2Ba为gydF4y2Baiteration = 1:numIterationsgydF4y2Ba提取小批量图像对和图像对标签gydF4y2Ba[X1,X2,pairLabels] = getSiameseBatch(XTrain,TTrain,miniBatchSize);gydF4y2Ba将小批量数据转换为大数组。指定尺寸标签gydF4y2Ba%“SSCB”(空间、空间、通道、批处理)用于图像数据gydF4y2BaX1 = dlarray(single(X1),gydF4y2Ba“SSCB”gydF4y2Ba);X2 = dlarray(single(X2),gydF4y2Ba“SSCB”gydF4y2Ba);gydF4y2Ba如果在GPU上训练,则将数据转换为gpuArray。gydF4y2Ba如果gydF4y2BacanUseGPU X1 = gpuArray(X1);X2 = gpuArray(X2);gydF4y2Ba结束gydF4y2Ba使用dlfeval和modelLoss评估模型损失和梯度gydF4y2Ba在示例末尾列出的%函数。gydF4y2Ba[loss,gradients] = dlfeval(@modelLoss,net,X1,X2,pairLabels,margin);gydF4y2Ba更新Siamese网络参数。gydF4y2Ba[net,trailingAvg,trailingAvgSq] = adamupdate(net,gradients,gydF4y2Ba...gydF4y2BatrailingAvg trailingAvgSq,迭代,learningRate、gradDecay gradDecaySq);gydF4y2Ba更新培训损失进度图。gydF4y2BaD = duration(0,0,toc(start),Format=gydF4y2Ba“hh: mm: ss”gydF4y2Ba);损失=双倍(损失);addpoints (lineLossTrain、迭代、失去)标题(gydF4y2Ba”经过:“gydF4y2Ba+字符串(D))现在绘制gydF4y2Ba结束gydF4y2Ba

可视化图像相似性gydF4y2Ba

为了评估网络在降维方面的表现,计算并绘制一组测试数据的降维特征。加载测试数据,测试数据由类似于训练数据的手写数字图像组成。将测试数据转换为gydF4y2BadlarraygydF4y2Ba并指定尺寸标签gydF4y2Ba“SSCB”gydF4y2Ba(空间,空间,通道,批次)。如果您正在使用GPU,请将测试数据转换为gydF4y2BagpuArraygydF4y2Ba.gydF4y2Ba

[XTest,TTest] = digitTest4DArrayData;XTest = dlarray(single(XTest),gydF4y2Ba“SSCB”gydF4y2Ba);gydF4y2Ba如果gydF4y2BacanUseGPU XTest = gpuArray(XTest);gydF4y2Ba结束gydF4y2Ba

计算测试数据的简化特征。gydF4y2Ba

FTest =预测(net,XTest);gydF4y2Ba

对于每一组,绘制测试数据的前两个简化特征。gydF4y2Ba

uniqueGroups =唯一的(TTest);colors = hsv(length(uniqueGroups));图保存gydF4y2Ba在gydF4y2Ba为gydF4y2Bak = 1:length(uniqueGroups) ind = TTest==uniqueGroups(k);情节(英国《金融时报》(印第安纳州),英国《金融时报》(印第安纳州),gydF4y2Ba“。”gydF4y2Ba颜色,颜色= (k,:));gydF4y2Ba结束gydF4y2Ba持有gydF4y2Ba从gydF4y2Ba包含(gydF4y2Ba”功能1”gydF4y2Ba) ylabel (gydF4y2Ba“功能2”gydF4y2Ba)标题(gydF4y2Ba数字图像的二维特征表示gydF4y2Ba);传奇(uniqueGroups、位置=gydF4y2Ba“eastoutside”gydF4y2Ba);gydF4y2Ba

使用训练过的网络来寻找相似的图像gydF4y2Ba

您可以使用经过训练的网络从一组图像中找到彼此相似的图像。从测试数据中提取一个测试图像并显示它。gydF4y2Ba

testdx = randi(5000);testtestg = XTest(:,:,:, testdx);trialImgDisp = extractdata(teestimg);图imshow (trialImgDisp InitialMagnification = 500);gydF4y2Ba

创建一组包含测试数据但不包括提取的测试图像的图像。gydF4y2Ba

groupX = XTest;groupX(:,:,:, testdx) = [];gydF4y2Ba

找到测试图像的简化特征使用gydF4y2Ba预测gydF4y2Ba.gydF4y2Ba

trialF = predict(net, teestimg);gydF4y2Ba

使用训练过的网络找到组中每个图像的二维约简特征表示。gydF4y2Ba

FGroupX =预测(net,groupX);gydF4y2Ba

使用简化后的特征表示法,使用欧几里得距离度量,找到组中最接近测试图像的9张图像。显示图像。gydF4y2Ba

距离= vecnorm(extractdata(trialF - FGroupX));[~,idx] = sort(距离);sortedImages = groupX(:,:,:,idx);sortedImages = extractdata(sortedImages);图imshow (imtile (sortedImages (:,:,: 1:9)), InitialMagnification = 500);gydF4y2Ba

通过将图像降至较低的维度,该网络能够识别与试验图像相似的图像。减少的特征表示允许网络区分相似和不相似的图像。暹罗网络通常用于面部或签名识别。例如,您可以训练Siamese网络接受人脸图像作为输入,并从数据库中返回一组最相似的人脸。gydF4y2Ba

金宝app支持功能gydF4y2Ba

模型损失函数gydF4y2Ba

这个函数gydF4y2BamodelLossgydF4y2Ba比如暹罗人gydF4y2BadlnetworkgydF4y2Ba对象gydF4y2Ba网gydF4y2Ba,一对小批量输入数据gydF4y2BaX1gydF4y2Ba而且gydF4y2BaX2gydF4y2Ba,以及标签gydF4y2BapairLabelsgydF4y2Ba.该函数返回配对图像的降维特征之间的对比损失,以及相对于网络中可学习参数的损失梯度。在本例中,函数gydF4y2BamodelLossgydF4y2Ba在本节中介绍了什么gydF4y2Ba定义模型损失函数gydF4y2Ba.gydF4y2Ba

函数gydF4y2Ba[loss,gradients] = modelLoss(net,X1,X2,pairLabel,margin)gydF4y2BamodelLoss函数计算gydF4y2Ba%的配对图像,并返回损失和梯度的损失与gydF4y2Ba%相对于网络可学习参数gydF4y2Ba将前一半的图像对通过网络转发gydF4y2BaF1 =正向(净,X1);gydF4y2Ba将第二组图像对通过网络转发gydF4y2BaF2 =正向(净,X2);gydF4y2Ba%计算对比损失gydF4y2Ba损失= contrtiveloss (F1,F2,pairLabel,margin);gydF4y2Ba计算相对于网络可学习的损失的梯度gydF4y2Ba%的参数gydF4y2Bagradients = dlgradient(loss,net.Learnables);gydF4y2Ba结束gydF4y2Ba函数gydF4y2Baloss = contrtiveloss (F1,F2,pairLabel,margin)gydF4y2Ba之间的对比损失函数gydF4y2Ba%成对图像的约简特征gydF4y2Ba定义小值以防止取0的平方根gydF4y2BaDelta = 1e-6;gydF4y2Ba找到欧几里得距离度量gydF4y2Ba距离=平方根(sum((F1 - F2).^2,1) + delta);gydF4y2Ba% label(i) = 1如果features1(:,i)和featres2 (:,i)是特征gydF4y2Ba相似的图像为%,否则为0gydF4y2BalossSimilar = pairLabel.*(距离。^2);lossDissimilar = (1 - pairLabel)。*(max(margin - distance, 0).^2);损失= 0.5*sum(lossSimilar + lossdissimilarity,gydF4y2Ba“所有”gydF4y2Ba);gydF4y2Ba结束gydF4y2Ba

批量创建镜像对gydF4y2Ba

以下函数根据它们的标签创建相似或不相似的随机图像对。在本例中,函数gydF4y2BagetSiameseBatchgydF4y2Ba在本节中介绍了什么gydF4y2Ba创建相似和不相似的图像对gydF4y2Ba.gydF4y2Ba

函数gydF4y2Ba[X1,X2,pairLabels] = getSiameseBatch(X,Y,miniBatchSize)gydF4y2Ba% getSiameseBatch返回随机选择的成对图像批次。gydF4y2Ba平均而言,此函数生成一组相似的和的平衡集gydF4y2Ba%不相似对。gydF4y2BapairLabels = 0 (1, miniBatchSize);imgSize = size(X(:,:,:,1));X1 = 0 ([imgSize 1 miniBatchSize]);X2 = 0 ([imgSize 1 miniBatchSize]);gydF4y2Ba为gydF4y2Bai = 1:miniBatchSize select = rand(1);gydF4y2Ba如果gydF4y2Baselect < 0.5 [pairIdx1, pairIdx2, pairLabels(i)] = getSimilarPair(Y);gydF4y2Ba其他的gydF4y2Ba[pairIdx1, pairIdx2, pairLabels(i)] = getDissimilarPair(Y);gydF4y2Ba结束gydF4y2BaX1(:,:,:,i) = X(:,:,:,pairIdx1);X2(:,:,:,i) = X(:,:,:,pairIdx2);gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba函数gydF4y2Ba[pairIdx1,pairIdx2,pairLabel] = getSimilarPair(classLabel)gydF4y2BagetSimilarPair返回图像的随机索引对gydF4y2Ba%属于同一类且相似的pair标签= 1。gydF4y2Ba找到所有唯一的类。gydF4y2Baclasses =唯一的(classLabel);gydF4y2Ba%随机选择一个类,将用于获得类似的一对。gydF4y2BaclassChoice = randi(编号(类));gydF4y2Ba找到所选类中所有观测值的指数。。gydF4y2Baidxs = find(classLabel==classes(classChoice));gydF4y2Ba从所选类别中随机选择两张不同的图片。gydF4y2BapairIdxChoice = randperm(数字(idxs),2);pairIdx1 = idxs(pairIdxChoice(1));pairIdx2 = idxs(pairIdxChoice(2));pairLabel = 1;gydF4y2Ba结束gydF4y2Ba函数gydF4y2Ba[pairIdx1,pairIdx2,pairLabel] = getDissimilarPair(classLabel)gydF4y2BagetDissimilarPair返回图像的随机索引对gydF4y2Ba%,在不同的类和不同的对标签= 0。gydF4y2Ba找到所有唯一的类。gydF4y2Baclasses =唯一的(classLabel);gydF4y2Ba%随机选择两个不同的班级,将会得到一个不同的配对。gydF4y2BaclassesChoice = randperm(编号(类),2);gydF4y2Ba找到第一类和第二类中所有观测值的指标。gydF4y2Baidxs1 = find(classLabel==classes(classesChoice(1)));idxs2 = find(classLabel==classes(classesChoice(2)));gydF4y2Ba从每个类别中随机选择一张图片。gydF4y2BapairIdx1Choice = randi(编号(idxs1));pairIdx2Choice = randi(编号(idxs2));pairIdx1 = idxs1(pairIdx1Choice);pairIdx2 = idxs2(pairIdx2Choice);pairLabel = 0;gydF4y2Ba结束gydF4y2Ba

参考文献gydF4y2Ba

  1. J.布罗姆利,I.盖恩,Y.勒丘恩,E. Säckinger和R.沙阿。”gydF4y2Ba使用“暹罗式”时滞神经网络进行签名验证。gydF4y2Ba“第六届神经信息处理系统国际会议论文集(NIPS 1993), 1994,第737-744页。可以在gydF4y2Ba使用“暹罗式”时滞神经网络进行签名验证gydF4y2Ba在NIPS论文集网站上。gydF4y2Ba

  2. Wenpeg, Y.和H Schütze。”gydF4y2Ba释义识别的卷积神经网络。gydF4y2Ba《ACL北美分会2015年会议论文集》,2015,pp901-911。可以在gydF4y2Ba释义识别的卷积神经网络gydF4y2Ba访问ACL选集网站。gydF4y2Ba

  3. 哈德赛尔、R.乔普拉和Y.勒丘恩。”gydF4y2Ba学习不变映射降维方法gydF4y2Ba2006年IEEE计算机学会计算机视觉与模式识别会议论文集(CVPR 2006), 2006, pp1735-1742。gydF4y2Ba

另请参阅gydF4y2Ba

|gydF4y2Ba|gydF4y2Ba|gydF4y2Ba|gydF4y2Ba

相关的话题gydF4y2Ba