【问题标题】:keras data augmented cnn always expect a single neuron in the classifier output?keras 数据增强 cnn 总是期望分类器输出中有一个神经元?
【发布时间】:2020-03-08 22:00:13
【问题描述】:

我正在实现一个具有数据增强功能的两类 cnn,但是除非输出层由单个神经元组成,否则网络总是会一直引发“预期形状错误”。这是我的代码。

from keras.models import Sequential
from keras.models import Model
from keras.layers import Dense, Activation
from keras.preprocessing.image import ImageDataGenerator
from keras.optimizers import Adam
from keras.layers import Dense, Conv2D, MaxPooling2D , Flatten, Dropout
import keras
from keras import losses
from keras import backend as K
from keras.utils import to_categorical
from matplotlib.pyplot import imread, imshow, subplots, show
import numpy as np


def my_model(input_shape, opt, no_of_class):
    model = Sequential()
    model.add(Conv2D(32, (3, 3), activation='relu', input_shape=input_shape))
    model.add(Conv2D(32, (3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Conv2D(64, (3, 3), activation='relu'))
    model.add(Conv2D(64, (3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Flatten())
    model.add(Dense(256, activation='relu'))
    model.add(Dense(no_of_class, activation='softmax'))
    model.compile(optimizer=opt, loss='binary_crossentropy', metrics=['accuracy'])
    model.summary()
    return model

PATH="C:\\Users\\****\\Desktop\\****\\****\\data\\poroxity\\"
train_data=PATH+'train'
validation_data=PATH+'validation'
no_of_class=2
training_samples=251
validation_samples=108
epochs=50
batch_size=16
img_width, img_height = 224, 224
opt = Adam(lr=0.001)

if K.image_data_format() == 'channels_first':
    input_shape = (3, img_width, img_height)
else:
    input_shape = (img_width, img_height, 3)

train_datagen=ImageDataGenerator(
        rotation_range=90,
        vertical_flip=True,
        width_shift_range=0.3, fill_mode='wrap',
        rescale=1./255,
        shear_range=0.2,
        horizontal_flip=True)
validation_datagen=ImageDataGenerator(rescale=1./255)

# validation and training iterators preparing loaded images from the directory
train_it = train_datagen.flow_from_directory(
    train_data,
    target_size=(img_height, img_width),
    class_mode='binary',
    batch_size=batch_size,
    shuffle=True,
    color_mode='rgb',
    seed=42,
    save_to_dir=PATH+'augmented',
    save_prefix='poroxity_aug',
    save_format='jpeg'
    )
validation_it = validation_datagen.flow_from_directory(
    validation_data,
    target_size=(img_height, img_width),
    class_mode='binary',
    batch_size=1)

model=my_model(input_shape, opt, no_of_class)
model.fit_generator(
        generator=train_it,
        epochs=epochs,
        verbose=1,
        steps_per_epoch=train_it.n // train_it.batch_size,
        validation_data=validation_it,
        validation_steps=validation_it.n // validation_it.batch_size,
        )

ValueError: 检查目标时出错:预期dense_2 的形状为(2,),但得到的数组的形状为(1,)

一些输出

找到属于 2 个类别的 251 张图片。 找到属于 2 个类别的 108 个图像。 训练批次形状:(16, 224, 224, 3) 标签批次形状:(16,) 批次中的标签:[0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 1. 1. 0. 0. 1.] 验证批次形状:(1, 224, 224, 3) 标签批次形状:(1,) 批次中的标签:[0.] 输入形状:(224, 224, 3)

【问题讨论】:

    标签: python keras deep-learning


    【解决方案1】:

    我通过将 model.compile 中的 loss 设置为 'categorical_crossentropy' 和 class_mode 在 train 的 .flow_from_directory 和验证中设置为 'categorical' 解决了这个问题。

    【讨论】:

      猜你喜欢
      • 2019-02-15
      • 1970-01-01
      • 1970-01-01
      • 2020-10-28
      • 1970-01-01
      • 2019-05-26
      • 2021-04-12
      • 2020-03-06
      • 2017-07-22
      相关资源
      最近更新 更多