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

вопрос создан в Thu, May 2, 2019 12:00 AM

У меня есть набор данных размером 28x28. Массив точек данных x имеет форму (10000, 28, 28), массив меток y имеет форму (10000,).
Следующий код:

x = x.reshape(-1, 28, 28, 1)
model = Sequential([
    Conv2D(8, kernel_size=(3, 3), padding="same", activation=tf.nn.relu, input_shape=(28, 28, 1)),
    Dense(64, activation=tf.nn.relu),
    Dense(64, activation=tf.nn.relu),
    Dense(10, activation=tf.nn.softmax)
])
model.compile(
    optimizer='adam',
    loss='sparse_categorical_crossentropy',
    metrics=['accuracy']
)
model.fit(x, y, epochs=5) #error

дает:

ValueError: Error when checking target: expected dense_3 to have 4 dimensions, but got array with shape (10000, 1)

model.summary():

Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 28, 28, 8)         80        
_________________________________________________________________
dense_1 (Dense)              (None, 28, 28, 64)        576       
_________________________________________________________________
dense_2 (Dense)              (None, 28, 28, 64)        4160      
_________________________________________________________________
dense_3 (Dense)              (None, 28, 28, 10)        650       
=================================================================
Total params: 5,466
Trainable params: 5,466
Non-trainable params: 0
_________________________________________________________________
    
1
  1. Вы должны добавить слой Flatten после свертки и быстро кодировать свой y
    2019-05-02 15: 05: 51Z
  2. Они используют sparse_categorical_crossentropy, который требует целочисленных целей.
    2019-05-02 15: 09: 15Z
2 ответа                              2                         

Вы забыли добавить слой Flatten() (keras.layers.Flatten()):

model = Sequential([
    Conv2D(8, kernel_size=(3, 3), padding="same", activation=tf.nn.relu, input_shape=(28, 28, 1)),
    Flatten(),
    Dense(64, activation=tf.nn.relu),
    Dense(64, activation=tf.nn.relu),
    Dense(10, activation=tf.nn.softmax)
])
    
3
2019-05-02 15: 05: 41Z

Ваш вывод является трехмерным, а ваша цель - одномерной. Скорее всего, вам не хватает слоя Flatten после слоя Con2D, что приведет к уменьшению вывода свертки до одного измерения:

from keras.models import Sequential
from keras.layers import Conv2D, Dense, Flatten

# Fake data
import numpy as np
x = np.ones((10000, 28, 28))
y = np.ones((10000,))

x = x.reshape(-1, 28, 28, 1)
model = Sequential([
    Conv2D(8, kernel_size=(3, 3), padding="same", activation="relu", input_shape=(28, 28, 1)),
    Flatten(),
    Dense(64, activation="relu"),
    Dense(64, activation="relu"),
    Dense(10, activation="softmax")
])

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

model.summary()
model.fit(x, y, epochs=1)

Тогда размеры правильные:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 28, 28, 8)         80        
_________________________________________________________________
flatten_1 (Flatten)          (None, 6272)              0         
_________________________________________________________________
dense_1 (Dense)              (None, 64)                401472    
_________________________________________________________________
dense_2 (Dense)              (None, 64)                4160      
_________________________________________________________________
dense_3 (Dense)              (None, 10)                650       
=================================================================
Total params: 406,362
Trainable params: 406,362
Non-trainable params: 0
    
1
2019-05-02 15: 08: 35Z
источник размещен Вот