#python #нейронные_сети #машинное_обучение #keras #tensorflow
Есть модель, нужно подать данные (массив входных и выходных значений) так, чтобы модель классифицировала данные, и указать нужную функцию активации на последнем слое и функцию потерь. То же самое сделать для Унитарно кодированного вектора на выходном массиве данных. ([0,0,1] первое значение, [0,1,0] второе значение, [1,0,0] третье значение) Во всех статьях и книгах данные загружаются уже готовые из репозиториев, но если создавать собственные данные то возникает проблема. import tensorflow as tf import numpy as np from keras.models import Sequential from keras.layers import Input, Dense, Activation from sklearn import preprocessing model=Sequential() X = np.array([[40, 80, 30, 60], [100, 40, 20, 80], [90, 190, 10, 15]]) Y = np.array([[0], [1], [2]]) model = Sequential() model.add(Dense(16, input_shape=(X.shape[1],))) model.add(Activation('relu')) model.add(Dense(16)) model.add(Activation('relu')) model.add(Dense(3)) model.compile(loss='mean_squared_error', optimizer='Adamax', metrics=['mae']) model.fit(X,Y,batch_size=3,epochs=1000, verbose=1) a=np.array([40, 80, 30, 60]); reshy =a.reshape((1,- 1)) print("test") print(reshy) prediction = model.predict(reshy) print('prediction') print(prediction)
Ответы
Ответ 1
То что вы пытаетесь сделать называется Multilabel Classification. В этом случае массив Y необходимо преобразовать к One-Hot-Encoded виду: from keras.utils import to_categorical Y = to_categorical(Y) чтобы получилось: In [76]: Y Out[76]: array([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]], dtype=float32) Кроме этого надо будет изменить архитектуру НС: model = Sequential() model.add(Dense(4, input_shape=(X.shape[1],), activation='relu')) model.add(BatchNormalization()) model.add(Dense(20, activation='relu')) model.add(Dense(3, activation='softmax')) model.compile(loss='categorical_crossentropy', optimizer='Adamax', metrics=['acc']) NOTE: обратите внимание на loss-function: loss='categorical_crossentropy' и функцию активации на последнем слое: activation='softmax'. Вывод: ... Epoch 47/50 3/3 [==============================] - 0s 0us/step - loss: 0.3294 - acc: 1.0000 Epoch 48/50 3/3 [==============================] - 0s 0us/step - loss: 0.3226 - acc: 1.0000 Epoch 49/50 3/3 [==============================] - 0s 2ms/step - loss: 0.3158 - acc: 1.0000 Epoch 50/50 3/3 [==============================] - 0s 0us/step - loss: 0.3091 - acc: 1.0000 test [[40 80 30 60]] prediction [[0.5021875 0.297052 0.20076045]] Весь код: import tensorflow as tf import numpy as np from keras.utils import to_categorical from keras.models import Sequential from keras.layers import Input, Dense, Activation, BatchNormalization from sklearn import preprocessing model=Sequential() X = np.array([[40, 80, 30, 60], [100, 40, 20, 80], [90, 190, 10, 15]]) Y = np.array([[0], [1], [2]]) Y = to_categorical(Y) model = Sequential() model.add(Dense(4, input_shape=(X.shape[1],), activation='relu')) model.add(BatchNormalization()) model.add(Dense(20, activation='relu')) model.add(Dense(3, activation='softmax')) model.compile(loss='categorical_crossentropy', optimizer='Adamax', metrics=['acc']) model.fit(X,Y,batch_size=3,epochs=100, verbose=1) a=np.array([40, 80, 30, 60]); reshy =a.reshape((1,- 1)) print("test") print(reshy) prediction = model.predict(reshy) print('prediction') print(prediction)
Комментариев нет:
Отправить комментарий