#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