keras CNN图层混淆

fhity93d  于 2023-01-05  发布在  其他
关注(0)|答案(1)|浏览(212)

我有这样一个模型,它试图对猫和狗进行分类:

model = Sequential([Conv2D(128, kernel_size=(3,3), activation='relu', input_shape=(IMG_HEIGHT, IMG_WIDTH, 3)),
                    MaxPooling2D(pool_size=(2,2)),
                    Conv2D(64, kernel_size=(3,3), activation='relu'),
                    MaxPooling2D(pool_size=(2,2)),
                    Flatten(),
                    Dense(32, activation='relu'),
                    Dense(2, activation='softmax')]) # pick between 2 different possible outputs

model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.summary()

然后试着像这样运行这个模型:

history = model.fit(x=train_data_gen, steps_per_epoch=total_train//batch_size, 
                    epochs=epochs, batch_size=batch_size,
                    validation_data=val_data_gen,
                    validation_steps=total_val//batch_size)

但是,我得到了这个ValueError:

ValueError: `logits` and `labels` must have the same shape, received ((None, 2) vs (None, 1)).

如果我将最后一个密集层的维度更改为1,则会运行此操作,但我需要一个具有2个输出层的二元分类,并在它们之间进行softmax以分析测试数据。如何修复我的train_data_gen以匹配维度,因为它是keras.preprocessing.image.DirectoryIterator对象,定义如下:

train_data_gen = train_image_generator.flow_from_directory(batch_size=batch_size,
                                                     directory=train_dir,
                                                     target_size=(IMG_HEIGHT, IMG_WIDTH),
                                                     class_mode='binary')

有没有一种方法可以重塑这个对象,使我的模型正确运行,因为我似乎找不到关于这个对象的对象,或者如果我需要先将其转换为一个numpy数组或Tensor。还有,我如何分类这些模型中的维度/过滤器参数?我选择了128,64,32,并削减了2,因为这是我在网上看到的,但如果能解释一下为什么选择这些值,那将大大帮助我。2提前感谢你的帮助!

t1qtbnec

t1qtbnec1#

感谢Jay Mody的回复。我当时正在度假,暂时离开了这个项目,但是你的建议是正确的,对理解我的工作很有用。我还想提到一些其他的错误,这些错误导致了更糟糕/无用的模型性能。
steps_per_epochvalidation_steps参数并不完全正确,但是产生了奇怪的图形,我在其他在线示例x1c 0d1x中没有看到这些图形
我通过这个网站了解了它们是如何实现的,在我的例子中,将训练图像和验证图像的计数替换为相应的大小。

我还尝试了一下我的模型的过滤器参数,发现这个resource很有帮助。我的模型现在看起来是这样的,并且工作得很好:

model = Sequential([Conv2D(32, kernel_size=(3,3), activation='relu', input_shape=(IMG_HEIGHT, IMG_WIDTH, 3)),
                    MaxPooling2D(pool_size=(2,2)),
                    Conv2D(32, kernel_size=(3,3), activation='relu'),
                    MaxPooling2D(pool_size=(2,2)),
                    Flatten(),
                    Dense(128, activation='relu'),
                    Dense(1, activation='sigmoid')]) # pick between 2 different possible outputs



model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.summary()

希望这对别人有帮助,这整个领域仍然让我困惑但我们继续:)

相关问题