#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
Кроме того, некоторые вещи, которые нужно запомнить:
- Всегда используйте нелинейные функции активации для вашего скрытого layers.ie (relu, elu и т.д.)
- Чем больше слоев вы добавляете, тем больше модель способна изучать сложные функции. Однако ваша модель может быть перегружена, а также потребуется много времени для обучения.
- Постепенно увеличивайте количество нейронов и слоев.
- Используйте проверку и набор тестов, чтобы увидеть качество модели.
- Используйте регуляризацию, чтобы избежать переобучения модели.
Примечание к dataset.
- Вы не должны использовать dataset, который имеет так много функций.
- Используйте выборочные функции из набора данных, чтобы избежать переобучения.
Комментарии:
1. Спасибо, это очень помогает.