【问题标题】:Not able to use the model.fit() in Keras无法在 Keras 中使用 model.fit()
【发布时间】:2021-07-18 06:42:30
【问题描述】:

请帮我运行代码。这行不通。这几天我一直在努力解决这个问题。 model_final.fit() 也不起作用。为什么这显示该方法的相同错误。这几乎是整个代码。

编辑:添加了 train_generator 和 validation_generator。

img_width, img_height = 400, 400
train_data_dir = "data/train"
validation_data_dir = "data/validation"
nb_train_samples = 4125
nb_validation_samples = 466
batch_size = 16,
epochs = 5

output_num_classes = 2

K.set_image_data_format('channels_last')
model = applications.VGG19(weights="imagenet", include_top=False, input_shape=(img_width, img_height, 3))

model.summary()

x = model.output
x = Flatten()(x)
x = Dense(1024, activation="relu")(x)
x = Dropout(0.5)(x)
x = Dense(1024, activation="relu")(x)
predictions = Dense(output_num_classes, activation="softmax")(x)

model_final = Model(inputs=model.input, outputs=predictions)
model_final.compile(loss="categorical_crossentropy", 
                    optimizer=optimizers.SGD(learning_rate=0.0001, momentum=0.9),
                    metrics=['accuracy'])
train_datagen = ImageDataGenerator(rescale=1./255,
                                   zoom_range=0.3,
                                   width_shift_range=0.3,
                                   height_shift_range=0.3,
                                   rotation_range=30,
                                   horizontal_flip=True,
                                   fill_mode='nearest')

train_generator = train_datagen.flow_from_directory(train_data_dir,
                                                    target_size=(img_height, img_width),
                                                    batch_size=batch_size,
                                                    class_mode='categorical')

validation_datagen = ImageDataGenerator(rescale=1./255,
                                   zoom_range=0.3,
                                   width_shift_range=0.3,
                                   height_shift_range=0.3,
                                   rotation_range=30,
                                   horizontal_flip=True,
                                   fill_mode='nearest')

validation_generator = validation_datagen.flow_from_directory(validation_data_dir,
                                                              target_size=(img_height, img_width),
                                                              batch_size = batch_size,
                                                              class_mode='categorical')

上面的代码是在拟合之前的。

model_final.fit_generator(train_generator, 
                          steps_per_epoch=nb_train_samples,
                          epochs = epochs,
                          validation_data = validation_generator,
                          validation_steps = nb_validation_samples)

/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/training.py:1844: UserWarning: `Model.fit_generator` is deprecated and will be removed in a future version. Please use `Model.fit`, which supports generators.
  warnings.warn('`Model.fit_generator` is deprecated and '
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-87-b195f52ce8fb> in <module>()
      3                           epochs = epochs,
      4                           validation_data = validation_generator,
----> 5                           validation_steps = nb_validation_samples)

/usr/local/lib/python3.7/dist-packages/keras_preprocessing/image/iterator.py in __len__(self)
     66 
     67     def __len__(self):
---> 68         return (self.n + self.batch_size - 1) // self.batch_size  # round up
     69 
     70     def on_epoch_end(self):

TypeError: unsupported operand type(s) for +: 'int' and 'tuple' ```

【问题讨论】:

  • 添加其余代码(train_generator、validation_generator)。此外,如输出中所述,您不应再使用fit_generator(),因为它已被弃用。 fit() 现在支持生成器,所以请改用它。
  • 那部分很好。我猜。在未来的版本中,它将被弃用。另一个问题是该功能正在运行。我将编辑代码。
  • batch_size 的值是多少?请发布计算该值的代码
  • @Dr.Snoopy 我现在上传了整个代码。你能帮我解决这个问题吗?我现在已经被困了很长时间了。你能帮忙吗?
  • 批量大小定义中有一个逗号 (batch_size = 16, ),逗号不应该在那里,因为它将整数转换为一个元组。

标签: tensorflow keras conv-neural-network keras-layer


【解决方案1】:

我能够使用示例代码复制您的问题,如下所示

import tensorflow as tf
from tensorflow.keras.applications import ResNet50
import os
import numpy as np
from keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.layers import Dense, Dropout, Flatten
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.models import Sequential

from google.colab import drive
drive.mount('/content/drive')

train_dir  = '/content/drive/My Drive/Dogs_Vs_Cats/train'
test_dir = '/content/drive/My Drive/Dogs_Vs_Cats/test'

img_width, img_height = 224, 224
input_shape = (img_width, img_height, 3)

epochs = 8
batch_size = 32,

train_datagen = ImageDataGenerator(
    rescale = 1. /255,
    horizontal_flip = True)

test_datagen = ImageDataGenerator(
    rescale = 1. /255)

train_data = train_datagen.flow_from_directory(
    train_dir,
    target_size = (img_width, img_height),
    batch_size = batch_size,
    class_mode = 'binary')

test_data = test_datagen.flow_from_directory(
    test_dir,
    target_size = (img_width, img_height),
    class_mode = 'binary')


Conv_Base = ResNet50(include_top = False, weights = 'imagenet', input_shape = input_shape)

model = Sequential()
model.add(Conv_Base)
model.add(Flatten())
model.add(Dense(units = 256, activation = 'relu'))
model.add(Dropout(0.5))
model.add(Dense(units = 1, activation = 'sigmoid'))
model.summary()

model.compile(loss = 'binary_crossentropy',
            optimizer = 'Adam',
            metrics = [tf.keras.metrics.Precision(), tf.keras.metrics.Recall()])

model.fit(
        train_data,
        steps_per_epoch = 10,
        epochs = 2,
        validation_data = test_data,
        verbose = 1,
        validation_steps = 32)

输出:

Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True).
Found 2000 images belonging to 2 classes.
Found 1018 images belonging to 2 classes.
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
resnet50 (Functional)        (None, 7, 7, 2048)        23587712  
_________________________________________________________________
flatten (Flatten)            (None, 100352)            0         
_________________________________________________________________
dense (Dense)                (None, 256)               25690368  
_________________________________________________________________
dropout (Dropout)            (None, 256)               0         
_________________________________________________________________
dense_1 (Dense)              (None, 1)                 257       
=================================================================
Total params: 49,278,337
Trainable params: 49,225,217
Non-trainable params: 53,120
_________________________________________________________________
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-1-5a5644117355> in <module>()
     60         validation_data = test_data,
     61         verbose = 1,
---> 62         validation_steps = 32)

3 frames
/usr/local/lib/python3.7/dist-packages/keras_preprocessing/image/iterator.py in __len__(self)
     66 
     67     def __len__(self):
---> 68         return (self.n + self.batch_size - 1) // self.batch_size  # round up
     69 
     70     def on_epoch_end(self):

TypeError: unsupported operand type(s) for +: 'int' and 'tuple'

解决方案:

正如@Dr 正确建议的那样。史努比,这个问题是由于commabatch_size 定义之后引起的。它将integer 转换为tuple,这是不受支持的。

batch_size = 32, 更改为batch_size = 32 已解决此问题。

工作代码如下图

import tensorflow as tf
from tensorflow.keras.applications import ResNet50
import os
import numpy as np
from keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.layers import Dense, Dropout, Flatten
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.models import Sequential

from google.colab import drive
drive.mount('/content/drive')

train_dir  = '/content/drive/My Drive/Dogs_Vs_Cats/train'
test_dir = '/content/drive/My Drive/Dogs_Vs_Cats/test'

img_width, img_height = 224, 224
input_shape = (img_width, img_height, 3)

epochs = 8
batch_size = 32    # removed comma


train_datagen = ImageDataGenerator(
    rescale = 1. /255,
    horizontal_flip = True)

test_datagen = ImageDataGenerator(
    rescale = 1. /255)

train_data = train_datagen.flow_from_directory(
    train_dir,
    target_size = (img_width, img_height),
    batch_size = batch_size,
    class_mode = 'binary')

test_data = test_datagen.flow_from_directory(
    test_dir,
    target_size = (img_width, img_height),
    class_mode = 'binary')


Conv_Base = ResNet50(include_top = False, weights = 'imagenet', input_shape = input_shape)

model = Sequential()
model.add(Conv_Base)
model.add(Flatten())
model.add(Dense(units = 256, activation = 'relu'))
model.add(Dropout(0.5))
model.add(Dense(units = 1, activation = 'sigmoid'))
model.summary()

model.compile(loss = 'binary_crossentropy',
            optimizer = 'Adam',
            metrics = [tf.keras.metrics.Precision(), tf.keras.metrics.Recall()])

model.fit(
        train_data,
        steps_per_epoch = 10,
        epochs = 2,
        validation_data = test_data,
        verbose = 1,
        validation_steps = 32)

输出:

Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True).
Found 2000 images belonging to 2 classes.
Found 1018 images belonging to 2 classes.
Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
resnet50 (Functional)        (None, 7, 7, 2048)        23587712  
_________________________________________________________________
flatten_1 (Flatten)          (None, 100352)            0         
_________________________________________________________________
dense_2 (Dense)              (None, 256)               25690368  
_________________________________________________________________
dropout_1 (Dropout)          (None, 256)               0         
_________________________________________________________________
dense_3 (Dense)              (None, 1)                 257       
=================================================================
Total params: 49,278,337
Trainable params: 49,225,217
Non-trainable params: 53,120
_________________________________________________________________
Epoch 1/2
10/10 [==============================] - 107s 10s/step - loss: 9.5302 - precision_1: 0.6096 - recall_1: 0.6485 - val_loss: 14405.0479 - val_precision_1: 0.0000e+00 - val_recall_1: 0.0000e+00
Epoch 2/2
10/10 [==============================] - 68s 7s/step - loss: 2.2295 - precision_1: 0.8191 - recall_1: 0.8799 - val_loss: 3977.1418 - val_precision_1: 0.4912 - val_recall_1: 1.0000
<tensorflow.python.keras.callbacks.History at 0x7fbba005cc50>

【讨论】:

    猜你喜欢
    • 2022-01-07
    • 2018-01-31
    • 1970-01-01
    • 2023-01-05
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    相关资源
    最近更新 更多