Как я могу частично реализовать свертку на своем наборе данных?

Вопрос или проблема

Я обучаю нейронную сеть на результатах CFD-симуляции (или, точнее, около 300 симуляций с различными начальными условиями). Набор данных содержит значения температуры, плотности, скорости и т.д. в эквидистантных точках на известном отрезке линии (вдоль одного пространственного измерения) на каждом шаге симуляции. У меня также есть некоторые “метаданные”, т.е. параметры симуляции в каждой инстанции симуляции (например, начальные условия, условия окружающей среды и т.д.).

Насколько я понимаю, это похоже на изображенческие данные (за исключением того, что они одномерные, и у нас есть физические величины вместо RGB значений); возможно, мне следует преобразовать набор данных и даже использовать время в качестве второго “измерения”, а не в качестве столбца/признака. И, судя по всему, свёрточная архитектура может быть наилучшим вариантом для таких пространственно/спатиодинамических данных. Я приведу упрощенный пример моего датафрейма внизу этого поста.

В любом случае, мой датафрейм будет содержать некоторые непространственные столбцы, которые не будут использоваться в свёртке (вероятно, я использую полностью связанные Dense нейроны для них), и другие, которые будут использоваться (вероятно, я использую некоторые Conv1D или Conv2D нейроны для них). Как мне построить такую архитектуру на TensorFlow? Я не думаю, что API Sequential может иметь параллельные ветви с разным поведением, верно?

Упрощенный пример:

--------------------------------------------------------------------------
| Время | Начальные условия | T1 | T2 | T3 | V1 | V2 | V3 | D1 | D2 | D3 |
|-------|-------------------|----|----|----|----|----|----|----|----|----|
| 1     | 100               | 20 | 21 | 22 | 3  | 5  | 6  | 10 | 10 | 11 |
| 2     | 100               | 19 | 21 | 21 | 4  | 6  | 7  | 10 | 9  | 10 |
| ...   | 100               | ...                                        |

x1 — это значение величины x в известной точке 1. Представьте себе сотни таких CSV файлов, каждый с различными начальными условиями (они также числовые, а не категориальные). Я могу загрузить их и объединить колонки в строки или наоборот, без проблем, я знаю синтаксис для этого. Но, коротко говоря, мои 2 вопроса:

  1. Следует ли мне преобразовать колонку времени в отдельные колонки для каждого временного шага (при условии, что у меня достаточно вычислительной мощности для обработки такого широкого набора данных)?
  2. Как мне свернуть колонки температуры, колонки скорости и колонки плотности (а возможно, и временные колонки), оставив начальные условия независимыми входами?

Извините. Я немного новичок в кодировании нейронных сетей, особенно свёрточных. Если есть какие-либо полезные ресурсы для новичка, пожалуйста, пришлите их мне! Ранее я работал только с слоями Dense и последовательными архитектурами. И с гетерогенными слоями не работал.

Если вы используете Conv1D, вам потребуется структура данных, которая может быть сопоставлена с 3D-тензором (например, 3D numpy массивом). Если у вас есть некоторые неспатиодинамические переменные, которые вы хотите обработать с помощью плотных слоев, они должны быть в 2D-структуре. Допустим, у вас есть n симуляций, каждая с m временными шагами, тогда вам понадобятся две структуры данных. Одна будет иметь структуру $n\times 1$, которая хранит начальные условия. Другая будет иметь структуру $n\times m\times 9$ (предполагая только 9 спатиодинамических переменных, показанных в вашем примере), которая хранит спатиодинамические данные.

Вы не можете использовать API Sequential, когда у вас несколько входов, поэтому вам нужно будет использовать Функциональный API. Вот минимальный пример использования функционального API для создания модели с двумя входами:

import tensorflow as tf
import tensorflow.keras as keras
from IPython.display import Image 

n = 10 # Симуляции
m = 5  # Временные шаги
v = 9  # Спатиодинамические переменные
i = 1  # Переменные начальных условий

# Создание ветви спатиодинамических данных

input1 = keras.Input((m, v), name="Conv_Input")
x1 = keras.layers.Conv1D(filters=8, kernel_size=3)(input1)

# Создание ветви "начальных условий"

input2 = keras.Input(i, name="Dense_Input")
x2 = keras.layers.Dense(units=8)(input2)

# Объединение двух ветвей

x1 = keras.layers.Flatten()(x1)
full = keras.layers.Concatenate()((x1, x2))
full = keras.layers.Dense(units=1, activation='sigmoid')(full)

# Создание полной модели и отображение структуры модели

model = keras.Model(inputs=(input1, input2), outputs=full)
keras.utils.plot_model(model, show_shapes=True, show_layer_names=True, to_file="model.png")
Image('model.png')

Этот код производит следующую модель:

Модель Keras с несколькими входами

Ответ или решение

Вопрос: Как частично реализовать свертку на моем датасете?

Введение

Вы правильно подметили, что ваши данные напоминают изображения, но в одном измерении (1D) с физическими значениями вместо RGB. Применение сверток (конволюций) для таких данных может действительно повысить качество вашего нейронного сети, особенно для обработки пространственно-временных данных, таких как результаты CFD-симуляций. Давайте рассмотрим ваш вопрос по частям.

1. Следует ли преобразовывать столбец времени в отдельные столбцы для каждого временного шага?

Расположение данных в разных столбцах для временных шагов может быть оправдано в некоторых случаях, однако в вашем случае лучше использовать подход, который позволяет сохранить временную структуру данных. Это можно сделать, сохранив время как одно из измерений в входном тензоре (3D массив), что сделает ваши входные данные более управляемыми для обработки с помощью слоев свертки. Используя такой подход, вы можете сохранить связь между временными потоками данных.

2. Как провести свертку по столбцам температуры, скорости и плотности и отдельно оставив начальные условия?

Для реализации сверток на ваших данных с различными источниками информации, включая не-пространственные переменные, лучше всего использовать функциональный API TensorFlow/Keras, который позволяет строить модели с несколькими входами и объединять их.

Вот пример кода, который иллюстрирует эту идею с использованием TensorFlow и Keras:

import tensorflow as tf
from tensorflow import keras
from IPython.display import Image 

# Определим размеры
n = 10  # Количество симуляций
m = 5   # Временные шаги
v = 9   # Пространственно-временные переменные (например, T1, T2, V1 и т.д.)
i = 1   # Количество начальных условий (например, начальная температура)

# Создание ветки для пространственно-временных данных (Conv1D)
input1 = keras.Input(shape=(m, v), name="Conv_Input")
x1 = keras.layers.Conv1D(filters=8, kernel_size=3, activation='relu')(input1)
x1 = keras.layers.GlobalAveragePooling1D()(x1)  # Пуллинг для уменьшения размерности

# Создание ветки для начальных условий (Dense)
input2 = keras.Input(shape=(i,), name="Dense_Input")
x2 = keras.layers.Dense(units=8, activation='relu')(input2)

# Объединение двух веток
combined = keras.layers.Concatenate()([x1, x2])
output = keras.layers.Dense(units=1, activation='sigmoid')(combined)

# Создание и компиляция полной модели
model = keras.Model(inputs=[input1, input2], outputs=output)
model.compile(optimizer='adam', loss='mean_squared_error')

# Визуализация структуры модели
keras.utils.plot_model(model, show_shapes=True, show_layer_names=True, to_file="model.png")
Image('model.png')

Объяснение кода:

  1. Определение входов: input1 определяет входные данные для пространственно-временных переменных (размерность m временных шагов и v переменных). input2 — для начальных условий.

  2. Слои свертки и пуллинг: Используется Conv1D для обработки временных данных, а затем используется GlobalAveragePooling1D для уменьшения размерности выходных данных свертки.

  3. Объединение веток: С помощью Concatenate вы объединяете выходы из двух веток.

  4. Выходной слой: Последний Dense слой возвращает предсказание для вашей целевой переменной.

  5. Компиляция модели: Вы компилируете модель, выбирая оптимизатор и функцию потерь.

Заключение

Использование функционального API TensorFlow для создания модели с несколькими входами позволяет вам гибко обрабатывать свертку для ваших пространственно-временных данных, оставляя начальные условия как независимые входы. Вы можете начать экспериментировать с настройками сверток и их комбинациями в зависимости от ваших данных. Рекомендуется также ознакомится с документацией TensorFlow и курсами по глубокому обучению для углубленного понимания концепций.

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

Оцените материал
Добавить комментарий

Капча загружается...