【问题标题】:Keras does not mach model with classesKeras 不将模型与类匹配
【发布时间】:2018-01-26 22:40:30
【问题描述】:

我是 Keras 的新手,我正在尝试创建一个神经网络来识别 38 个案例。我创建了这样一个模型,但它不起作用。我认为最后一层有问题。我检查了摘要,看起来最后一层的输出应该是 38。有人可以帮我完成它吗?

我的代码是:

model = Sequential()
model.add(Convolution2D(16, 5, 5, border_mode='valid', input_shape=(168, 192, 3)) )
model.add( Activation('relu') )
model.add( MaxPooling2D(2,2) )
model.add( Convolution2D(16, 5, 5) )
model.add( Activation('relu') )
model.add( MaxPooling2D(2,2) )
model.add( Flatten() ) 
model.add( Dense(512, activation='relu'))
model.add(Dense(38, activation='softmax'))

model.compile(loss='categorical_crossentropy',optimizer=adam(0.001),metrics=['accuracy'])


train_datagen = ImageDataGenerator(
        rescale=1./255,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True)

test_datagen = ImageDataGenerator(rescale=1./255)


train_data_dir = 'data/train'
validation_data_dir = 'data/validation'

train_datagen = ImageDataGenerator(
        rescale=1./255,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True)

test_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
        'data/train',
        target_size=(168, 192),
        batch_size=38,
        class_mode='binary')

validation_generator = test_datagen.flow_from_directory(
        'data/validation',
         target_size=(168, 192),
        batch_size=38,
        class_mode='binary')


model.fit_generator(
        train_generator,
        steps_per_epoch=2000,
        epochs=10,
        validation_data=validation_generator,
        validation_steps=800)

错误看起来像:

ValueError: Error when checking target: expected dense_129 to have shape (None, 38) but got array with shape (38, 1)

【问题讨论】:

  • 尝试将loss改成sparse_categorical_crossentropy

标签: neural-network keras keras-layer neuroscience


【解决方案1】:

根据from_from_directory 的 Keras 文档,指定目录(在您的情况下为“data/train”)每个类应包含一个子目录

由于错误表明模型正在获取一个形状为 (38, 1) 的数组,这意味着您没有 38 个包含 data/train 的文件夹。 (请注意不要混淆前 38 维是批量大小,巧合的是,您已将其设置为与类数相同,但并非必须如此)。

因此,您应该将子文件夹重新排列为每个子文件夹一个类,或者手动加载数据,然后从内存中流出。

【讨论】:

  • 我想检查有关批量大小的信息,并在两个地方都将其值更改为 32。结果我收到了类似的问题: ValueError: Error when checks target: expected dense_131 to have shape (None, 38) but got array with shape (32, 1) 另外,我检查了数据/火车中文件的结构,有 38每个文件夹大约有 44 个文件。通过重新排列你的意思是创建一个文件夹或者我应该怎么做?
  • 我检查过了,但他们的最后一层包含 1 个输出节点,而我想要 38,当我将其更改为 38 时,问题又出现了
  • 更改 class_mode='categorical' 以获取生成器的参数。这应该会有所帮助。
猜你喜欢
  • 1970-01-01
  • 2022-07-08
  • 2017-06-26
  • 2020-11-15
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
  • 2019-06-28
  • 1970-01-01
相关资源
最近更新 更多