Вопрос или проблема
Я безуспешно пытался в течение последнего месяца запустить CNN. Ранее я пробовал PyTorch без успеха и теперь пытаюсь использовать Tensorflow, так как он кажется проще. У меня есть смоделированные данные из модели движения с двумя различными параметрами, скажем, mu и sigma. Модель легко смоделировать. У меня есть 1 000 различных наборов данных, и каждый набор данных содержит 501 строку широт и долгот, где каждая строка равномерно распределена по времени. Таким образом, у меня есть 1 000 таких:
| Время | Широта | Долгота |
| —– | —— | —— |
| 1 | -1.23 | 10.11 |
| 2 | 0.45 | 12 |
| . | . | . |
Я хотел бы обучить нейронную сеть для определения связи между параметрами и положением. Я думаю использовать 1D CNN, рассматривая широту и долготу как два канала. Ниже моя (неудачная) попытка сделать это.
Перед тем, что показано, я разделил данные на 599 обучающих наборов данных и 401 тестовых наборов данных. У меня есть признаки (x) в виде тензора размером [599,2] и выходные данные (y) в виде тензора размером [599,501,2]. Правильные ли это формы?
Для создания фактической модели, я не знаю, что делать с “Dense”. Все онлайн-руководства, которые я видел, предназначены для задач классификации, поэтому они часто используют softmax. Мой вывод должен быть в виде реальных чисел.
datalist_train.shape
TensorShape([599, 501, 2]) #599 обучающих наборов данных из 501 точки времени (строки) и широты/долготы (столбцы)
params_train.shape
TensorShape([599, 2]) #599 обучающих наборов данных mu и sigma (признаки)
model=models.Sequential
model.add(layers.Conv1D(32,3, activation='relu', input_shape=(501, 2)))
model.add(layers.MaxPooling1D())
model.add(layers.Conv1D(32, 3, activation='relu'))
model.add(layers.MaxPooling1D())
model.add(layers.Conv1D(32, 3, activation='relu'))
model.add(layers.Dense(1)) #!Не знаю, что делать с этим
model.compile(optimizer="adam", loss="mse")
model.fit(params_train, datalist_train, epochs=10)
что возвращает следующую ошибку:
TypeError Traceback (most recent call last)
Cell In[14], line 3
1 model=models.Sequential
----> 3 model.add(layers.Conv1D(32,3, activation='relu', input_shape=(501, 2)))
4 model.add(layers.MaxPooling1D())
5 model.add(layers.Conv1D(32, 3, activation='relu'))
TypeError: Sequential.add() missing 1 required positional argument: 'layer'
Любая помощь будет очень признательна. Спасибо!
Ошибка возникает потому, что models.Sequential назначается непосредственно переменной model вместо создания экземпляра класса Sequential. Вам следовало бы сделать model = models.Sequential(), а не models.Sequential.
Ответ или решение
Конволюционные нейронные сети (ConvNet или CNN) представляют собой специализированный класс нейронных сетей, которые демонстрируют превосходную производительность при обработке данных, имеющих сетчатую топологию, такой как изображения и временные ряды. Ваша задача — построить 1D CNN для установления связи между параметрами движения и координатами по широте и долготе. Давайте разберем вашу проблему и рассмотрим, как можно оптимально подойти к этой задаче с использованием библиотеки TensorFlow.
Теоретическая часть (Theory)
CNN в 1-мерном формате являются эффективным инструментом для извлечения признаков из последовательных данных. В вашем случае данные состоят из временных рядов широт и долгот двух каналов. Важной концепцией здесь является использование свертки (convolution) для автоматического выявления паттернов в последовательных данных. Слой Dense, который используется в конце модели CNN, является полносвязанным слоем, часто применяемым для окончательного вывода результатов. В случае регрессии, результат будет числовым, и не будет использовать активацию Softmax, как это делается в задачах классификации.
Пример (Example)
Рассмотрим код и выявим ошибки:
model = models.Sequential() # Создаем экземпляр Sequential, а не вызываем класс
model.add(layers.Conv1D(32, 3, activation='relu', input_shape=(501, 2)))
model.add(layers.MaxPooling1D())
model.add(layers.Conv1D(32, 3, activation='relu'))
model.add(layers.MaxPooling1D())
model.add(layers.Conv1D(32, 3, activation='relu'))
model.add(layers.Flatten()) # Добавляем Flatten перед слоем Dense
model.add(layers.Dense(2)) # Поскольку нужно предсказать два параметра (mu и sigma)
model.compile(optimizer="adam", loss="mse")
Применение (Application)
-
Создание архитектуры сети: Начнем с исправления ошибки в коде, связанной с созданием экземпляра модели. Вместо
models.Sequential
должно бытьmodels.Sequential()
для создания объекта модели. После этого мы добавим слои свертки (Conv1D) для выявления пространственно-временных паттернов в данных. -
Обработка выходных данных: После слоев свертки и L2-нормализации (MaxPooling) мы используем
Flatten
, чтобы преобразовать выходные данные из многомерного массива в одномерный вектор. Это необходимо, чтобы передать данные на вход слою Dense. -
Выбор функции потерь и оптимизатора: Для задачи регрессии, которая предусматривает предсказание непрерывных значений (mu и sigma), применяется среднеквадратическая ошибка (MSE) как функция потерь. Выбор оптимизатора "adam" уже является правильным решением, поскольку он обеспечивает быстрое и стабильное обучение.
-
Подготовка данных: В вашем описании структуры данных имеется недоговоренность: параметры выступают как входные данные, а координаты данных — как целевые. Обычно модель строится для предсказания параметров по данным (входом будет временной ряд, а выходом — параметры).
Для
model.fit(x, y)
, гдеx
— входные данные, аy
— целевые значения, вы можете использовать:x
=datalist_train.reshape(599, 501, 2)
, где вы храните временны́е ряды координат.y
=params_train
, поскольку это целевые переменные для регрессии.
-
Тренировка модели: После исправления входных и выходных данных, вы можете выполнить обучение:
model.fit(datalist_train, params_train, epochs=10, validation_split=0.2)
Этот подход позволит модели обучиться на 80% данных, оставляя 20% для валидации, что важно для контроля переобучения. Важно также контролировать метрики на валидационных данных, чтобы предотвратить избыточную подгонку модели.
Заключение
Исправление кода и понимание структуры данных — ключевые шаги в решении вашей задачи. Ваша модель теперь будет способна идентифицировать паттерны в данных временных рядов широт и долгот, с целью предсказания вероятностных параметров mu
и sigma
. Сверточные нейронные сети, будучи невероятными инструментами обработки данных, способны проводить качественную фильтрацию и дедукцию из них. Применив правильный подход к предварительной обработке и архитектуре модели, вы сможете достичь успешного обучения и тестирования модели на ваших движущихся данных.