Как я должен настроить свою нейронную сеть для приема столбца numpy.ndarrays в качестве входных данных?

#tensorflow #machine-learning #keras #deep-learning #neural-network

#tensorflow #машинное обучение #keras #глубокое обучение #нейронная сеть

Вопрос:

У меня есть фрейм данных с 10 тысячами строк и следующими столбцами:

       array                                     target
[1,5,6,1,3,etc...]                                5
[3,3,1,0,5,etc...]                                10
[0,0,1,1,7,etc...]                                3
        .                                         .
        .                                         .
        .                                         .
  

Каждый массив содержит 33222 элемента, поэтому у меня есть 10000 строк, каждая из которых имеет длину 33 222 numpy.array, которые я хочу ввести в нейронную сеть для прогнозирования целевой переменной.

Вот как настраивается NN:

 x = df.loc[:, 'array']
y = df.loc[:, 'target']

model = Sequential()
model.add(Dense(12, activation='linear'))
model.add(Dense(1, activation='linear'))

model.compile(loss='mse',
                optimizer='adam',
                metrics=['accuracy', 'mse', 'mae'])
                   
model.fit(x, y, epochs=10, batch_size=1, verbose=1)
  

Я получаю

 "ValueError: Please provide as model inputs either a single array or a list of arrays"
  

Я раньше не пытался использовать массивы в качестве входных данных для NN, поэтому я также был бы признателен за любые советы по оптимальному выбору слоя и конфигурации для такого рода задач.

Комментарии:

1. Можете ли вы добавить x.shape и y.shape в свой вопрос.

Ответ №1:

Если я не ошибаюсь, я думаю, что проблема в структуре ваших данных. Эта строка:

x = df.loc[:, 'array']

возвращает столбец ‘array’, но каждое значение в этом столбце является другим массивом, а не значением. Вместо этого попробуйте x = np.matrix(df.loc[:, 'array'].tolist())

Ответ №2:

Небольшой пример реализации нейронной сети

Код:

 import tensorflow as tf
import numpy as np

# Generating random data
np.random.seed(100)
x = tf.constant(np.random.randint(50, size =(10000,33222)), dtype = tf.float32)
y = tf.constant(np.random.randint(50, size =(10000,)), dtype = tf.float32)
print(x.shape) # (10000, 33222)
print(y.shape) # (10000,)

def create_model():
    model = tf.keras.Sequential()
    model.add(tf.keras.Input(shape=(33222,)))
    model.add(tf.keras.layers.Dense(12, activation='relu'))
    model.add(tf.keras.layers.Dense(1, activation='linear'))
    model.compile(loss='mse',
                optimizer='adam',
                metrics=['accuracy', 'mse', 'mae'])
    return model
model = create_model()

model.fit(x,y, epochs = 5)
  

Вывод:

 Epoch 1/5
313/313 [==============================] - 1s 3ms/step - loss: 33659.8986 - accuracy: 0.0204 - mse: 33659.8986 - mae: 54.9263
Epoch 2/5
313/313 [==============================] - 1s 3ms/step - loss: 794.5642 - accuracy: 0.0198 - mse: 794.5642 - mae: 24.1756
Epoch 3/5
313/313 [==============================] - 1s 3ms/step - loss: 795.9055 - accuracy: 0.0196 - mse: 795.9055 - mae: 24.1960
Epoch 4/5
313/313 [==============================] - 1s 3ms/step - loss: 767.0253 - accuracy: 0.0201 - mse: 767.0253 - mae: 23.6541
Epoch 5/5
313/313 [==============================] - 1s 3ms/step - loss: 775.2028 - accuracy: 0.0196 - mse: 775.2028 - mae: 23.8585
  

Кроме того, некоторые вещи, которые нужно запомнить:

  1. Всегда используйте нелинейные функции активации для вашего скрытого layers.ie (relu, elu и т.д.)
  2. Чем больше слоев вы добавляете, тем больше модель способна изучать сложные функции. Однако ваша модель может быть перегружена, а также потребуется много времени для обучения.
  3. Постепенно увеличивайте количество нейронов и слоев.
  4. Используйте проверку и набор тестов, чтобы увидеть качество модели.
  5. Используйте регуляризацию, чтобы избежать переобучения модели.

Примечание к dataset.

  1. Вы не должны использовать dataset, который имеет так много функций.
  2. Используйте выборочные функции из набора данных, чтобы избежать переобучения.

Комментарии:

1. Спасибо, это очень помогает.