Классификация временных рядов по меткам Keras с учетом временных рядов в качестве вектора входного изображения - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь построить многоклассовый классификатор, используя Keras. Я не совсем уверен, что реализовал это правильно. Данные таковы

метка переменных временных рядов [0: 25728}

index 0  1   2   3   4            25728
  0   1  2.5 3.2 1.6 1.05 ........ 2.54
  1   5  3.2 1.6 1.5 1.49 ........ 1.41
  2   1  2.3 3.2 1.5 1.52 ........ 2.11
  3   3  0.2 3.1 1.5 1.89 ........ 0.81
  4   8  1.2 1.1 0.2 1.19 ........ 3.71
  .   5  .    .   .   .   ........   .
  .   7  .    .   .   .   ........   .
1323  5  .    .   .   .   ........   .

Вот код. Я разделяю данные на 68%, а затем преобразую 1D массив в 2D массив. как 384 * 67 = 25728 Так образуется изображение вектора 384 на 67 для одной метки

x_train =x_train.reshape(x_train.shape[0],384,67)
x_test =x_test.reshape(x_test.shape[0],384,67)

train_label_y = df_train_y[2].values
test_label_y = df_test_y[2].values

train_Y = np.array(train_label_y[:], dtype=int)
test_Y  = np.array(test_label_y[:], dtype=int)

Y_train = convert_to_one_hot(train_Y, C = 8)
Y_test  = convert_to_one_hot(test_Y,  C = 8)

x_train = x_train.reshape(x_train.shape + (1,))
x_test = x_test.reshape(x_test.shape + (1,))

input_shape = x_train.shape[1:]
model = Sequential()
model.add(Conv2D(2, kernel_size=(3, 3), padding='same', input_shape=input_shape))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(64, kernel_size=(3, 3), padding='same'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(128, kernel_size=(3, 3), padding='same'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(8, kernel_size=(3, 3), padding='same'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(GlobalAveragePooling2D())
model.add(Dense(8, activation='sigmoid'))

model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
hist = model.fit(x_train, Y_train, batch_size=batch_size, epochs=nb_epochs, verbose=1)
score = model.evaluate(x_test, Y_test)
print("Accuracy: %.2f%%" % (score[1] * 100))

Это дает точность 96,16%, но я не верю, что это правда. Я хочу предсказать этикетки.

  1. Как я могу предсказать метки?
  2. Что я делаю не так?

Пожалуйста, помогите! Спасибо.

1 Ответ

0 голосов
/ 05 апреля 2019

Причина, по которой вы получаете странные результаты, заключается в том, что вы должны использовать активацию softmax в вашем последнем слое.

...