Простая одномерная свертка с Keras

машинное обучение Нейронные сети NLP

Помните, что мы говорили раньше1DПрименение свертки при обработке естественного языка:

Тем не менее, голоса читателей о том, как применять одномерную свертку, слишком высоки.Дэвиду 9 нужно использовать другую статью, чтобы рассказать о реальной битве с одномерной сверткой. На этот раз мыВозьмем в качестве примера проблему прогнозирования классификации листьев на kaggle., объясняя, как реализуются одномерные сверточные сети.

Мой набор данных взят из:Woohoo.Карта реформированная.com/Alexander…

Если вам лень переходить по исходной ссылке для загрузки, вы можете напрямую перейти по следующей ссылке:

 train.csv test.csv 

train.csv — это набор данных для обучения, а test.csv — набор данных для проверки. Этот набор данных представляет собой проблему классификации видов листьев, стри канала, 64 бита на канал, один канал представляетГраничные особенности, канал, представляющийособенность формы, последний канал представляетХарактеристики материала. (Эти функции уже извлечены для вас kaggle). Результатом является предсказание меток конечных объектов.

Не будем нести чушь, сразу к коду и подробным комментариям (Доступен профессиональный тест):

  1. # -*- coding: utf-8 -*-
  2. # Импорт некоторых базовых библиотек
  3. import numpy as np
  4. import pandas as pd
  5. # LabelEncoder используется для кодирования выходной метки
  6. from sklearn.preprocessing import LabelEncoder
  7. from sklearn.preprocessing import StandardScaler
  8. # StratifiedShuffleSplit можно использовать для перемешивания набора данных и разделения его на наборы для обучения и проверки.
  9. from sklearn.model_selection import StratifiedShuffleSplit
  10. # Мы используем версию Keras 2.0.1.
  11. from keras.models import Sequential
  12. from keras.layers import Dense, Activation, Flatten, Convolution1D, Dropout
  13. from keras.optimizers import SGD
  14. from keras.utils import np_utils
  15. # Этот набор данных представляет собой проблему классификации видов листьев с тремя каналами,
  16. # 64 бита на канал, один канал представляет граничные элементы, один канал представляет элементы формы, а последний канал представляет элементы материала,
  17. # вывод - это предсказание меток листовых функций
  18. train = pd.read_csv('./train.csv')
  19. test = pd.read_csv('./test.csv')
  20. def encode(train, test):
  21. # Используйте LabelEncoder для кодирования метки типа листа, объект меток представляет собой список меток в обучающем наборе
  22. label_encoder = LabelEncoder().fit(train.species)
  23. labels = label_encoder.transform(train.species)
  24. classes = list(label_encoder.classes_)
  25. # Удалите здесь ненужные столбцы обучающего набора и тестового набора
  26. train = train.drop(['species', 'id'], axis=1)
  27. test = test.drop('id', axis=1)
  28. return train, labels, test, classes
  29. train, labels, test, classes = encode(train, test)
  30. # Это просто собственные значения нормализованного обучающего набора
  31. scaler = StandardScaler().fit(train.values)
  32. scaled_train = scaler.transform(train.values)
  33. # Разделить набор данных на обучающий набор и тестовый набор, на тестовый набор приходится 10%
  34. sss = StratifiedShuffleSplit(test_size=0.1, random_state=23)
  35. for train_index, valid_index in sss.split(scaled_train, labels):
  36. X_train, X_valid = scaled_train[train_index], scaled_train[valid_index]
  37. y_train, y_valid = labels[train_index], labels[valid_index]
  38. # Размер каждого входного канала 64 бита, всего 3 канала
  39. nb_features = 64
  40. nb_class = len(classes)
  41. # Преобразуйте входной набор данных в формат, который нравится Керасу: (количество выборок, размер канала, количество каналов)
  42. X_train_r = np.zeros((len(X_train), nb_features, 3))
  43. # Подход здесь состоит в том, чтобы инициализировать все элементы равными 0, а затем прямо сейчас присвоить данные в наборе данных.
  44. X_train_r[:, :, 0] = X_train[:, :nb_features]
  45. X_train_r[:, :, 1] = X_train[:, nb_features:128]
  46. X_train_r[:, :, 2] = X_train[:, 128:]
  47. # Набор проверки также должен быть изменен
  48. X_valid_r = np.zeros((len(X_valid), nb_features, 3))
  49. X_valid_r[:, :, 0] = X_valid[:, :nb_features]
  50. X_valid_r[:, :, 1] = X_valid[:, nb_features:128]
  51. X_valid_r[:, :, 2] = X_valid[:, 128:]
  52. # Ниже приведена реализация Keras для одномерной свертки.Первоначальный автор попытался добавить несколько слоев свертки.
  53. # Результат не улучшает точность, возможно потому, что информации его одиночного канала слишком мало, а сеть со слишком большой глубиной для него не подходит
  54. model = Sequential()
  55. # Одномерный слой свертки использует 512 ядер свертки, а входные данные имеют формат 64*3.
  56. # Здесь следует отметить, что одномерная свертка означает, что ядро ​​свертки одномерно, а не то, что вход свертки одномерен, а 1-мерность относится к методу свертки
  57. model.add(Convolution1D(nb_filter=512, filter_length=1, input_shape=(nb_features, 3)))
  58. model.add(Activation('relu'))
  59. model.add(Flatten())
  60. model.add(Dropout(0.4))
  61. model.add(Dense(2048, activation='relu'))
  62. model.add(Dense(1024, activation='relu'))
  63. model.add(Dense(nb_class))
  64. # softmax часто используется для задач классификации нескольких классов
  65. model.add(Activation('softmax'))
  66. y_train = np_utils.to_categorical(y_train, nb_class)
  67. y_valid = np_utils.to_categorical(y_valid, nb_class)
  68. sgd = SGD(lr=0.01, nesterov=True, decay=1e-6, momentum=0.9)
  69. model.compile(loss='categorical_crossentropy',optimizer=sgd,metrics=['accuracy'])
  70. model.summary()
  71. nb_epoch = 15
  72. model.fit(X_train_r, y_train, nb_epoch=nb_epoch, validation_data=(X_valid_r, y_valid), batch_size=16)

Вот выходная ссылка для сводки модели:

  1. Layer (type) Output Shape Param #
  2. =================================================================
  3. conv1d_1 (Conv1D) (None, 64, 512) 2048
  4. _________________________________________________________________
  5. activation_1 (Activation) (None, 64, 512) 0
  6. _________________________________________________________________
  7. flatten_1 (Flatten) (None, 32768) 0
  8. _________________________________________________________________
  9. dropout_1 (Dropout) (None, 32768) 0
  10. _________________________________________________________________
  11. dense_1 (Dense) (None, 2048) 67110912
  12. _________________________________________________________________
  13. dense_2 (Dense) (None, 1024) 2098176
  14. _________________________________________________________________
  15. dense_3 (Dense) (None, 99) 101475
  16. _________________________________________________________________
  17. activation_2 (Activation) (None, 99) 0
  18. =================================================================
  19. Total params: 69,312,611.0
  20. Trainable params: 69,312,611.0
  21. Non-trainable params: 0.0

 

использованная литература:

  1. Woohoo.Карта реформированная.com/Alexander…

Этот документ принимаетАтрибуция — Некоммерческое использование — Без производных инструментов 3.0 Лицензионное соглашение для материкового КитаяЛицензия. Авторские права принадлежат оригиналу "Блог Дэвида 9", если вам нужно перепечатать, пожалуйста, свяжитесь с WeChat: david9ml или по электронной почте: yanchao727@gmail.com

Или отсканируйте QR-код напрямую:

Будь первым, кто лайкнетThe following two tabs change content below.

    David 9

    Электронная почта: yanchao727@gmail.com WeChat: david9ml