tensorflow - 多输入深度学习中的平均层
问题描述
我正在努力在 Keras 中创建一个用于图像分类的多输入卷积神经网络 (CNN) 模型,该模型采用两张图像并给出一个输出,即这两个图像的类别。
我有两个数据集:type1 和 type2,每个数据集都包含相同的类。模型应该从 Type1 数据集中获取一张图像,从 Type2 数据集中获取一张图像,然后将这些图像分类到一个类(ClassA 或 ClassB 或------)。
我想创建一个模型来预测这两个图像,然后计算类似于下图的预测平均值:
我怎样才能创建这个模型?如何在 fit_generator 中创建生成器?
解决方案
选项 1 - 双方是相同的模型,只是使用不同的输入
假设您有一个模型可以上升到“谓词”,称为predModel
.
创建两个输入张量:
input1 = Input(shape)
input2 = Input(shape)
获取每个输入的输出:
pred1 = predModel(input1)
pred2 = predModel(input2)
平均输出:
output = Average()([pred1,pred2])
创建最终模型:
model = Model([input1,input2], output)
Option2 - 两边都是相似的模型,但使用不同的权重
与上面基本相同,但为每一面单独创建图层。
def createCommonPart(inputTensor):
out = ZeroPadding2D(...)(inputTensor)
out = Conv2D(...)(out)
...
out = Flatten()(out)
return Dense(...)(out)
进行两个输入:
input1 = Input(shape)
input2 = Input(shape)
获取两个输出:
pred1 = createCommonPart(input1)
pred2 = createCommonPart(input2)
平均输出:
output = Average()([pred1,pred2])
创建最终模型:
model = Model([input1,input2], output)
发电机
任何产生的东西[xTrain1,xTrain2], y
。
您可以像这样创建一个:
def generator(files1,files2, batch_size):
while True: #must be infinite
for i in range(len(files1)//batch_size)):
bStart = i*batch_size
bEnd = bStart+batch_size
x1 = loadImagesSomehow(files1[bStart:bEnd])
x2 = loadImagesSomehow(files2[bStart:bEnd])
y = loadPredictionsSomeHow(forSamples[bStart:bEnd])
yield [x1,x2], y
您也可以keras.utils.Sequence
以类似的方式实现 a 。
class gen(Sequence):
def __init__(self, files1, files2, batchSize):
self.files1 = files1
self.files2 = files2
self.batchSize = batchSize
def __len__(self):
return self.len(files1) // self.batchSize
def __getitem__(self,i):
bStart = i*self.batchSize
bEnd = bStart+self.batchSize
x1 = loadImagesSomehow(files1[bStart:bEnd])
x2 = loadImagesSomehow(files2[bStart:bEnd])
y = loadPredictionsSomeHow(forSamples[bStart:bEnd])
return [x1,x2], y
推荐阅读
- mysql - 如何在mysql中明智地计算中位数类别
- xamarin.ios - 如何在 iOS 14 的 xamarin.ios 中将 UIDatePicker 背景颜色设置为白色?
- mysql - time_format() 转换和 timediff() 的算术计算显示不同的结果,为什么?
- shopify - 在 Shopify 网站上模拟鼠标点击
- azure-active-directory - 在 Microsoft Graph API 中访问报告时出现问题 - 请仔细检查租户 ID 并重试
- html - 悬停时,背景和/或边框必须左右扩展一点
- javascript - 单击页面后图像未显示显示角度 10
- c# - 托管 Blazor WASM GetFromJsonAsync:无法将 JSON 值转换为 System.Collections.Generic.IEnumerable`
- c# - 使用 Google 进行身份验证时自定义重定向登录页面 - ASP.NET Core 5
- autodesk-forge - 如何在 setCutPlaneSet 设置效果或过渡?