gpt4 book ai didi

python - Keras 多输入网络,使用图像和结构化数据 : How do I build the correct input data?

转载 作者:行者123 更新时间:2023-12-05 07:04:12 25 4
gpt4 key购买 nike

我正在使用 Keras 函数式 API 构建一个多输入网络,但我很难找到并理解我的输入数据投向网络的正确格式。

我有两个主要输入:

  • 一个是图像,它会抛出经过微调的 ResNet50 CNN
  • 第二个是一个简单的 numpy 数组 (X_train),其中包含有关图像的元数据(图像的位置和大小)。这个会抛出一个简单的密集网络。

我从数据帧加载图像,其中包含元数据和相应图像的文件路径。我使用 ImageDataGenerator 和 flow_from_dataframe 方法来加载我的图像:

datagen = ImageDataGenerator(preprocessing_function=preprocess_input)

train_flow = datagen.flow_from_dataframe(
dataframe=df_train,
x_col="cropped_img_filepath",
y_col="category",
batch_size=batch_size,
shuffle=False,
class_mode="categorical",
target_size=(224,224)
)

我可以使用它们自己的数据分别训练这两个网络,直到这里都没有问题。
然后将两个不同网络的两个输出组合成一个密集网络,输出一个 10 位数的概率向量:

# Create the input for the final dense network using the output of both the dense MLP and CNN
combinedInput = concatenate([cnn.output, mlp.output])

x = Dense(512, activation="relu")(combinedInput)
x = Dense(256, activation="relu")(x)
x = Dense(128, activation="relu")(x)
x = Dense(32, activation="relu")(x)
x = Dense(10, activation="softmax")(x)



model = Model(inputs=[cnn.input, mlp.input], outputs=x)

# Compile the model
opt = Adam(lr=1e-3, decay=1e-3 / 200)
model.compile(loss="categorical_crossentropy",
metrics=['accuracy'],
optimizer=opt)

# Train the model
model_history = model.fit(x=(train_flow, X_train),
y=y_train,
epochs=1,
batch_size=batch_size)

但是,当我无法训练整个网络时,出现以下错误:

ValueError:找不到可以处理输入的数据适配器:( 包含类型值 {" ", " "}),

我明白我没有为我的输入数据使用正确的输入格式。
我可以用 train_flow 训练我的 CNN,用 X_train 训练我的密集网络,所以我希望这会起作用。

你知道如何将图像数据和 num 数组组合成一个多输入数组吗?

感谢您提供的所有信息!

最佳答案

我终于找到了怎么做,@Nima Aghli 提议的帖子启发了我。
这是我的做法:

首先实例化预处理函数(对我来说是用于 ResNest50 的函数):

from tensorflow.keras.applications.resnet50 import ResNet50, preprocess_input

def preprocess_function(x):
if x.ndim == 3:
x = x[np.newaxis, :, :, :]
return preprocess_input(x)

# Initializing the datagen, using the above function :
datagen = ImageDataGenerator(preprocessing_function=preprocess_input)

然后定义自定义数据生成器,它将产生随机采样的数组耦合图像和元数据,同时确保永远不会用完数据(以便您可以运行任意数量的纪元):

def createGenerator(dff, verif=False, batch_size=BATCH_SIZE):

# Shuffles the dataframe, and so the batches as well
dff = dff.sample(frac=1)

# Shuffle=False is EXTREMELY important to keep order of image and coord
flow = datagen.flow_from_dataframe(
dataframe=dff,
directory=None,
x_col="cropped_img_filepath",
y_col="category",
batch_size=batch_size,
shuffle=False,
class_mode="categorical",
target_size=(224,224),
seed=42
)
idx = 0
n = len(dff) - batch_size
batch = 0
while True :
# Get next batch of images
X1 = flow.next()
# idx to reach
end = idx + X1[0].shape[0]
# get next batch of lines from df
X2 = dff[["x", "y", "w", "h"]][idx:end].to_numpy()
dff_verif = dff[idx:end]
# Updates the idx for the next batch
idx = end
# print("batch nb : ", batch, ", batch_size : ", X1[0].shape[0])
batch+=1
# Checks if we are at the end of the dataframe
if idx==len(dff):
# print("END OF THE DATAFRAME\n")
idx = 0


# Yields the image, metadata & target batches
if verif==True :
yield [X1[0], X2], X1[1], dff_verif
else :
yield [X1[0], X2], X1[1] #Yield both images, metadata and their mutual label

我自愿保留注释,因为它有助于掌握所有计算的操作。
要点/问题是从所有数据帧中获取图像,而不会缺少图像,并且具有相同大小的批处理。
此外,我们必须注意图像/元数据的顺序,以便将正确的信息连接到返回数组中的正确图像。

关于python - Keras 多输入网络,使用图像和结构化数据 : How do I build the correct input data?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62997440/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com