Я строю модель NN, используя керасы и тензорный поток для двоичной классификации по временным рядам. Вот так выглядит мой вклад в форме (124,4591):
| Col 1 | Col 2 | Col 3 | Col 4 |
Row 1 | [x1, ..., x591] | [x1, ..., x591] | [x1, ..., x591] | [x1, ..., x591] |
Row 2 | [x1, ..., x591] | [x1, ..., x591] | [x1, ..., x591] | [x1, ..., x591] |
Row 3 | [x1, ..., x591] | [x1, ..., x591] | [x1, ..., x591] | [x1, ..., x591] |
Я разделил свои данные на X_train
, X_test
, y_train
и y_test
. Я также закодировал свои метки из ['True', 'False']
в [0, 1]
, используя LabelEncoder()
и OneHotEncoder()
.
x = np.stack((np.vstack(x[:,0]),np.vstack(x[:,1]),np.vstack(x[:,2]),np.vstack(x[:,3])))
x = x.reshape((124,4,591))
y = table_raw_ptpt['Binding Known']
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 0)
X_train.shape
возвращает (86, 4, 591) .
Кодировка для этикеток:
label_encoder = LabelEncoder()
integer_encoded_train = label_encoder.fit_transform(array(y_train))
integer_encoded_test = label_encoder.fit_transform(array(y_test))
onehot_encoded_y_train = OneHotEncoder(sparse=False)
integer_encoded_train = integer_encoded_train.reshape(len(integer_encoded_train), 1)
onehot_encoded_y_train = onehot_encoded_y_train.fit_transform(integer_encoded_train)
onehot_encoded_y_test = OneHotEncoder(sparse=False)
integer_encoded_test = integer_encoded_test.reshape(len(integer_encoded_test), 1)
onehot_encoded_y_test = onehot_encoded_y_test.fit_transform(integer_encoded_test)
onehot_encoded_y_train.shape
возвращает (86, 2) .
Вот мой NN:
model = Sequential()
model.add(Dense(86, activation='relu', input_shape=(4,591)))
model.add(Dense(43, activation='relu'))
model.add(Dense(20, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss = 'binary_crossentropy',
optimizer = 'adam',
metrics = ['accuracy'])
model.summary()
Это работает. Но когда я пытаюсь соответствовать X_train, я получаю ошибку:
Ошибка при проверке цели: ожидается, что dens_227 будет иметь форму (1,), но
получил массив с формой (2,)
Упомянутый слой является выходным слоем. Насколько я понял, форма вывода неверна. Я попытался использовать Flattern()
между слоями, и даже попытался Reshape(1,)
. Но так как я новичок в этом, я не до конца понимаю, что мне нужно добавить, чтобы контролировать свою форму данных в NN, чтобы получить нужный мне вывод.
Мне удалось заставить его работать с softmax
, но мне нужно, чтобы sigmoid
тоже работал, чтобы потом можно было получить окончательный прогноз (True или False / 1 или 0).
Спасибо.