【问题标题】:model.fit_generator : 'tuple' object cannot be interpreted as an integermodel.fit_generator : 'tuple' 对象不能被解释为整数
【发布时间】:2021-05-14 13:22:08
【问题描述】:

我正在使用深度学习进行狗与猫分类。当我使用fit generator 拟合模型时,出现以下错误。:

'tuple' object cannot be interpreted as an integer

我不知道我哪里做错了!我的完整代码如下。

我按照https://data-flair.training/blogs/cats-dogs-classification-deep-learning-project-beginners/ 的教程进行操作,代码也是一样的。但我得到了错误!

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from keras.models import Sequential
from keras.layers import Conv2D,MaxPooling2D,Dropout,Flatten,Dense,Activation,BatchNormalization
model=Sequential()
model.add(keras.Input(shape=(128,128,3)))

model.add(layers.Conv2D(32, 3, activation="relu"))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))

model.add(layers.Conv2D(64,3,activation='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))

model.add(layers.Conv2D(128,3,activation='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(512,activation='relu'))
model.add(BatchNormalization())
model.add(Dropout(0.5))
model.add(Dense(2,activation='sigmoid'))

model.compile(loss='binary_crossentropy',optimizer='rmsprop',metrics=['accuracy'])

train_df, validate_df = train_test_split(df, test_size = 0.2, random_state = 42)
train_df = train_df.reset_index(drop=True)
validate_df = validate_df.reset_index(drop=True)

from keras.callbacks import EarlyStopping,ReduceLROnPlateau
earlystop=EarlyStopping(patience=10)
learning_rate_reduction=ReduceLROnPlateau(monitor='val_acc',patience=2,verbose=1,factor=0.5,min_lr=0.00001)
callbacks=[earlystop,learning_rate_reduction]

train_datagen = ImageDataGenerator(rotation_range=15,
                                rescale=1./255,
                                shear_range=0.1,
                                zoom_range=0.2,
                                horizontal_flip=True,
                                width_shift_range=0.1,
                                height_shift_range=0.1
                                )

train_generator = train_datagen.flow_from_dataframe(train_df,
                                                 "/content/drive/MyDrive/Cat_Dog/dogs-vs-cats/train/train/",x_col='filename',y_col='category',
                                                 target_size=Image_Size,
                                                 class_mode='categorical',
                                                 batch_size=batch_size)

validation_datagen = ImageDataGenerator(rescale=1./255)
validation_generator = validation_datagen.flow_from_dataframe(
    validate_df, 
    "/content/drive/MyDrive/Cat_Dog/dogs-vs-cats/train/train/", 
    x_col='filename',
    y_col='category',
    target_size=Image_Size,
    class_mode='categorical',
    batch_size=batch_size
)

test_datagen = ImageDataGenerator(rotation_range=15,
                                rescale=1./255,
                                shear_range=0.1,
                                zoom_range=0.2,
                                horizontal_flip=True,
                                width_shift_range=0.1,
                                height_shift_range=0.1)

test_generator = train_datagen.flow_from_dataframe(train_df,
                                                 "/content/drive/MyDrive/Cat_Dog/dogs-vs-cats/test1",x_col='filename',y_col='category',
                                                 target_size=Image_Size,
                                                 class_mode='categorical',
                                                 batch_size=batch_size)

df["category"] = df["category"].replace({0:'cat',1:'dog'})
train_df,validate_df = train_test_split(df,test_size=0.20,
  random_state=42)

train_df = train_df.reset_index(drop=True)
validate_df = validate_df.reset_index(drop=True)

total_train=train_df.shape[0]
total_validate=validate_df.shape[0]
batch_size=15

epochs=10
history = model.fit_generator(
    train_generator, 
    epochs=epochs,
    validation_data=validation_generator,
    validation_steps=total_validate//batch_size,
    steps_per_epoch=total_train//batch_size,
    callbacks=callbacks
)

【问题讨论】:

    标签: python tensorflow machine-learning keras deep-learning


    【解决方案1】:

    不确定这是否是原因,但我注意到一个问题。猫对狗数据集是一个二进制分类问题。设置应该是

    model.add(Dense(1,activation='sigmoid'))
    model.compile(loss='binary_crossentropy',optimizer='rmsprop',metrics=['accuracy'])
    
    train_generator = train_datagen.flow_from_dataframe(...
                                                     class_mode='binary'
    )
    
    validation_generator = validation_datagen.flow_from_dataframe(
        ....
        class_mode='binary',
        ...
    )
    
    test_generator = train_datagen.flow_from_dataframe(
         ...
         class_mode='binary'
    )
    

    或者,

    model.add(Dense(2,activation='softmax'))
    model.compile(loss='categorical_crossentropy',
                      optimizer='rmsprop',metrics=['accuracy'])
        
    train_generator = train_datagen.flow_from_dataframe(...
                                                         class_mode='categorical'
        )
        
    validation_generator = validation_datagen.flow_from_dataframe(
            ....
            class_mode='category',
            ...
        )
        
    test_generator = train_datagen.flow_from_dataframe(
             ...
             class_mode='category'
        )
    

    【讨论】:

    • 另外,按照this的指示,和你的一样。
    • 跟随提供的链接。工作正常。它似乎和我的代码一样。可能是我做错了,我无法识别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 2018-03-19
    • 2018-01-19
    • 1970-01-01
    相关资源
    最近更新 更多