Как обучить и сохранить многоклассовую модель искусственной нейронной сети с помощью tensorflow?

#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