【问题标题】:How to use black and white images in keras CNN?如何在 keras CNN 中使用黑白图像?
【发布时间】:2020-08-04 13:46:03
【问题描述】:
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Activation, Dense, Flatten, BatchNormalization, Conv2D, MaxPool2D, Dropout
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.preprocessing.image import ImageDataGenerator
import os
import matplotlib.pyplot as plt
import warnings
warnings.simplefilter(action='ignore', category=FutureWarning)

os.chdir('C:/Users/dancu/PycharmProjects/firstCNN/data/ad-vs-cn')

physical_devices = tf.config.experimental.list_physical_devices('GPU')
print("Num GPUs Available: ", len(physical_devices))
tf.config.experimental.set_memory_growth(physical_devices[0], True)

train_path = "C:/Users/dancu/PycharmProjects/firstCNN\data/ad-vs-cn/train"
test_path = "C:/Users/dancu/PycharmProjects/firstCNN\data/ad-vs-cn/test"
valid_path = "C:/Users/dancu/PycharmProjects/firstCNN\data/ad-vs-cn/valid"

train_batches = ImageDataGenerator(preprocessing_function=tf.keras.applications.vgg16.preprocess_input) \
    .flow_from_directory(directory=train_path, target_size=(256,256), classes=['cn', 'ad'], batch_size=10, color_mode="rgb")
valid_batches = ImageDataGenerator(preprocessing_function=tf.keras.applications.vgg16.preprocess_input) \
    .flow_from_directory(directory=valid_path, target_size=(256,256), classes=['cn', 'ad'], batch_size=10, color_mode="rgb")
test_batches = ImageDataGenerator(preprocessing_function=tf.keras.applications.vgg16.preprocess_input) \
    .flow_from_directory(directory=test_path, target_size=(256,256), classes=['cn', 'ad'], batch_size=10, color_mode="rgb", shuffle=False)


# def plotImages(images_arr):
#     fig, axes = plt.subplots(1, 10, figsize=(20,20))
#     axes = axes.flatten()
#     for img, ax in zip( images_arr, axes):
#         ax.imshow(img)
#         ax.axis('off')
#     plt.tight_layout()
#     plt.show()
#
#
# imgs, labels = next(train_batches)
# plotImages(imgs)

model = Sequential([
    Conv2D(filters=32, kernel_size=(3, 3), activation='relu', padding = 'same', input_shape=(256,256,3)),
    MaxPool2D(pool_size=(2, 2), strides=2),
    Conv2D(filters=64, kernel_size=(3, 3), activation='relu', padding = 'same'),
    MaxPool2D(pool_size=(2, 2), strides=2),
    Flatten(),
    Dense(units=2, activation='softmax')
])

#print(model.summary())

model.compile(optimizer=Adam(learning_rate=0.0001), loss='categorical_crossentropy', metrics=['accuracy'])

model.fit(x=train_batches,
    steps_per_epoch=len(train_batches),
    validation_data=valid_batches,
    validation_steps=len(valid_batches),
    epochs=10,
    verbose=2
)

这段代码运行得非常好,但我使用的图像实际上是灰度的,所以由于图像的显示方式,我的输出精度很差。 当我将 color_mode 更改为“灰度”时,出现以下错误:

Traceback (most recent call last):
  File "C:/Users/dancu/PycharmProjects/firstCNN/finalData.py", line 56, in <module>
    model.fit(x=train_batches,
  File "C:\Users\dancu\PycharmProjects\firstCNN\venv\lib\site-packages\tensorflow\python\keras\engine\training.py", line 66, in _method_wrapper
    return method(self, *args, **kwargs)
  File "C:\Users\dancu\PycharmProjects\firstCNN\venv\lib\site-packages\tensorflow\python\keras\engine\training.py", line 802, in fit
    data_handler = data_adapter.DataHandler(
  File "C:\Users\dancu\PycharmProjects\firstCNN\venv\lib\site-packages\tensorflow\python\keras\engine\data_adapter.py", line 1100, in __init__
    self._adapter = adapter_cls(
  File "C:\Users\dancu\PycharmProjects\firstCNN\venv\lib\site-packages\tensorflow\python\keras\engine\data_adapter.py", line 901, in __init__
    super(KerasSequenceAdapter, self).__init__(
  File "C:\Users\dancu\PycharmProjects\firstCNN\venv\lib\site-packages\tensorflow\python\keras\engine\data_adapter.py", line 772, in __init__
    peek, x = self._peek_and_restore(x)
  File "C:\Users\dancu\PycharmProjects\firstCNN\venv\lib\site-packages\tensorflow\python\keras\engine\data_adapter.py", line 912, in _peek_and_restore
    return x[0], x
  File "C:\Users\dancu\PycharmProjects\firstCNN\venv\lib\site-packages\keras_preprocessing\image\iterator.py", line 65, in __getitem__
    return self._get_batches_of_transformed_samples(index_array)
  File "C:\Users\dancu\PycharmProjects\firstCNN\venv\lib\site-packages\keras_preprocessing\image\iterator.py", line 239, in _get_batches_of_transformed_samples
    x = self.image_data_generator.standardize(x)
  File "C:\Users\dancu\PycharmProjects\firstCNN\venv\lib\site-packages\keras_preprocessing\image\image_data_generator.py", line 708, in standardize
    x = self.preprocessing_function(x)
  File "C:\Users\dancu\PycharmProjects\firstCNN\venv\lib\site-packages\tensorflow\python\keras\applications\vgg16.py", line 232, in preprocess_input
    return imagenet_utils.preprocess_input(
  File "C:\Users\dancu\PycharmProjects\firstCNN\venv\lib\site-packages\tensorflow\python\keras\applications\imagenet_utils.py", line 106, in preprocess_input
    return _preprocess_numpy_input(
  File "C:\Users\dancu\PycharmProjects\firstCNN\venv\lib\site-packages\tensorflow\python\keras\applications\imagenet_utils.py", line 223, in _preprocess_numpy_input
    x[..., 1] -= mean[1]
IndexError: index 1 is out of bounds for axis 2 with size 1

Process finished with exit code 1

我还把Conv2D层的input_shape改成了只有1个通道而不是3个,但是还是出现了同样的错误。

有人可以帮我解决这个问题吗?谢谢!

【问题讨论】:

  • 你能把conv layer 1中的input_shape改成只使用一个通道吗..另外请在ImageDataGenerator中更改color_mode:“grayscale”
  • @pankajgiri 我在帖子中提到我尝试了这两种方法,但不幸的是错误仍然存​​在

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


【解决方案1】:

设置color_mode='grayscale' 时出现错误,因为tf.keras.applications.vgg16.preprocess_input 根据其documentation 采用具有3 个通道的输入张量。您不需要此功能,因为您是从头开始训练模型,因此基于 ImageNet 图片将输入归零并没有多大意义。只需在 ImageDataGenerator 调用中传递 rescale=1/255 就可以了,这对于基本的预处理就很好了。

train_batches = ImageDataGenerator(
    rescale=1/255).flow_from_directory(directory=train_path, 
        target_size=(256,256), classes=['cn', 'ad'], batch_size=10,
            color_mode="grayscale")

如果您的准确率较低,我建议您使用以下方法:

  1. 使用优化器学习率的默认值
  2. 添加更多 conv/max_pool 层,包含更多神经元
  3. 在展平层之后添加一两个致密层
  4. 使用verbose=1,这样您就可以跟踪验证指标,它会提供丰富的信息

【讨论】:

  • 非常感谢!就像你提到的那样,我的准确度仍然很低,所以我将努力添加更多层并使用一些超参数。
猜你喜欢
  • 2020-05-31
  • 1970-01-01
  • 1970-01-01
  • 2013-06-23
  • 1970-01-01
  • 1970-01-01
  • 2020-05-14
  • 2019-06-13
  • 2022-09-29
相关资源
最近更新 更多