- Вопрос или проблема
- Ответ или решение
- Вопрос: Как частично реализовать свертку на моем датасете?
- Введение
- 1. Следует ли преобразовывать столбец времени в отдельные столбцы для каждого временного шага?
- 2. Как провести свертку по столбцам температуры, скорости и плотности и отдельно оставив начальные условия?
- Объяснение кода:
- Заключение
Вопрос или проблема
Я обучаю нейронную сеть на результатах 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 вопроса:
- Следует ли мне преобразовать колонку времени в отдельные колонки для каждого временного шага (при условии, что у меня достаточно вычислительной мощности для обработки такого широкого набора данных)?
- Как мне свернуть колонки температуры, колонки скорости и колонки плотности (а возможно, и временные колонки), оставив начальные условия независимыми входами?
Извините. Я немного новичок в кодировании нейронных сетей, особенно свёрточных. Если есть какие-либо полезные ресурсы для новичка, пожалуйста, пришлите их мне! Ранее я работал только с слоями 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')
Этот код производит следующую модель:
Ответ или решение
Вопрос: Как частично реализовать свертку на моем датасете?
Введение
Вы правильно подметили, что ваши данные напоминают изображения, но в одном измерении (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')
Объяснение кода:
-
Определение входов:
input1
определяет входные данные для пространственно-временных переменных (размерность m временных шагов и v переменных).input2
— для начальных условий. -
Слои свертки и пуллинг: Используется
Conv1D
для обработки временных данных, а затем используетсяGlobalAveragePooling1D
для уменьшения размерности выходных данных свертки. -
Объединение веток: С помощью
Concatenate
вы объединяете выходы из двух веток. -
Выходной слой: Последний
Dense
слой возвращает предсказание для вашей целевой переменной. -
Компиляция модели: Вы компилируете модель, выбирая оптимизатор и функцию потерь.
Заключение
Использование функционального API TensorFlow для создания модели с несколькими входами позволяет вам гибко обрабатывать свертку для ваших пространственно-временных данных, оставляя начальные условия как независимые входы. Вы можете начать экспериментировать с настройками сверток и их комбинациями в зависимости от ваших данных. Рекомендуется также ознакомится с документацией TensorFlow и курсами по глубокому обучению для углубленного понимания концепций.
Если у вас есть дополнительные вопросы или нужна помощь с кодом, не стесняйтесь задавать их!