Ошибка при проверке ввода: ожидалось, что conv1d_57_input будет иметь 3 измерения, но получил массив с формой (152, 64) - PullRequest
1 голос
/ 25 февраля 2020

Я получаю эту ошибку:

ValueError: Ошибка при проверке ввода: ожидалось, что conv1d_57_input имеет 3 измерения, но получил массив с формой (152, 64).

Мой код:

model = Sequential()

model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(152,64)))
model.add(Conv1D(filters=64, kernel_size=3, activation='relu'))
model.add(Dropout(0.5))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(4, activation='softmax'))

model.summary()

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

history = model.fit(trainingMatrix, labelTraining, validation_data=(validationMatrix, labelValidation), epochs=3)

Описание переменной:

trainingMatrix.shape = (152,64); Линии связаны с образцами и столбцами с элементами.

Это проблема изменения формы?

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

Я внес следующие изменения:

trainingMatrix = np.expand_dims(trainingMatrix, axis=3)
validationMatrix = np.expand_dims(validationMatrix, axis=3)

model = Sequential()
model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(64,1)))
model.add(Conv1D(filters=64, kernel_size=3, activation='relu'))
model.add(Dropout(0.5))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(4, activation='softmax'))
model.summary()

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

history = model.fit(trainingMatrix, labelTraining, validation_data=(validationMatrix, labelValidation), epochs=3)

Я получаю эту новую ошибку: Ошибка при проверке цели: ожидалось, что плотность_1 имеет форму (1,), но получил массив с формой (4,)

Мое резюме:

_________________________________________________________________
Layer (type)                 Output Shape              Param    
=================================================================
conv1d_51 (Conv1D)           (None, 62, 64)            256       
_________________________________________________________________
conv1d_52 (Conv1D)           (None, 60, 64)            12352     
_________________________________________________________________
dropout_15 (Dropout)         (None, 60, 64)            0         
_________________________________________________________________
max_pooling1d_15 (MaxPooling (None, 30, 64)            0         
_________________________________________________________________
flatten_16 (Flatten)         (None, 1920)              0         
_________________________________________________________________
dense_27 (Dense)             (None, 100)               192100    
_________________________________________________________________
dense_28 (Dense)             (None, 4)                 404       
=================================================================
Total params: 205,112
Trainable params: 205,112
Non-trainable params: 0

Новый код и новая ошибка:

trainingMatrix = np.expand_dims(trainingMatrix, axis=0)
validationMatrix = np.expand_dims(validationMatrix, axis=0)

model = Sequential()

model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(152,64,1)))
model.add(Conv1D(filters=64, kernel_size=3, activation='relu'))
model.add(Dropout(0.5))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(4, activation='softmax'))
model.summary()

ValueError: Вход 0 несовместим со слоем conv1d_57: ожидаемый ndim = 3, найденный ndim = 4

Приведенное ниже решение работает, но частота попаданий слишком низкая Кто-нибудь рекомендует конфигурацию для улучшения? Я не достигаю более 20% точности. (используя MLP я получил 90%)

trainingMatrix = np.expand_dims(trainingMatrix, axis=3)
validationMatrix = np.expand_dims(validationMatrix, axis=3)

model = Sequential()

model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(64,1)))
model.add(Conv1D(filters=64, kernel_size=3, activation='relu'))
model.add(Dropout(0.5))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(4, activation='softmax'))

model.summary()

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

history = model.fit(trainingMatrix, labelTraining, validation_data=(validationMatrix, labelValidation), epochs=1000)

Мой лейбл Обучение:

1 0 0 0
1 0 0 0
...
0 1 0 0
0 1 0 0
...
0 0 0 1

Это нормально?

Ответы [ 2 ]

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

sparse_categorical_crossentropy & categoryorical_crossentropy

sparse_categorical_crossentropy:

используется, когда целевой столбец содержит значение нескольких меток и имеет один целевой столбец {It средняя метка может быть больше 1}

categoryor__crossentropy

используется, когда target col содержит значение mutilabel и имеет muti target col { это означает, что каждое целевое значение col является двоичным.

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

Спасибо всем за помощь. Следует коду, работающему с точностью 97%.

trainingMatrix = np.expand_dims(trainingMatrix, axis=3)
validationMatrix = np.expand_dims(validationMatrix, axis=3)

model = Sequential()

model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(64,1)))
model.add(Conv1D(filters=64, kernel_size=3, activation='relu'))
model.add(Flatten())
model.add(Dense(4, activation='softmax'))

model.summary()

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

history = model.fit(trainingMatrix, labelTraining, batch_size=batchSize, epochs=epochs, verbose=1, validation_data=(validationMatrix, labelValidation))
...