Ошибка при проверке цели: ожидалось, что плотный_3 будет иметь 2 измерения, но получил массив с формой (5, 200, 200, 1)

Я только начал изучать Tensorflow (2.1.0) и Keras (2.3.7) с Python 3.7.7.

У меня такая сеть:

def vgg16(input_size = (224,224,3)):
    inputs = Input(input_size, name='input')

    conv1 = Conv2D(64, (3, 3), activation = 'relu', padding = 'same', name ='conv1_1')(inputs)
    conv1 = Conv2D(64, (3, 3), activation = 'relu', padding = 'same', name ='conv1_2')(conv1)
    pool1 = MaxPooling2D(pool_size = (2,2), strides = (2,2), name = 'pool_1')(conv1)

    conv2 = Conv2D(128, (3, 3), activation = 'relu', padding = 'same', name ='conv2_1')(pool1)
    conv2 = Conv2D(128, (3, 3), activation = 'relu', padding = 'same', name ='conv2_2')(conv2)
    pool2 = MaxPooling2D(pool_size = (2,2), strides = (2,2), name = 'pool_2')(conv2)

    conv3 = Conv2D(256, (3, 3), activation = 'relu', padding = 'same', name ='conv3_1')(pool2)
    conv3 = Conv2D(256, (3, 3), activation = 'relu', padding = 'same', name ='conv3_2')(conv3)
    conv3 = Conv2D(256, (3, 3), activation = 'relu', padding = 'same', name ='conv3_3')(conv3)
    pool3 = MaxPooling2D(pool_size = (2,2), strides = (2,2), name = 'pool_3')(conv3)

    conv4 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv4_1')(pool3)
    conv4 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv4_2')(conv4)
    conv4 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv4_3')(conv4)

    conv5 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv5_1')(pool4)
    conv5 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv5_2')(conv5)
    conv5 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv5_3')(conv5)
    pool5 = MaxPooling2D(pool_size = (2,2), strides = (2,2), name = 'pool_5')(conv5)    
    flatten = Flatten(name = 'flatten')(pool5)

    dense1 = Dense(units = 4096,activation = "relu", name = 'dense_1')(flatten)
    dense2 = Dense(units = 4096,activation = "relu", name = 'dense_2')(dense1)
    dense3 = Dense(units = 2, activation = "softmax", name = 'dense_3')(dense2)

    opt = Adam(lr=0.001)

    model = Model(inputs = inputs, outputs = dense3, name ='vgg-16')

    model.compile(optimizer=opt, loss=keras.losses.categorical_crossentropy, metrics=['accuracy'])

    return model

И это код, который его использует:

model = vgg16(input_size=(200, 200, 1))

for episode in range(num_episodes):
    selected = np.random.permutation(no_of_samples)[:num_shot + num_query]
    # Create our Support Set.
    support_set = np.array(D[selected[:num_shot]])
    # Create our Query Set.
    query_set = np.array(D[selected[num_query:]])

    X_train = support_set[:,0,:]
    y_train = support_set[:,1,:]

    X_valid = query_set[:,0,:]
    y_valid = query_set[:,1,:]

    results = model.fit(X_train, y_train, epochs=20, batch_size=5,
                        validation_data=(X_valid, y_valid))

X_train, y_train, X_valid и y_valid имеют такую ​​форму: (5, 200, 200, 1).

Но я получаю такую ​​ошибку:

Ошибка при проверке цели: ожидалось, что плотный_3 будет иметь 2 измерения, но получил массив с формой (5, 200, 200, 1)

Не понимаю почему. Я изменил вызов fit, удалив batch_size:

results = model.fit(X_train, y_train, epochs=20, validation_data=(X_valid, y_valid))

Но я получаю ту же ошибку:

Как исправить эту ошибку?

Возможно, проблема в том, что я использую изображения одного канала.

Краткое описание модели:

Model: "vgg-16"
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
input (InputLayer)           (None, 200, 200, 1)       0
_________________________________________________________________
conv1_1 (Conv2D)             (None, 200, 200, 64)      640
_________________________________________________________________
conv1_2 (Conv2D)             (None, 200, 200, 64)      36928
_________________________________________________________________
pool_1 (MaxPooling2D)        (None, 100, 100, 64)      0
_________________________________________________________________
conv2_1 (Conv2D)             (None, 100, 100, 128)     73856
_________________________________________________________________
conv2_2 (Conv2D)             (None, 100, 100, 128)     147584
_________________________________________________________________
pool_2 (MaxPooling2D)        (None, 50, 50, 128)       0
_________________________________________________________________
conv3_1 (Conv2D)             (None, 50, 50, 256)       295168
_________________________________________________________________
conv3_2 (Conv2D)             (None, 50, 50, 256)       590080
_________________________________________________________________
conv3_3 (Conv2D)             (None, 50, 50, 256)       590080
_________________________________________________________________
pool_3 (MaxPooling2D)        (None, 25, 25, 256)       0
_________________________________________________________________
conv4_1 (Conv2D)             (None, 25, 25, 512)       1180160
_________________________________________________________________
conv4_2 (Conv2D)             (None, 25, 25, 512)       2359808
_________________________________________________________________
conv4_3 (Conv2D)             (None, 25, 25, 512)       2359808
_________________________________________________________________
pool_4 (MaxPooling2D)        (None, 12, 12, 512)       0
_________________________________________________________________
conv5_1 (Conv2D)             (None, 12, 12, 512)       2359808
_________________________________________________________________
conv5_2 (Conv2D)             (None, 12, 12, 512)       2359808
_________________________________________________________________
conv5_3 (Conv2D)             (None, 12, 12, 512)       2359808
_________________________________________________________________
pool_5 (MaxPooling2D)        (None, 6, 6, 512)         0
_________________________________________________________________
flatten (Flatten)            (None, 18432)             0
_________________________________________________________________
dense_1 (Dense)              (None, 4096)              75501568
_________________________________________________________________
dense_2 (Dense)              (None, 4096)              16781312
_________________________________________________________________
dense_3 (Dense)              (None, 2)                 8194
=================================================================
Total params: 107,004,610
Trainable params: 107,004,610
Non-trainable params: 0
_________________________________________________________________

person VansFannel    schedule 30.05.2020    source источник
comment
Есть ли особая причина для того, чтобы каждый слой был дважды или это плохой копипаст?   -  person Commissar Vasili Karlovic    schedule 30.05.2020
comment
что вы пытаетесь предсказать? цель, которую вы пытаетесь предсказать, кажется изображениями   -  person Nicolas Gervais    schedule 30.05.2020
comment
@NicolasGervais Хорошо, я обнаружил свою ошибку: я пытаюсь использовать ее для семантической сегментации. И эта сеть этого не делает.   -  person VansFannel    schedule 30.05.2020


Ответы (2)


В ваших тренировочных данных есть 5, (200,200,1) изображения, это правильно, но целевые данные (y) должны быть 5 соответствующими метками с формой (2,). Итак, форма y_train должна быть (5,2). Сейчас у них неправильная форма.

person Frederik Bode    schedule 30.05.2020

X_train, y_train, X_valid и y_valid имеют такую ​​форму: (5, 200, 200,1).

Согласно сводке вашей сети

>> vvg16().summary()

Model: "vgg-16"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input (InputLayer)           [(None, 224, 224, 3)]     0         
_________________________________________________________________
conv1_1 (Conv2D)             (None, 224, 224, 64)      1792      
_________________________________________________________________
conv1_2 (Conv2D)             (None, 224, 224, 64)      36928     
_________________________________________________________________
pool_1 (MaxPooling2D)        (None, 112, 112, 64)      0         
_________________________________________________________________
conv2_1 (Conv2D)             (None, 112, 112, 128)     73856     
_________________________________________________________________
conv2_2 (Conv2D)             (None, 112, 112, 128)     147584    
_________________________________________________________________
pool_2 (MaxPooling2D)        (None, 56, 56, 128)       0         
_________________________________________________________________
conv3_1 (Conv2D)             (None, 56, 56, 256)       295168    
_________________________________________________________________
conv3_2 (Conv2D)             (None, 56, 56, 256)       590080    
_________________________________________________________________
conv3_3 (Conv2D)             (None, 56, 56, 256)       590080    
_________________________________________________________________
pool_3 (MaxPooling2D)        (None, 28, 28, 256)       0         
_________________________________________________________________
conv4_1 (Conv2D)             (None, 28, 28, 512)       1180160   
_________________________________________________________________
conv4_2 (Conv2D)             (None, 28, 28, 512)       2359808   
_________________________________________________________________
conv4_3 (Conv2D)             (None, 28, 28, 512)       2359808   
_________________________________________________________________
pool_4 (MaxPooling2D)        (None, 14, 14, 512)       0         
_________________________________________________________________
conv5_1 (Conv2D)             (None, 14, 14, 512)       2359808   
_________________________________________________________________
conv5_2 (Conv2D)             (None, 14, 14, 512)       2359808   
_________________________________________________________________
conv5_3 (Conv2D)             (None, 14, 14, 512)       2359808   
_________________________________________________________________
pool_5 (MaxPooling2D)        (None, 7, 7, 512)         0         
_________________________________________________________________
flatten (Flatten)            (None, 25088)             0         
_________________________________________________________________
dense_1 (Dense)              (None, 4096)              102764544 
_________________________________________________________________
dense_2 (Dense)              (None, 4096)              16781312  
_________________________________________________________________
dense_3 (Dense)              (None, 2)                 8194      
=================================================================
Total params: 134,268,738
Trainable params: 134,268,738
Non-trainable params: 0
_________________________________________________________________

Ваши X_train и X_valid должны иметь форму (224,224,3)
Ваши y_train и y_valid должны иметь общее 2 classes и быть закодированы одним нажатием из-за keras.losses.categorical_crossentropy


Редактировать:

Когда на выходе получается массив из N классов:

  1. последний слой должен быть Dense(N,"softmax")
  2. убыток должен быть keras.losses.sparse_categorical_crossentropy

Если на выходе используются классы N с горячим кодированием:

  1. если еще не закодировано, используйте keras.utils.to_categorical(array, N)
  2. последний слой должен быть Dense(N,"softmax")
  3. убыток должен быть keras.losses.categorical_crossentropy

Когда целью не является классификация:

  1. ваш последний слой должен иметь ту же форму
  2. вам нужно использовать правильную активацию
  3. вам не нужно использовать flatten
  4. проверьте autoencoder концепцию, чтобы увидеть, как вы можете получить результат, имеющий ту же форму, что и ваш ввод
person Commissar Vasili Karlovic    schedule 30.05.2020
comment
Нет, его input_size равен (200, 200, 1). Посмотрите на эту строку: model = vgg16(input_size=(200, 200, 1)). А может я тебя не понимаю. - person VansFannel; 30.05.2020
comment
@VansFannel, вы правы. Я использовал исходные значения вашей модели на тот случай, если кто-то еще прочитает этот ответ. - person Commissar Vasili Karlovic; 30.05.2020