问题描述
我正在研究一个模型,其中有两个损失和两个不同的输出。一个输出将 y
作为图像,就像 Autoencoder / U-Net 架构一样。另一个输出是简单的二元分类,取为 0/1。
所以我想说的是Siamese Based Unet
。基本上基于 mae
损失重建图像并从瓶颈层创建一个分支,以便它可以根据欧氏距离预测 2 个图像是否相似。
Keras
有一个 ImageDataGenerator
,您可以在其中使用 class_mode='input'
生成相应的图像作为 y 标签,还可以使用 class_mode=binary
生成列中给定的 0/1 值.但是我怎样才能在同一个生成器中生成这两个东西。问题是 Siamese Branch
将同时接受 2 个输入。
解决方法
您是否检查过 Sequence object .它允许创建自定义数据生成器。这个想法是子类化 Sequence 然后覆盖方法 len、getitem。 len 应返回序列中的批次数。返回源和目标对的逻辑写在 getitem 中。它应该返回一批数据。如果是多输入模型,您可以编写 getitem 使其输出数据包括映射到模型输入层的字典(key=layername)。对于输出张量也是如此。更多信息可以在我在上面添加的官方文档的链接中找到。最好的
编辑
根据我对您的问题的理解,这是要点。:
class Dataset(Sequence):
def __init__(self,filenames,batchsize,shape):
self.filenames = filenames # List of filenames
self.batchsize = batchsize
self.shape = shape # Shape to which image should be
# resized
def __len__(self):
return len(self.filenames) // batchsize
def __getitem__(self,idx):
i = idx * self.batchsize
X_1 = np.zeros((self.batchsize,self.shape[0],self.shape[1],3)
y = np.zeros((self.batchsize,--,...,--)) # Depends on
# your target choice
filenames = self.filenames[i:i+self.batchsize]
for index,filename in enumerate(filenames):
image = cv2.imread(filename)
# Preprocess
image = your_preprocess(image)
X[index] = image
# You can include your pipeline for other
# Input also.
# Similarly obtain target values and load to y.
return {"layername": X_1,"layername": X_2},{"layername": y}