Глубокое обучение Vgg16, почему моя модель не подходит? - PullRequest
0 голосов
/ 01 августа 2020

Я изучаю глубокое обучение. Я пробую переносное обучение, потому что использую модель vgg16. но я сталкиваюсь с error: Shapes (None, 1) and (None, 2) are incompatible. Не знаю, почему несовместимы. Помоги мне. извините, я плохо говорю на английском sh. но я хочу знать, почему ошибка. Мой код. Я уже знаю, что если я использую sigmod (активация), я могу классифицировать данные. но я хочу классифицировать три или более (собака, кошка, лошадь, мышь ...), поэтому я использую softmax. помогите мне.

ValueError: Shapes (None, 1) and (None, 2) are incompatible

В чем проблема?

    def save_bottlebeck_features():
    datagen = ImageDataGenerator(rescale=1. / 255)

    # build the VGG16 network
    model = applications.VGG16(include_top=False, weights='imagenet')

    generator = datagen.flow_from_directory(
        train_data_dir,
        target_size=(150, 150),
        batch_size=batch_size,
        class_mode='categorical',
        shuffle=False)

    bottleneck_features_train = model.predict_generator(
        generator)
    np.save('bottleneck_features_train.npy',bottleneck_features_train)

    generator = datagen.flow_from_directory(
        validation_data_dir,
        target_size=(150, 150),
        batch_size=batch_size,
        class_mode='categorical',
        shuffle=False)

    bottleneck_features_validation = model.predict_generator(
        generator)
  

    np.save('bottleneck_features_validation.npy',bottleneck_features_validation)
 

    def train_top_model():
    train_data = np.load('bottleneck_features_train.npy') 
    train_labels = np.array(
        [0] * 682 + [1] * 403) # dog: 682 cat : 403

    validation_data = np.load('bottleneck_features_validation.npy')
    validation_labels = np.array(
        [0] * 63 + [1] * 70 )

    model = Sequential()
    model.add(Flatten(input_shape=train_data.shape[1:]))
    model.add(Dense(256, activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(2, activation='softmax'))
    model.summary()

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

    model.fit(train_data, train_labels,
              epochs=epochs,
              steps_per_epoch=1000 // batch_size,
              validation_data=(validation_data, validation_labels))
    model.save_weights(top_model_weights_path)

1 Ответ

0 голосов
/ 03 августа 2020

Проблема в вашем случае заключается в том, что вы создали основную истину в форме [0] s и [1] s.

Однако вы используете функцию потерь, которая равна categorical_crossentropy, которая ожидает в данном случае ваши входные цели должны быть двумерным массивом (n классов => n измерений), а не одномерным. если изображение принадлежит коту и [1,0], если изображение - собака.

Однако вы кормите его только [0] и [1] вместо [0,1] или [1, 0].

Решение вашей проблемы:

  1. Либо преобразуйте ваши наземные метки истинности в [0,1] и [1,0] (подсказка: используйте tf.keras.utils.to_categorical() или keras.utils.to_categorical(), если вы используете простые keras.
  2. Используйте sparse_categorical_crossentropy в качестве функции потерь, что позволяет вам использовать простые целые числа, например 0,1,2,3, в качестве меток.
...