我是张量流的新手。我正在尝试为猫和狗之间的二元分类运行卷积神经网络。
数据的结构是这样的:在一个名为data的目录中,有两个子目录:test和train。在每个子目录中有两个(子)子目录,称为cat和dog。
我要做的是使用 tf.data.Dataset 导入图像并运行 CNN 对它们进行分类。
按照本参考文献中建议的方法(https://towardsdatascience.com/tf-data-creating-data-input-pipelines-2913461078e2)我可以将数据导入为 Dataset 对象并将其在图像和标签之间分开(我是不确定是否正确,我只是按照上面链接中提出的方法。顺便问一下,有什么方法可以检查分离和标记过程是否正确执行?):
from glob import glob
import tensorflow as tf
IMAGE_PATH_LIST = glob('/Users/josea/Desktop/Deep_Learning/cats_dogs/training/*/*.jpg')
DATA = tf.data.Dataset.list_files(IMAGE_PATH_LIST)
def load_images(path):
image = tf.io.read_file(path)
image = tf.io.decode_image(image)
label = tf.strings.split(path, os.path.sep)[-2]
return image, label
DATA= DATA.map(load_images)
我有几个问题:首先,当我尝试运行 CNN 时(使用下面的脚本),它给出了一条错误消息“层序 4 的输入 0 与层不兼容:预期 ndim=4,发现 ndim=3。完整收到的形状:[None, 265, 3]”。
有人猜我做错了什么?此外,我想检查数据是否正确导入。有什么好的方法来评估吗?
我的 CNN 尝试如下所示:
model = Sequential()
model.add(Conv2D(64, (3,3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size = (2,2)))
model.add(Conv2D(64, (3,3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size = (2,2)))
model.add(Flatten())
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dense(1))
model.add(Activation('sigmoid'))
model.compile(loss = 'binary_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
model.fit(DATA)
提前致谢!