Модель Python 1D CNN - Ошибка в model.fit()
Я пытаюсь построить одномерную модель CNN, обрабатывая сигналы ЭКГ для диагностики апноэ во сне.
Я использую библиотеку sklearn и обнаружил ошибку в train_test_split
. Вот мой код:
# loading the file
with open("ApneaData.csv") as csvDataFile:
csvReader = csv.reader(csvDataFile)
for line in csvReader:
lis.append(line[0].split()) # create a list of lists
# making a list of all x-variables
for i in range(1, len(lis)):
data.append(list(map(int, lis[i])))
# a list of all y-variables (either 0 or 1)
target = Extract(data) # sleep apn or not
# converting to numpy arrays
data = np.array(data)
target = np.array(target)
# stacking data into 3D
loaded = dstack(data)
change = dstack(target)
trainX, testX, trainy, testy = train_test_split(loaded, change, test_size=0.3)
# the model
verbose, epochs, batch_size = 0, 10, 32
n_timesteps, n_features, n_outputs = trainX.shape[0], trainX.shape[1], trainy.shape[0]
model = Sequential()
model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(n_timesteps,n_features)))
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(n_outputs, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
# fitting the model
model.fit(trainX, trainy, epochs=epochs, batch_size=batch_size, verbose=verbose)
# evaluate model
_, accuracy = model.evaluate(testX, testy, batch_size=batch_size, verbose=0)
Я получаю сообщение об ошибке:
ValueError: Error when checking input: expected conv1d_15_input to have shape (11627, 6001) but got array with shape (6001, 1)
Я не понимаю, что делаю не так? Любая помощь приветствуется.
2 ответа
Первый,
# a list of all y-variables (either 0 or 1)
target = Extract(data) # sleep apn or not
Это предполагает, что вы выполняете двоичную классификацию, и, похоже, вы не применили однократное кодирование. Итак, ваш последний слой должен быть сигмовидным.
первое измерение обозначает количество образцов. Так,trainX = tranX.reshape(trainX.shape[0], trainX.shape[1], -1)
(добавьте третье измерение, если его еще нет)
n_timesteps, n_features, n_outputs = trainX.shape[1], trainX.shape[2], 1
Наконец, смените свою модель.
model.add(Dense(n_outputs, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
Я думаю, что n_timesteps и n_features должны иметь форму [1] и shape[2], первое измерение - это ваше количество образцов.