Ошибка при проверке цели: ожидается 3 измерения, но получен массив с формой (32, 6) - PullRequest
0 голосов
/ 27 февраля 2020

Я работаю над повторным назначением классификатора сигналов.

Мои генераторы поездов и проверки подают в модель пакетные массивы [32, 3000, 1] (32 сигнала, 3000 временных шагов, сглаживание). basic_model кодирует каждый сигнал в вектор 1D вектора, прежде чем seq_model отобразит этот вектор в класс.

Чтобы получить представление об архитектуре, код для построения модели приведен ниже.

def basic_model():
    inp = Input(shape= (3000, 1))
    img_1 = Convolution1D(16, kernel_size=5, activation=activations.relu, padding="valid")(inp)
    img_1 = Convolution1D(16, kernel_size=5, activation=activations.relu, padding="valid")(img_1)
    img_1 = MaxPool1D(pool_size=2)(img_1)
    img_1 = SpatialDropout1D(rate=0.01)(img_1)
    img_1 = Convolution1D(32, kernel_size=3, activation=activations.relu, padding="valid")(img_1)
    img_1 = Convolution1D(32, kernel_size=3, activation=activations.relu, padding="valid")(img_1)
    img_1 = MaxPool1D(pool_size=2)(img_1)
    img_1 = SpatialDropout1D(rate=0.01)(img_1)
    img_1 = Convolution1D(32, kernel_size=3, activation=activations.relu, padding="valid")(img_1)
    img_1 = Convolution1D(32, kernel_size=3, activation=activations.relu, padding="valid")(img_1)
    img_1 = MaxPool1D(pool_size=2)(img_1)
    img_1 = SpatialDropout1D(rate=0.01)(img_1)
    img_1 = Convolution1D(256, kernel_size=3, activation=activations.relu, padding="valid")(img_1)
    img_1 = Convolution1D(256, kernel_size=3, activation=activations.relu, padding="valid")(img_1)
    img_1 = GlobalMaxPool1D()(img_1)
    img_1 = Dropout(rate=0.01)(img_1)

    dense_1 = Dropout(0.01)(Dense(64, activation=activations.relu, name="dense_1")(img_1)) # Last layer in basic_model gives Outputshape (None, 64)

    base_model = models.Model(inputs=inp, outputs=dense_1)
    opt = optimizers.Adam(0.001)

    base_model.compile(optimizer=opt, loss=losses.sparse_categorical_crossentropy, metrics=['acc'])
    #base_model.summary()
    return base_model


def seq_model():
    nclass = 6

    seq_input = Input(shape=(None, 3000, 1))
    base_model = basic_model()

    encoded_sequence = TimeDistributed(base_model)(seq_input)  #Input shapes (0,64) (None, 3000, 1)
    encoded_sequence = SpatialDropout1D(rate=0.01)(Convolution1D(128,
                                                               kernel_size=3,
                                                               activation="relu",
                                                               padding="same")(encoded_sequence))
    encoded_sequence = Dropout(rate=0.05)(Convolution1D(128,
                                                               kernel_size=3,
                                                               activation="relu",
                                                               padding="same")(encoded_sequence))   
    #out = TimeDistributed(Dense(nclass, activation="softmax"))(encoded_sequence)
    out = Convolution1D(nclass, kernel_size=3, activation="softmax", padding="same")(encoded_sequence)

    model = models.Model(seq_input, out)

    model.compile(optimizers.Adam(0.001), losses.sparse_categorical_crossentropy, metrics=['acc'])
    model.summary()
    return model

model = seq_model()

batch_size = 32 
EPOCHS = 25

ch_model = model.fit_generator(generator(X_train, y_train, batch_size), steps_per_epoch= (X_train.shape[0]//batch_size, epochs = EPOCHS,
                               validation_data= validation_generator(X_val, y_val, batch_size),
                               validation_steps=(X_val.shape[0] // batch_size), shuffle=True)

Запуск этого кода дает ошибку:

ValueError: Error when checking input: expected input_1 to have 4 dimensions, but got array with shape (32, 3000, 1)

Проверка model.summary () - input_23(InputLayer) Output shape: (None, None, 3000, 1). Пытаясь изменить seq_input на Input(shape=(3000,1)), я получаю ошибку "Input tensor must be of rank 3, 4 or 5 but was 2". Таким образом, 1 Ни один не используется для выполнения требования к тензорному рангу, а из документации другой по существу является заполнителем для размера партии.

Узнав об этом, я попытался изменить форму тренировок от генераторов. Я сделал это с помощью X_train = np.expand_dims(X_train, axis=0), чтобы получить входной массив [1,32,3000,1].

Это дало мне почти через модель, но я получаю сообщение об ошибке Error when checking target: expected conv1d_161 to have 3 dimensions, but got array with shape (32, 6). ( conv1d_161 - это выходной слой seq_model. )

Мой вопрос: как мне отформатировать мои пакетные массивы для работы с этой настройкой? Следуя дальше, какой размер мне не хватает?

Спасибо за ваше время:)

1 Ответ

0 голосов
/ 27 февраля 2020

В вашей basic_model вы возвращаете base_model, которая к тому времени была ничем. вы должны вернуть basic_model .
проверить оператор возврата функции basic_model ()

еще одну вещь, попробуйте использовать другое имя, которое вы создали функция basic_model, внутри которой вы снова пишете basic_model = models.Model (входные данные = входные, выходные данные = плотность_1) .

редактирование для второго выпуска.

см. Ваш вывод модели basi c в конце имеет форму (None, 64)

Model: "model_3"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_7 (InputLayer)         [(None, 3000, 1)]         0         
_________________________________________________________________
conv1d_40 (Conv1D)           (None, 2996, 16)          96        
_________________________________________________________________
conv1d_41 (Conv1D)           (None, 2992, 16)          1296      
_________________________________________________________________
max_pooling1d_15 (MaxPooling (None, 1496, 16)          0         
_________________________________________________________________
spatial_dropout1d_15 (Spatia (None, 1496, 16)          0         
_________________________________________________________________
conv1d_42 (Conv1D)           (None, 1494, 32)          1568      
_________________________________________________________________
conv1d_43 (Conv1D)           (None, 1492, 32)          3104      
_________________________________________________________________
max_pooling1d_16 (MaxPooling (None, 746, 32)           0         
_________________________________________________________________
spatial_dropout1d_16 (Spatia (None, 746, 32)           0         
_________________________________________________________________
conv1d_44 (Conv1D)           (None, 744, 32)           3104      
_________________________________________________________________
conv1d_45 (Conv1D)           (None, 742, 32)           3104      
_________________________________________________________________
max_pooling1d_17 (MaxPooling (None, 371, 32)           0         
_________________________________________________________________
spatial_dropout1d_17 (Spatia (None, 371, 32)           0         
_________________________________________________________________
conv1d_46 (Conv1D)           (None, 369, 256)          24832     
_________________________________________________________________
conv1d_47 (Conv1D)           (None, 367, 256)          196864    
_________________________________________________________________
global_max_pooling1d_5 (Glob (None, 256)               0         
_________________________________________________________________
dropout_10 (Dropout)         (None, 256)               0         
_________________________________________________________________
dense_1 (Dense)              (None, 64)                16448     
_________________________________________________________________
dropout_11 (Dropout)         (None, 64)                0         
=================================================================
Total params: 250,416
Trainable params: 250,416
Non-trainable params: 0
_________________________________________

смотрите на seq_model,

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_10 (InputLayer)        [(None, None, 3000, 1)]   0         
_________________________________________________________________
time_distributed_1 (TimeDist (None, None, 64)          250416    
_________________________________________________________________
conv1d_67 (Conv1D)           (None, None, 128)         24704     
_________________________________________________________________
spatial_dropout1d_25 (Spatia (None, None, 128)         0         
_________________________________________________________________
conv1d_68 (Conv1D)           (None, None, 128)         49280     
_________________________________________________________________
dropout_17 (Dropout)         (None, None, 128)         0         
_________________________________________________________________
conv1d_69 (Conv1D)           (None, None, 6)           2310      
=================================================================
Total params: 326,710
Trainable params: 326,710
Non-trainable params: 0
_________________________________________________________________

ваша модель последовательности ожидает входную форму (None, 3000, 1) (см. В модели seq), но вы передаете ввод как (None, 64) (который является выходом модели basi c), и я не вижу никакого преобразования формы вывода модели basi c, выровненной по входу seq_model, отсюда и проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...