AttributeError:使用自定义生成器在 Keras 模型上调用 fit 时,“tuple”对象没有属性“rank”

2023-11-25

我想构建一个具有两个输入的神经网络:用于图像数据和数字数据。所以我为此编写了自定义数据生成器。这train and validation数据框包含 11 列:

  1. image_name— 图像的路径;
  2. 9个数字特征;
  3. target— 项目的类(最后一列)。

自定义生成器的代码(基于这个答案):

target_size = (224, 224)
batch_size = 1

train_datagen = ImageDataGenerator(
    rescale=1./255,
    rotation_range=20,
    width_shift_range=0.2,
    height_shift_range=0.2,
    horizontal_flip=True)

val_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_dataframe(
    train,
    x_col='image_name',
    y_col=train.columns[1:],
    target_size=target_size,
    batch_size=batch_size,
    shuffle=True,
    class_mode='raw')

validation_generator = val_datagen.flow_from_dataframe(
    validation,
    x_col='image_name',
    y_col=validation.columns[1:],
    target_size=target_size,
    shuffle=False,
    batch_size=batch_size,
    class_mode='raw')

def train_generator_func():
    count = 0
    while True:
        if count == len(train.index):
            train_generator.reset()
            break
        count += 1
        data = train_generator.next()
        
        imgs = []
        cols = []
        targets = []
        
        for k in range(batch_size):
            imgs.append(data[0][k])
            cols.append(data[1][k][:-1])
            targets.append(data[1][k][-1])
            
        yield [imgs, cols], targets
        
def validation_generator_func():
    count = 0
    while True:
        if count == len(validation.index):
            validation_generator.reset()
            break
        count += 1
        data = validation_generator.next()
                
        imgs = []
        cols = []
        targets = []
        
        for k in range(batch_size):
            imgs.append(data[0][k])
            cols.append(data[1][k][:-1])
            targets.append(data[1][k][-1])
            
        yield [imgs, cols], targets

建筑模型:

def mlp_model(dim):
    model = Sequential()
    model.add(Dense(8, input_dim=dim, activation="relu"))
    model.add(Dense(4, activation="relu"))
    return model


def vgg16_model():
    model = VGG16(weights='imagenet', include_top=False, input_shape=target_size+(3,))
    x=Flatten()(model.output)
    output=Dense(1,activation='sigmoid')(x) # because we have to predict the AUC
    model=Model(model.input,output)
    return model


def concatenated_model(cnn, mlp):
    combinedInput = concatenate([cnn.output, mlp.output])
    x = Dense(4, activation="relu")(combinedInput)
    x = Dense(1, activation="sigmoid")(x)    
    model = Model(inputs=[cnn.input, mlp.input], outputs=x)
    return model


def focal_loss(alpha=0.25,gamma=2.0):
    def focal_crossentropy(y_true, y_pred):
        bce = K.binary_crossentropy(y_true, y_pred)
        
        y_pred = K.clip(y_pred, K.epsilon(), 1.- K.epsilon())
        p_t = (y_true*y_pred) + ((1-y_true)*(1-y_pred))
        
        alpha_factor = 1
        modulating_factor = 1

        alpha_factor = y_true*alpha + ((1-alpha)*(1-y_true))
        modulating_factor = K.pow((1-p_t), gamma)

        # compute the final loss and return
        return K.mean(alpha_factor*modulating_factor*bce, axis=-1)
    return focal_crossentropy

cnn = vgg16_model()
mlp = mlp_model(9)

model = concatenated_model(cnn, mlp)

opt = Adam(lr=1e-5)
model.compile(loss=focal_loss(), metrics=[tf.keras.metrics.AUC()],optimizer=opt)

nb_epochs = 2
nb_train_steps = train.shape[0]//batch_size
nb_val_steps = validation.shape[0]//batch_size

model.fit(
    train_generator_func(),
    steps_per_epoch=nb_train_steps,
    epochs=nb_epochs,
    validation_data=validation_generator_func(),
    validation_steps=nb_val_steps)

并且拟合不起作用并出现错误消息:

AttributeError                            Traceback (most recent call last)
<ipython-input-53-253849fd34d6> in <module>
      9     epochs=nb_epochs,
     10     validation_data=validation_generator_func(),
---> 11     validation_steps=nb_val_steps)

d:\pyenv\keras-gpu\lib\site-packages\tensorflow\python\keras\engine\training.py in _method_wrapper(self, *args, **kwargs)
    106   def _method_wrapper(self, *args, **kwargs):
    107     if not self._in_multi_worker_mode():  # pylint: disable=protected-access
--> 108       return method(self, *args, **kwargs)
    109 
    110     # Running inside `run_distribute_coordinator` already.

d:\pyenv\keras-gpu\lib\site-packages\tensorflow\python\keras\engine\training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_batch_size, validation_freq, max_queue_size, workers, use_multiprocessing)
   1061           use_multiprocessing=use_multiprocessing,
   1062           model=self,
-> 1063           steps_per_execution=self._steps_per_execution)
   1064 
   1065       # Container that configures and calls `tf.keras.Callback`s.

d:\pyenv\keras-gpu\lib\site-packages\tensorflow\python\keras\engine\data_adapter.py in __init__(self, x, y, sample_weight, batch_size, steps_per_epoch, initial_epoch, epochs, shuffle, class_weight, max_queue_size, workers, use_multiprocessing, model, steps_per_execution)
   1108         use_multiprocessing=use_multiprocessing,
   1109         distribution_strategy=ds_context.get_strategy(),
-> 1110         model=model)
   1111 
   1112     strategy = ds_context.get_strategy()

d:\pyenv\keras-gpu\lib\site-packages\tensorflow\python\keras\engine\data_adapter.py in __init__(self, x, y, sample_weights, workers, use_multiprocessing, max_queue_size, model, **kwargs)
    796       return tensor_shape.TensorShape([None for _ in shape.as_list()])
    797 
--> 798     output_shapes = nest.map_structure(_get_dynamic_shape, peek)
    799     output_types = nest.map_structure(lambda t: t.dtype, peek)
    800 

d:\pyenv\keras-gpu\lib\site-packages\tensorflow\python\util\nest.py in map_structure(func, *structure, **kwargs)
    633 
    634   return pack_sequence_as(
--> 635       structure[0], [func(*x) for x in entries],
    636       expand_composites=expand_composites)
    637 

d:\pyenv\keras-gpu\lib\site-packages\tensorflow\python\util\nest.py in <listcomp>(.0)
    633 
    634   return pack_sequence_as(
--> 635       structure[0], [func(*x) for x in entries],
    636       expand_composites=expand_composites)
    637 

d:\pyenv\keras-gpu\lib\site-packages\tensorflow\python\keras\engine\data_adapter.py in _get_dynamic_shape(t)
    792       shape = t.shape
    793       # Unknown number of dimensions, `as_list` cannot be called.
--> 794       if shape.rank is None:
    795         return shape
    796       return tensor_shape.TensorShape([None for _ in shape.as_list()])

AttributeError: 'tuple' object has no attribute 'rank'

所以我尝试查看 Keras 源代码,但没有成功。

如果我使用修改过的train_generator and validation_generator (y_col='target'代替y_col=train.columns[1:])一切正常。


您需要转换返回的所有单个对象训练和验证生成器到 Numpy 数组:

    yield [np.array(imgs), np.array(cols)], np.array(targets)

或者,一个更简单、更有效的解决方案是根本不迭代数据批次;相反,我们可以利用这样一个事实:这些对象在返回时已经是 Numpy 数组了ImageDataGenerator,所以我们可以写:

    imgs = data[0]
    cols = data[1][:,:-1]
    targets = data[1][:,-1:]
    yield [imgs, cols], targets
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AttributeError:使用自定义生成器在 Keras 模型上调用 fit 时,“tuple”对象没有属性“rank” 的相关文章

随机推荐

  • 如何在 vue.js 中转义大括号

    I have data in my database可能包含花括号 inside app blade php div code div data div code div 因此 如果我想向用户显示该数据 如果它位于 Vue 应用程序内 则会
  • 如何在没有 JAXBElement 包装器的情况下 JSON 编组 JAXBElement 包装的响应?

    我有一个使用 Spring v4 0 5 的 http 服务 它的 http 端点是使用 Spring Web MVC 配置的 响应是根据模式生成的 JAXB2 注解类 响应包含在JAXBElement因为生成的 JAXB 类不运行 Xml
  • Android Gradle 插件需要 Java 11 才能运行。您当前使用的是 Java 1.8。错误

    我想用 Jitpackio 发布一个库 当我发布库时 出现以下错误 Failed to apply plugin com android internal application Android Gradle plugin requires
  • Vim:暂时仅显示特定行

    有时 在 Vim 中 我想仅显示文件的特定部分 例如 特定方法 同时隐藏其余部分 这有助于我专注于手头的问题 我想这样做而不实际更改文件 关于如何做到这一点有什么想法吗 欢呼和问候 克拉斯 Similar to the already me
  • 将 C 预处理器转换为 Rust

    我正在将一些 C 代码移植到 Rust 该代码包含很多类似这样的内容 define CONFIG FLAG NUMBER 23 1 define THIS 10 define THAT 11 define THIS AND THAT THI
  • Doctrine2 实体命名空间

    我是 Doctrine2 的新手 想知道如何告诉 Doctrine 我的实体使用哪个命名空间 我当前的配置is this 我的所有实体都位于名称空间 project entity 中 所以 每次我想获取实体 Color 时 我都必须写 em
  • 以特殊格式打印当前 UTC 日期时间

    很简单 但我是 python 新手 我正在尝试以特殊格式打印当前 UTC 日期和时间 Python 2 6 6 import datetime time print time strftime a b d H M S Z Y datetim
  • Inno Setup RegKey存在于64位系统上

    我使用 Inno Setup 创建了一个安装程序 并想使用 Pascal Script 查询注册表 if RegKeyExists HKEY LOCAL MACHINE SOFTWARE Classes Installer UpgradeC
  • 如何在 Flutter 中获取“Ap​​ps Instance Id”

    我想设置Firebase 应用内消息传递在我的扑动应用程序上 首先 它需要FirebaseInstanceId正如所解释的here 这样我就可以测试向我的设备发送消息 然而该文档并没有详细说明如何在 Android 上获取它 尤其是在 fl
  • 删除级联时的 MongoDB DBRef

    MongoDB 有没有办法让外键具有 ON DELETE CASCADE 功能 我知道您可以使用 DBRef 作为一种外键 但是当删除引用指向的集合中的项目时 引用将返回 null 但我希望引用所属的项目被删除 我该怎么做呢 或者我每次删除
  • 错误 1114 (HY000):表“XXX”已满

    我知道这个问题以前被问过 但似乎没有任何帮助 我在 2 3 天前遇到了这个问题 询问服务器支持 他们告诉我必须将 mysql 从 var 移动到 home 那里是我所有的磁盘空间 这就是我所做的 然后我运行插入 一切都很顺利 直到今天 当我
  • 无法在 PDF 中保存阿拉伯语单词 - PDFBox Java

    正在尝试保存Arabic可编辑 PDF 中的单词 它工作得很好English但是当我使用阿拉伯语单词时 我遇到了这个异常 java lang IllegalArgumentException U 0627 在此字体 Helvetica 编码
  • ASP.Net MVC 3.0 Ajax.BeginForm 正在重定向到页面?

    在 ASP Net MVC 3 0 中我使用 Ajax Beginform 并点击 JsonResult 表单成功后我将调用 jQuery 函数 但由于某种原因我的表单重定向到 JsonAction my View using Ajax B
  • Delphi XE中占用大量内存的TStringList对象

    我正在开发一个模拟程序 该程序首先要做的事情之一是读取一个大文件 28 MB 大约 79 000 行 解析每一行 大约 150 个字段 为该对象创建一个类 并将其添加到 TStringList 它还读取另一个文件 该文件在运行期间添加更多对
  • Volley 库请求队列的最大大小是多少

    我在用VolleyAndroid 中的库 我想知道允许使用的队列的最大大小是多少Volley图书馆 我没有发现与此相关的任何内容 据我所知 您需要将网络请求添加到队列中 但我不知道可以将其并行队列的最大大小是多少 RequestQueue
  • MySQL 索引减慢查询速度

    MySQL Server version 5 0 95 Tables All InnoDB 我遇到 MySQL 数据库查询问题 基本上我发现如果我索引一个特定的 varchar 50 字段tag name 我的查询比不索引字段花费的时间更长
  • 如何限制python上的用户输入长度?

    amt float input Please enter the amount to make change for 我希望用户输入美元金额 因此允许 5 个字符 00 00 有没有办法限制它 以便不允许他们输入超过 5 个字符 我不想要这
  • 从 Java 字符串末尾删除行尾字符

    我有一个字符串 我想仅使用 Java 从字符串的最末尾删除行尾字符 foo r nbar r nhello r nworld r n 我想成为 foo r nbar r nhello r nworld 这个问题与问题类似 但不一样59367
  • 错误 C2797:成员初始值设定项列表内的列表初始化

    我当时正在看MVA 的 C 教程我下面提到的代码是由凯特而不是我编写的 然而 她似乎在编译时没有显示任何错误 但在我的例子中 我收到以下错误 错误 1 错误 C2797 NamedRectangle name 列表初始化 内部成员初始值设定
  • AttributeError:使用自定义生成器在 Keras 模型上调用 fit 时,“tuple”对象没有属性“rank”

    我想构建一个具有两个输入的神经网络 用于图像数据和数字数据 所以我为此编写了自定义数据生成器 这train and validation数据框包含 11 列 image name 图像的路径 9个数字特征 target 项目的类 最后一列