【问题标题】:How to solve input format problem on Keras如何解决 Keras 上的输入格式问题
【发布时间】:2021-07-10 09:18:21
【问题描述】:

我正在使用 Keras 训练 CNN。模型架构如下:

model.add(layers.Conv2D(32, (3, 3), activation='relu',input_shape=(150, 150, 3),padding='same'))
model.add(layers.MaxPooling2D((2, 2),strides=(2,2), padding='same'))
model.add(layers.Conv2D(64, (3, 3), activation='relu', padding='same'))
model.add(layers.MaxPooling2D((2, 2),strides=(2,2), padding='same'))
model.add(layers.Conv2D(128, (3, 3), activation='relu', padding='same'))
model.add(layers.MaxPooling2D((2, 2), strides=(2,2),padding='same'))
model.add(layers.Conv2D(128, (3, 3), activation='relu', padding='same'))
model.add(layers.MaxPooling2D((2, 2),strides=(2,2), padding='same'))
model.add(layers.Flatten())
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

模型的编译和拟合部分是:

model.compile(loss='binary_crossentropy',optimizer=optimizers.RMSprop(lr=1e-4),metrics=['acc'])

train_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(train_dir,target_size=(150, 150),batch_size=20, class_mode='binary')
val_generator = test_datagen.flow_from_directory(val_dir,target_size=(150, 150),batch_size=20,class_mode='binary')


history = model.fit_generator(train_generator,steps_per_epoch=100,epochs=30,validation_data=val_generator,validation_steps=50)

这给了我以下错误:

  warnings.warn('`Model.fit_generator` is deprecated and '
2021-07-10 13:04:09.841898: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:176] None of the MLIR Optimization Passes are enabled (registered 2)
Epoch 1/30
Traceback (most recent call last):
  File "C:/Users/User/PycharmProjects/dog_vs_cat/model.py", line 33, in <module>
    history = model.fit_generator(train_generator,steps_per_epoch=100,epochs=30,validation_data=val_generator,validation_steps=50)
  File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\keras\engine\training.py", line 1932, in fit_generator
    initial_epoch=initial_epoch)
  File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\keras\engine\training.py", line 1158, in fit
    tmp_logs = self.train_function(iterator)
  File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\eager\def_function.py", line 889, in __call__
    result = self._call(*args, **kwds)
  File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\eager\def_function.py", line 950, in _call
    return self._stateless_fn(*args, **kwds)
  File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\eager\function.py", line 3024, in __call__
    filtered_flat_args, captured_inputs=graph_function.captured_inputs)  # pylint: disable=protected-access
  File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\eager\function.py", line 1961, in _call_flat
    ctx, args, cancellation_manager=cancellation_manager))
  File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\eager\function.py", line 596, in call
    ctx=ctx)
  File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\eager\execute.py", line 60, in quick_execute
    inputs, attrs, num_outputs)
tensorflow.python.framework.errors_impl.InvalidArgumentError:  Default MaxPoolingOp only supports NHWC on device type CPU
     [[node sequential/max_pooling2d/MaxPool (defined at \Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\keras\layers\pooling.py:355) ]] [Op:__inference_train_function_1187]

Errors may have originated from an input operation.
Input Source operations connected to node sequential/max_pooling2d/MaxPool:
 sequential/conv2d/Relu (defined at \Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\keras\backend.py:4700)

Function call stack:
train_function


Process finished with exit code 1

我已经搜索过,建议使用data_format="channels_last" 作为我正在使用的输入形状。然后我用data_format="channels_first"将输入形状更改为(3,150,150),它仍然给出同样的错误。

我使用的是 Keras 2.4.3。

有什么帮助吗?

【问题讨论】:

  • 你用什么作为输入层?
  • model.add(layers.Conv2D(32, (3, 3), activation='relu',input_shape=(150, 150, 3),padding='same')) 看起来像我写问题时忽略了最重要的一层。
  • 您的问题现在解决了吗?否则,可以尝试在独立代码中执行以复制您的问题吗?以便我们可以尽力帮助您。谢谢!

标签: python tensorflow keras deep-learning conv-neural-network


【解决方案1】:

当我在 keras 版本 2.4.3 中复制相同的问题时,此代码运行良好

工作示例代码:

!pip install keras==2.4.3
import keras

model = Sequential()
#add model layers
model.add(layers.Conv2D(32, (3, 3), activation='relu',input_shape=(150, 150, 3),padding='same'))
model.add(layers.MaxPooling2D((2, 2),strides=(2,2), padding='same'))
model.add(layers.Conv2D(64, (3, 3), activation='relu', padding='same'))
model.add(layers.MaxPooling2D((2, 2),strides=(2,2), padding='same'))
model.add(layers.Conv2D(128, (3, 3), activation='relu', padding='same'))
model.add(layers.MaxPooling2D((2, 2), strides=(2,2),padding='same'))
model.add(layers.Conv2D(128, (3, 3), activation='relu', padding='same'))
model.add(layers.MaxPooling2D((2, 2),strides=(2,2), padding='same'))
model.add(layers.Flatten())
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

train_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(train_directory,target_size=(150, 150),batch_size=5, class_mode='binary')
val_generator = test_datagen.flow_from_directory(Val_directory ,target_size=(150, 150),batch_size=5,class_mode='binary')
#Modified
from keras.optimizers import RMSprop
model.compile(loss='binary_crossentropy',optimizer=RMSprop(),metrics=['acc'])
history = model.fit(train_generator,epochs=4,steps_per_epoch=4,validation_data=val_generator,validation_steps=50)

输出:

Epoch 1/4
4/4 [==============================] - ETA: 0s - loss: 1.0794 - acc: 0.7500WARNING:tensorflow:Your input ran out of data; interrupting training. Make sure that your dataset or generator can generate at least `steps_per_epoch * epochs` batches (in this case, 50 batches). You may need to use the repeat() function when building your dataset.
4/4 [==============================] - 4s 753ms/step - loss: 1.0794 - acc: 0.7500 - val_loss: 1.4395 - val_acc: 0.5000
Epoch 2/4
4/4 [==============================] - 1s 348ms/step - loss: 0.3407 - acc: 0.8500
Epoch 3/4
4/4 [==============================] - 1s 349ms/step - loss: 0.6352 - acc: 0.7500
Epoch 4/4
4/4 [==============================] - 1s 357ms/step - loss: 0.3096 - acc: 0.9000

【讨论】:

    猜你喜欢
    • 2019-09-21
    • 1970-01-01
    • 2020-01-01
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    相关资源
    最近更新 更多