Вы уже знали, как подготовить набор данных для обучения.
Это пример, который я делаю, чтобы объяснить:
voca = ["java", "spring", "net", "csharp", "python", "numpy", "nodejs", "javascript"]
units = ["MicrosoftTech", "JavaTech", "Pythoneers", "JavascriptRoots"]
desc1 = "Company X is looking for a Java Developer. Requirements: Has worked with Java. 3+ years experience with Java, Maven and Spring."
desc2 = "Company Y is looking for a csharp Developer. Requirements: Has wored with csharp. 5+ years experience with csharp, Net."
x_train = []
y_train = []
x_train.append(bagOfWords(desc1, voca))
y_train.append(units.index("JavaTech"))
x_train.append(bagOfWords(desc2, voca))
y_train.append(units.index("MicrosoftTech"))
И, у нас есть 2 набора данных обучения:
[array([3, 1, 0, 0, 0, 0, 0, 0]), array([0, 0, 1, 3, 0, 0, 0, 0])] [1, 0]
array([3, 1, 0, 0, 0, 0, 0, 0]) => 1 (It means JavaTech)
array([0, 0, 1, 3, 0, 0, 0, 0]) => 0 (It means MicrosoftTech)
И, модель должна прогнозировать одну единицу в 4 единицах, что вы определили.Итак, нам нужна классификация модели машинного обучения.Модель машинного обучения классификации требует «softmax» в качестве функции активации выходного слоя.И, функция потери "кроссцентропии" требуется.Это очень простая модель глубокого обучения, написанная keras apis of tenorflow.
import tensorflow as tf
import numpy as np
units = ["MicrosoftTech", "JavaTech", "Pythoneers", "JavascriptRoots"]
x_train = np.array([[3, 1, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 1, 0, 0, 0, 0],
[0, 0, 2, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 2, 1, 0, 0],
[0, 0, 0, 0, 1, 2, 0, 0],
[0, 0, 0, 0, 0, 0, 1, 1],
[0, 0, 0, 0, 0, 0, 1, 0]])
y_train = np.array([0, 0, 1, 1, 2, 2, 3, 3])
И, это модель, состоящая из одного скрытого слоя с 256 ячейками и выходного слоя с 4 ячейками.
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(256, activation=tf.nn.relu),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(len(units), activation=tf.nn.softmax)])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
Я установил эпохи на 50. Чтобы учиться, нужно видеть потери и акк, пока они бегут.На самом деле 10 было недостаточно.И я начну учиться.
model.fit(x_train, y_train, epochs=50)
И, это часть предсказания.newSample - это просто пример того, что я сделал.
newSample = np.array([[2, 2, 0, 0, 0, 0, 0, 0]])
prediction = model.predict(newSample)
print (prediction)
print (units[np.argmax(prediction)])
Наконец, я получил следующий результат:
[[0.96280855 0.00981709 0.0102595 0.01711495]]
MicrosoftTech
Это означает возможность каждой единицы.И самая высокая вероятность - MicrosoftTech.
MicrosoftTech : 0.96280855
JavaTech : 0.00981709
....
И, это результат шагов обучения.Вы можете видеть, что потери постоянно уменьшаются.Итак, я увеличил количество эпох.
Epoch 1/50
8/8 [==============================] - 0s 48ms/step - loss: 1.3978 - acc: 0.0000e+00
Epoch 2/50
8/8 [==============================] - 0s 356us/step - loss: 1.3618 - acc: 0.1250
Epoch 3/50
8/8 [==============================] - 0s 201us/step - loss: 1.3313 - acc: 0.3750
Epoch 4/50
8/8 [==============================] - 0s 167us/step - loss: 1.2965 - acc: 0.7500
Epoch 5/50
8/8 [==============================] - 0s 139us/step - loss: 1.2643 - acc: 0.8750
........
........
Epoch 45/50
8/8 [==============================] - 0s 122us/step - loss: 0.3500 - acc: 1.0000
Epoch 46/50
8/8 [==============================] - 0s 140us/step - loss: 0.3376 - acc: 1.0000
Epoch 47/50
8/8 [==============================] - 0s 134us/step - loss: 0.3257 - acc: 1.0000
Epoch 48/50
8/8 [==============================] - 0s 137us/step - loss: 0.3143 - acc: 1.0000
Epoch 49/50
8/8 [==============================] - 0s 141us/step - loss: 0.3032 - acc: 1.0000
Epoch 50/50
8/8 [==============================] - 0s 177us/step - loss: 0.2925 - acc: 1.0000