#python #tensorflow #deep-learning #neural-network
Вопрос:
Я пытаюсь обучить модель нейронной сети с многоклассовой классификацией, используя tensorflow. Итак, у меня есть 24 вектора функций в виде массива numpy, который выглядит так, когда я его печатаю:
[[1 0 0 ... 0 1 1]
[1 0 0 ... 0 1 1]
[1 0 0 ... 0 1 1]
...
[1 0 0 ... 2 0 0]
[1 0 0 ... 2 0 0]
[1 0 0 ... 2 0 0]]
Выше x_train
приведен набор данных, который я хочу обучить. Он имеет форму
(10799, 24)
Тогда y_train
набор данных выглядит следующим образом
[ 307 307 307 ... 257947 257947 257947]
И он имеет форму:
(10799,)
Таким y_train
образом, поскольку метка содержит разные классы, число, показанное там, является идентификаторами. И в нем в общей сложности 480 классов. До сих пор моя попытка в обучении была такой:
#Normalize the data
x_train = x_train/x_train.max()
#Convert the y_train to be one-hot encoded because they're not a regression problem, to do categorical analysis by Keras.
from keras.utils import to_categorical
y_cat_train = to_categorical(y_train)
#BUILDING THE MODEL
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(24,input_dim=24,activation='relu'))
model.add(Dense(units=48,activation='relu'))
model.add(Dense(units=96,activation='relu'))
model.add(Dense(units=192,activation='relu'))
model.add(Dense(units=384,activation='relu'))
model.add(Dense(units=420,activation='relu'))
model.add(Dense(units=450,activation='relu'))
model.add(Dense(480,activation='softmax'))
model.compile(loss='categorical_crossentropy',optimizer='rmsprop',metrics=['accuracy'])
print(model.summary())
#TRAINING THE MODEL
model.fit(x_train,y_cat_train,epochs=25)
#SAVING THE MODEL
model.save('myModel.h5')
Но потом я получаю сообщение об ошибке::
ValueError: Shapes (None, 257948) and (None, 480) are incompatible
Может ли кто-нибудь научить меня или объяснить, как правильно использовать tensorflow для обучения и сохранения модели для многоклассовой классификации? И, пожалуйста, объясните, что я сделал не так в коде и возможные решения этой проблемы?
Ответ №1:
Вы должны указать input_shape
параметр
#Normalize the data
x_train = x_train/x_train.max()
#Convert the y_train to be one-hot encoded because they're not a regression problem, to do categorical analysis by Keras.
from keras.utils import to_categorical
y_cat_train = to_categorical(y_train)
#BUILDING THE MODEL
from keras.models import Sequential
from keras.layers import Dense
model = tf.keras.Sequential(
[
layers.Dense(24, activation="relu", input_shape=(x_train.shape[1],)),
layers.Dense(48,activation='relu'),
layers.Dense(96,activation='relu'),
layers.Dense(192,activation='relu'),
layers.Dense(384,activation='relu'),
layers.Dense(420,activation='relu'),
layers.Dense(450,activation='relu'),
layers.Dense(len(set(y_cat_train)), activation="softmax")
]
)
model.compile(loss='categorical_crossentropy',optimizer='rmsprop',metrics=['accuracy'])
print(model.summary())
#TRAINING THE MODEL
model.fit(x_train,y_cat_train,epochs=25)
#SAVING THE MODEL
model.save('myModel.h5')
записка:
В сети, содержащей более 3 Dense
уровней, вам необходимо увеличить их количество epoch
, чтобы сеть сошлась.
На мой взгляд, лучше начать только с 1 слоя, который имеет размер по количеству объектов на входе, а затем модифицировать сеть.
В вашем случае лучше будет начать с одного слоя, который содержит len(x_train.shape[1])
.
Избегайте использования (по возможности) массива numpy в качестве X,y. Вместо этого приведите данные, используя структуру Tensorflow
tf.Data.
Вы можете обратиться к следующему примеру кода:
https://github.com/alessiosavi/tensorflow-face-recognition/blob/90d4acbea8f79539826b50c82a63a7c151441a1a/dense_embedding.py#L155