Как мне обучить нейронную сеть с массивом списков, используя keras в python

#python #tensorflow #keras

#python #tensorflow #keras

Вопрос:

Я пытаюсь обучить нейронную сеть с помощью tensorflow.keras, но я не понимаю, как мне обучить ее с помощью numpy массива list (в python3).

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

 import tensorflow as tf
from tensorflow import keras
import numpy as np

# Create the array of data

train_data = [[1.0,2.0,3.0],[4.0,5.0,6.0]]
train_data_np = np.asarray(train_data)
train_label = [[1,2,3],[4,5,6]]
train_label_np = np.asarray(train_data)

### Build the model

model = keras.Sequential([
    keras.layers.Dense(3,input_shape =(3,2)),
    keras.layers.Dense(3,activation=tf.nn.sigmoid)
])

model.compile(optimizer='sgd',loss='sparse_categorical_crossentropy',metrics=['accuracy'])

#Train the model

model.fit(train_data_np,train_label_np,epochs=10)
  

Ошибка заключается в «Ошибке при проверке ввода: ожидаемый dense_input должен иметь 3 измерения, но получен массив с формой (2, 3)» при моделировании.вызывается fit.

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

1. либо вы используете сверточный слой для 2D-массивов (форма 3,2), либо вам нужно сгладить свой массив, чтобы форма была равна 3, для использования с плотными слоями. И я не знаю, как ваш последний слой с сигмоидной функцией может соответствовать 2, 3, 4, 5 или даже 6. Например, ваша метка поезда будет [[1,0,0], [0,1,0]]… Попробуйте прочитать введение в Keras

Ответ №1:

При определении модели Keras вы должны предоставить форму ввода для первого слоя модели.

Например, если ваши обучающие данные содержат n строки и m объекты, т.Е. shape : (n, m), вы должны установить для input_shape первого Dense уровня модели значение (m, ) , т.е. модель должна ожидать, что в нее будут входить m функции.

Теперь перейдем к вашим игрушечным данным,

 train_data = [[1.0,2.0,3.0],[4.0,5.0,6.0]]
train_data_np = np.asarray(train_data)
train_label = [[1,2,3],[4,5,6]]
train_label_np = np.asarray(train_label)
  

Здесь, train_data_np.shape это (2, 3) т.Е. 2 строки и 3 объекты, тогда вы должны определить модель следующим образом,

 model = keras.Sequential([
    keras.layers.Dense(3,input_shape =(3, )),
    keras.layers.Dense(3,activation=tf.nn.sigmoid)
])
  

Теперь ваши метки [[1,2,3],[4,5,6]] . В обычной 3 задаче классификации классов это будет вектор с одной точкой с 1 и 0 s. Но давайте оставим это в стороне, поскольку это игрушечный пример для проверки Keras.

Если целевая метка ie y_train является одноразовой, тогда вам нужно использовать categorical_crossentropy loss вместо sparse_categorical_crossentropy .

Таким образом, вы можете скомпилировать и обучить модель следующим образом

 model.compile(optimizer='sgd',loss='categorical_crossentropy',metrics=['accuracy'])

#Train the model

model.fit(train_data_np,train_label_np,epochs=10)


Epoch 1/10
2/2 [==============================] - 0s 61ms/step - loss: 11.5406 - acc: 0.0000e 00
Epoch 2/10
2/2 [==============================] - 0s 0us/step - loss: 11.4970 - acc: 0.5000
Epoch 3/10
2/2 [==============================] - 0s 0us/step - loss: 11.4664 - acc: 0.5000
Epoch 4/10
2/2 [==============================] - 0s 498us/step - loss: 11.4430 - acc: 0.5000
Epoch 5/10
2/2 [==============================] - 0s 496us/step - loss: 11.4243 - acc: 1.0000
Epoch 6/10
2/2 [==============================] - 0s 483us/step - loss: 11.4087 - acc: 1.0000
Epoch 7/10
2/2 [==============================] - 0s 1ms/step - loss: 11.3954 - acc: 1.0000
Epoch 8/10
2/2 [==============================] - 0s 997us/step - loss: 11.3840 - acc: 1.0000
Epoch 9/10
2/2 [==============================] - 0s 1ms/step - loss: 11.3740 - acc: 1.0000
Epoch 10/10
2/2 [==============================] - 0s 995us/step - loss: 11.3653 - acc: 1.0000