【问题标题】:Keras expected sequential_2 to have shape (None, 2) but got array with shape (32, 1)Keras 期望序列 2 的形状为 (None, 2) 但得到的数组形状为 (32, 1)
【发布时间】:2017-03-16 16:39:29
【问题描述】:

我已经使用预训练的 VGG16 构建了一个带有 keras 的模型

 model = Sequential()
model.add(ZeroPadding2D((1, 1), input_shape=(3, img_width, img_height)))

model.add(Convolution2D(64, 3, 3, activation='relu', name='conv1_1'))
model.add(ZeroPadding2D((1, 1)))
model.add(Convolution2D(64, 3, 3, activation='relu', name='conv1_2'))
model.add(MaxPooling2D((2, 2), strides=(2, 2)))

model.add(ZeroPadding2D((1, 1)))
model.add(Convolution2D(128, 3, 3, activation='relu', name='conv2_1'))
model.add(ZeroPadding2D((1, 1)))
model.add(Convolution2D(128, 3, 3, activation='relu', name='conv2_2'))
model.add(MaxPooling2D((2, 2), strides=(2, 2)))

model.add(ZeroPadding2D((1, 1)))
model.add(Convolution2D(256, 3, 3, activation='relu', name='conv3_1'))
model.add(ZeroPadding2D((1, 1)))
model.add(Convolution2D(256, 3, 3, activation='relu', name='conv3_2'))
model.add(ZeroPadding2D((1, 1)))
model.add(Convolution2D(256, 3, 3, activation='relu', name='conv3_3'))
model.add(MaxPooling2D((2, 2), strides=(2, 2)))

model.add(ZeroPadding2D((1, 1)))
model.add(Convolution2D(512, 3, 3, activation='relu', name='conv4_1'))
model.add(ZeroPadding2D((1, 1)))
model.add(Convolution2D(512, 3, 3, activation='relu', name='conv4_2'))
model.add(ZeroPadding2D((1, 1)))
model.add(Convolution2D(512, 3, 3, activation='relu', name='conv4_3'))
model.add(MaxPooling2D((2, 2), strides=(2, 2)))

model.add(ZeroPadding2D((1, 1)))
model.add(Convolution2D(512, 3, 3, activation='relu', name='conv5_1'))
model.add(ZeroPadding2D((1, 1)))
model.add(Convolution2D(512, 3, 3, activation='relu', name='conv5_2'))
model.add(ZeroPadding2D((1, 1)))
model.add(Convolution2D(512, 3, 3, activation='relu', name='conv5_3'))
model.add(MaxPooling2D((2, 2), strides=(2, 2)))

# load the weights of the VGG16 networks
# (trained on ImageNet, won the ILSVRC competition in 2014)
# note: when there is a complete match between your model definition
# and your weight savefile, you can simply call model.load_weights(filename)
assert os.path.exists(vgg_model), 'Model weights not found (see "weights_path" variable in script).'
f = h5py.File(vgg_model)
for k in range(f.attrs['nb_layers']):
    if k >= len(model.layers):
        # we don't look at the last (fully-connected) layers in the savefile
        break
    g = f['layer_{}'.format(k)]
    weights = [g['param_{}'.format(p)] for p in range(g.attrs['nb_params'])]
    model.layers[k].set_weights(weights)
f.close()
print('Model loaded.')

# build a classifier model to put on top of the convolutional model
top_model = Sequential()
top_model.add(Flatten(input_shape=model.output_shape[1:]))
top_model.add(Dense(256, activation='relu'))
top_model.add(Dropout(0.5))
top_model.add(Dense(2, activation='softmax'))

但是在使用 fit 函数运行模型时,它抛出了异常

expected sequential_2 to have shape (None, 2) but got array with shape (32, 1)

这里的问题是什么(注意:我使用目录函数的拟合来训练我的模型)。

【问题讨论】:

    标签: python keras


    【解决方案1】:

    您的问题在于flow_from_directory。您应该更改class_mode = "categorical"。此外 - 您的二进制分类设置并不常见。您应该将最后一层更改为:

    top_model.add(Dense(1, activation='sigmoid'))
    

    然后将您的 loss="binary_crossentropy"class_mode="binary" 留在您的生成器中,或者(在第二种情况下)离开:

    top_model.add(Dense(2, activation='softmax'))
    

    并在您的生成器中设置您的 loss="categorical_crossentropy"class_mode="categorical"

    【讨论】:

      【解决方案2】:

      问题在于您的训练标签。 很难给出确切的答案,因为您没有在这里向我们展示您拥有的标签类型和您所做的编译。

      我可以继续猜测您正在使用 binary_crossentropy 或 categorical_crossentropy 进行编译。

      如果我猜对了,让我们将您的标签称为“Y”,使用以下代码为训练做好准备:

      from keras.utils import np_utils
      Y = np_utils.to_categorical(Y)
      

      提示:当您进行二元分类(两个类别)时,您可以让最后一个密集层输出 1 而不是 2。在标签中,为一个类别选择 0,为另一个类别选择 1。这样你就可以避免你现在正在处理的问题。

      【讨论】:

      • 我根据 Y = np_utils.to_categorical(Y) 使用 binary_crossentrophy ,我直接从目录读取数据并使用flow from directroy function
      • 在这种情况下,只需按照我的提示将您的最后一个密集更改为:top_model.add(Dense(1, activation='softmax'))(1 而不是 2)
      • 我想知道标签的概率,这就是我实现softmax函数的原因
      • 您是否尝试将class_mode='categorical' 从目录函数添加到您的流程中?
      猜你喜欢
      • 2020-05-14
      • 2019-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-28
      • 1970-01-01
      • 2020-12-20
      • 1970-01-01
      相关资源
      最近更新 更多