Настройте и обучите свою первую нейронную сеть с несколькими выходами
Типы пиццы должны быть линейно разделимы, так как они либо содержат продукты животного происхождения, либо нет. Например, в пицце есть мясо (мясо), моцарелла и овощи (вегетарианская) или нет продуктов животного происхождения (веганская). Давайте проверим это предположение, настроив первый компонент с одним слоем с 15 входными измерениями и тремя нейронами. На этот раз воспользуемся активацией softmax. Sigmoid не гарантирует, что выходные данные являются взаимоисключающими. У вас может быть два выхода одновременно, то есть веганская и вегетарианская пицца; softmax гарантирует, что результаты являются взаимоисключающими.
Split the training set into two, so you can keep an eye on the model's performance on unseen data during training as well:
A training set
A validation set
You do that during fitting.
And start training:
********
Code 1
********
(.env) [boris@fedora34server ADAM]$ cat testSGD01.py
from tensorflow.keras.optimizers import Adam
from keras.models import Sequential
from keras.layers.core import Dense
from tensorflow.keras.optimizers import SGD
import pandas as pd
import matplotlib.pyplot as plt
pizza_types = pd.read_csv('./datasets/piza_types.csv', index_col=0)
pizza_types.head(10)
pizza_types.shape
training_dataset = pizza_types.sample(frac=0.8)
testing_dataset = pizza_types[~pizza_types.index.isin(training_dataset.index)]
training_dataset.shape
testing_dataset.shape
pizza_type_model = Sequential()
pizza_type_model.add(Dense(3, input_dim=15, activation='softmax'))
sgd = SGD()
pizza_type_model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])
pizza_type_model.summary()
history_sgd_pizza_type_model = pizza_type_model.fit(
training_dataset[['corn', 'olives', 'mushrooms', 'spinach', 'pineapple', 'artichoke', 'chilli', 'pepper', 'onion', 'mozzarella', 'egg', 'pepperoni', 'beef', 'chicken', 'bacon',]],training_dataset[['vegan', 'vegetarian', 'meaty']],epochs=200,validation_split=0.2,)
test_loss, test_acc = pizza_type_model.evaluate(
testing_dataset[['corn', 'olives', 'mushrooms', 'spinach', 'pineapple', 'artichoke', 'chilli', 'pepper', 'onion', 'mozzarella', 'egg', 'pepperoni', 'beef', 'chicken', 'bacon',]],testing_dataset[['vegan', 'vegetarian', 'meaty']])
print(f"Evaluation result on Test Data : Loss = {test_loss}, accuracy = {test_acc}")
Данные были линейно разделимы, и теперь вы обучили сеть с несколькими выходными нейронами!
========================
Попробуйте другой оптимизатор
В предыдущем разделе вы обнаружили, что иногда вам нужно вручную изменить скорость обучения стохастического градиентного спуска (SGD), чтобы сеть могла учиться. Поверх SGD было внесено множество улучшений, и на его основе было создано несколько алгоритмов. Одним из таких алгоритмов является адаптивная оценка момента (Адам). В то время как SGD поддерживал свою скорость обучения во время сеанса обучения, Адам изменяет ее в зависимости от того, как обучается алгоритм, что значительно ускоряет обучение.
Чтобы почувствовать Адама, представьте, что вы мяч, катящийся с горы. Когда холм крутой, вы спускаетесь быстро, а когда холм становится менее крутым, вы спускаетесь медленнее — так Адам меняет скорость обучения.Давайте попробуем Adam и посмотрим, как он себя поведет:
*********
Code 2
*********
(.env) [boris@fedora34server ADAM]$ cat tensorFlowADAM01.py
from tensorflow.keras.optimizers import Adam
from keras.models import Sequential
from keras.layers.core import Dense
from tensorflow.keras.optimizers import SGD
import pandas as pd
import matplotlib.pyplot as plt
pizza_types = pd.read_csv('./datasets/piza_types.csv', index_col=0)
pizza_types.head(10)
pizza_types.shape
training_dataset = pizza_types.sample(frac=0.8)
testing_dataset = pizza_types[~pizza_types.index.isin(training_dataset.index)]
training_dataset.shape
testing_dataset.shape
pizza_type_model = Sequential()
pizza_type_model.add(Dense(3, input_dim=15, activation='softmax'))
sgd = SGD()
pizza_type_model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])
pizza_type_model.summary()
history_sgd_pizza_type_model = pizza_type_model.fit(
training_dataset[['corn', 'olives', 'mushrooms', 'spinach', 'pineapple', 'artichoke', 'chilli', 'pepper', 'onion', 'mozzarella', 'egg', 'pepperoni', 'beef', 'chicken', 'bacon',]],training_dataset[['vegan', 'vegetarian', 'meaty']],epochs=200,validation_split=0.2,)
test_loss, test_acc = pizza_type_model.evaluate(
testing_dataset[['corn', 'olives', 'mushrooms', 'spinach', 'pineapple', 'artichoke', 'chilli', 'pepper', 'onion', 'mozzarella', 'egg', 'pepperoni', 'beef', 'chicken', 'bacon',]],testing_dataset[['vegan', 'vegetarian', 'meaty']])
print(f"Evaluation result on Test Data : Loss = {test_loss}, accuracy = {test_acc}")
# TensorFlow Adam testing
pizza_type_model = Sequential()
pizza_type_model.add(Dense(3, input_dim=15, activation='softmax'))
adam = Adam()
pizza_type_model.compile(loss='categorical_crossentropy', optimizer=adam, metrics=['accuracy'])
pizza_type_model.summary()
history_adam_pizza_type_model = pizza_type_model.fit(
training_dataset[['corn', 'olives', 'mushrooms', 'spinach', 'pineapple', 'artichoke', 'chilli', 'pepper', 'onion', 'mozzarella', 'egg', 'pepperoni', 'beef', 'chicken', 'bacon',]], training_dataset[['vegan', 'vegetarian', 'meaty']],epochs=200,validation_split=0.2,)
fig, axes = plt.subplots(1, 2, figsize=(14, 6))
axes = axes.flatten()
axes[0].plot(history_sgd_pizza_type_model.history['loss'])
axes[0].plot(history_sgd_pizza_type_model.history['accuracy'])
axes[0].set_title('SGD based Model Training History')
axes[0].set_ylabel('Value')
axes[0].set_xlabel('Epoch')
axes[0].legend(['Loss', 'Accuracy'], loc='center right')
axes[1].plot(history_adam_pizza_type_model.history['loss'])
axes[1].plot(history_adam_pizza_type_model.history['accuracy'])
axes[1].set_title('Adam based Model Training History')
axes[1].set_ylabel('Value')
axes[1].set_xlabel('Epoch')
axes[1].legend(['Loss', 'Accuracy'], loc='center right')
plt.show()
Для оптимизатора Адам из tensorflow.keras.optimizers тестирование выполнено трижды
Убыток (синяя линия) - с SGD он достигает 0 примерно после 200 итераций; однако при использовании Адама он достигает 0 примерно после 100 итераций.
Точность (оранжевая линия) достигает 100%, когда потери опускаются ниже 0,2. С SGD это происходит медленнее, примерно после 75 итераций, но очень быстро с Адамом, всего после примерно 50 итераций. Адам может помочь вам тренироваться быстрее; однако некоторые исследования показывают, что это может привести к переобучению сетей. Тем не менее, вы все равно увидите, что он широко используется в качестве основного алгоритма в отрасли.
No comments:
Post a Comment