python - 如何将图像输入 CNN 进行二元分类
问题描述
我正在尝试创建一个卷积神经网络,该网络可以根据一个人的面部图片检测一个人是否中风。我的数据集的图像包含在一个名为CNNImages的目录中,该目录包含两个子目录:Strokes和RegularFaces。每个子目录都包含我试图输入我的神经网络的 jpg 图像。
按照本教程中使用的方法,我创建了 CNN,它在输入 MNIST 数据集时可以工作。但是,我无法将自己的图像输入神经网络。我一直在使用Keras 教程中显示的代码进行图像数据预处理,但它不起作用。
import tensorflow as tf
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
import numpy as np
dataset = tf.keras.preprocessing.image_dataset_from_directory(
'C:\\Users\\Colin\\CNNImages',
labels="inferred",
label_mode="int",
class_names=None,
color_mode="rgb",
batch_size=32,
image_size=(128, 128),
shuffle=True,
seed=1,
validation_split=0.2,
subset="training",
interpolation="bilinear",
follow_links=False,
)
当我尝试使用 将此数据集输入我的神经网络(x_train, y_train), (x_test, y_test) = dataset
时,我收到以下错误:
ValueError: too many values to unpack (expected 2)
我在下面的神经网络中包含了我的尝试。
batch_size = 128
num_classes = 2
epochs = 12
# input image dimensions
img_rows, img_cols = 128, 128
# the data, split between train and test sets
(x_train, y_train), (x_test, y_test) = dataset
x_train = x_train.reshape(869,128,128,3)
x_test = x_test.reshape(217,128,128,3)
print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')
# convert class vectors to binary class matrices
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
activation='relu',
input_shape=(28,28,1)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))
model.compile(loss=keras.losses.categorical_crossentropy,
optimizer=keras.optimizers.Adadelta(),
metrics=['accuracy'])
model.fit(x_train, y_train,
batch_size=batch_size,
epochs=epochs,
verbose=1,
validation_data=(x_test, y_test))
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
我相信我将图像错误地导入 CNN,但不确定如何解决这个问题。让图像正确导入的解决方案是什么?
编辑:下面是我更新的代码尝试。(x_train, y_train), (x_test, y_test) = train_ds
由于返回,它无法运行ValueError: too many values to unpack (expected 2)
import tensorflow as tf
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
import numpy as np
train_ds = tf.keras.preprocessing.image_dataset_from_directory(
'C:\\Users\\Colin\\Desktop\\CNNImages\\Training',
validation_split=None,
subset=None,
seed=123,
image_size=(128, 128),
batch_size=32)
val_ds = tf.keras.preprocessing.image_dataset_from_directory(
'C:\\Users\\Colin\\Desktop\\CNNImages\\Validation',
validation_split=None,
subset=None,
seed=123,
image_size=(128, 128),
batch_size=32)
batch_size = 128
num_classes = 2
epochs = 12
# input image dimensions
img_rows, img_cols = 128, 128
# the data, split between train and test sets
(x_train, y_train), (x_test, y_test) = train_ds
x_train = x_train.reshape(869,128,128,3)
x_test = x_test.reshape(217,128,128,3)
print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')
# convert class vectors to binary class matrices
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
activation='relu',
input_shape=(28,28,1)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))
model.compile(loss=keras.losses.categorical_crossentropy,
optimizer=keras.optimizers.Adadelta(),
metrics=['accuracy'])
model.fit(
train_ds,
validation_data=val_ds,
epochs=3
)
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
解决方案
(x_train, y_train), (x_test, y_test) = dataset
部分代码引发错误。因为,当您使用 时tf.keras.preprocessing.image_dataset_from_director()
,它会返回成批的图像,它不会将您的数据拆分为训练集和测试集。所以你需要单独声明训练和测试:
# first-approach
train_dataset = tf.keras.preprocessing.image_dataset_from_directory(train_folder, ...)
test_dataset = tf.keras.preprocessing.image_dataset_from_directory(test_folder, ...)
# second approach
train_ds = tf.keras.preprocessing.image_dataset_from_directory(
data_dir,
validation_split=0.2,
subset="training",
seed=123,
image_size=(img_height, img_width),
batch_size=batch_size)
val_ds = tf.keras.preprocessing.image_dataset_from_directory(
data_dir,
validation_split=0.2,
subset="validation",
seed=123,
image_size=(img_height, img_width),
batch_size=batch_size)
model.fit(
train_ds,
validation_data=val_ds,
epochs=3
)
推荐阅读
- gitlab - GitLab:我怎样才能要求仅生产的手动步骤?
- python - 由两个正态变量的比率定义的分布中的值的概率(Python)
- html - 如何设置 ::before 元素的样式和位置,使其不影响按钮大小?
- php - 图像未显示在 ckeditor 中
- python - Python:如何根据日期时间获取值的计数
- graphql - 如何在 dgraph 查询中获取子字符串
- logging - 有没有办法在节奏工作流程中使用“zerolog”记录器而不是“zap”记录器?
- domain-driven-design - DDD - 领域服务实施:领域或基础设施
- html - 如何去除图片底部的黑线
- python - 使用 MIMEBase 将 CSV 附加到电子邮件,仅附加“bin”文档