Friday, March 18, 2022

Train a Neural Network with Multiple Output Neurons

Настройте и обучите свою первую нейронную сеть с несколькими выходами

Типы пиццы должны быть линейно разделимы, так как они либо содержат продукты животного происхождения, либо нет. Например, в пицце есть мясо (мясо), моцарелла и овощи (вегетарианская) или нет продуктов животного происхождения (веганская). Давайте проверим это предположение, настроив первый компонент с одним слоем с 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 итераций. Адам может помочь вам тренироваться быстрее; однако некоторые исследования показывают, что это может привести к переобучению сетей. Тем не менее, вы все равно увидите, что он широко используется в качестве основного алгоритма в отрасли.

References

No comments:

Post a Comment