Abhay binwal Ответов: 1

Моя нейронная сеть перегружена, как я могу это предотвратить?


Я ИСПОЛЬЗОВАЛ НАБОР ДАННЫХ ДИАБЕТА ДЛЯ ОБУЧЕНИЯ СВОЕЙ НЕЙРОННОЙ СЕТИ, И МОЯ МОДЕЛЬ СЛИШКОМ ХОРОШО ПОДХОДИТ. КАК Я МОГУ ПРЕДОТВРАТИТЬ ЭТО, Я ТОЖЕ ПРОБОВАЛ НЕСКОЛЬКО МЕТОДОВ, НО ЭТО НЕ СРАБОТАЛО ХОРОШО. НАДЕЮСЬ, ЧТО Я СМОГУ НАЙТИ ЛЮБОЕ РЕШЕНИЕ ЭТОЙ ПРОБЛЕМЫ КАК МОЖНО СКОРЕЕ. ПОПРОБУЙТЕ ЗАПУСТИТЬ ЭТОТ КОД, КОТОРЫЙ Я СОЗДАЛ В GOOGLE COLAB, ПЕРВЫЕ НЕСКОЛЬКО СТРОК КОДА, КОТОРЫЕ Я ПРОКОММЕНТИРОВАЛ, ИСПОЛЬЗУЮТСЯ В GOOGLE COLLAB ДЛЯ ИМПОРТА ФАЙЛА ИЗ СИСТЕМЫ, ЕСЛИ ВЫ ЗАПУСКАЕТЕ КОД В ЛЮБОЙ ДРУГОЙ IDE, ТО НЕ ИСПОЛЬЗУЙТЕ ЭТУ СТРОКУ КОДА. Я ТАКЖЕ ПРЕДОСТАВИЛ ССЫЛКУ ДЛЯ НАБОРА ДАННЫХ, КОТОРАЯ ЯВЛЯЕТСЯ ССЫЛКОЙ НА GOOGLE ДИСК, ПО КОТОРОЙ ВЫ МОЖЕТЕ СКАЧАТЬ НАБОР ДАННЫХ.

#ИМПОРТ ФАЙЛА ИЗ СИСТЕМЫ

"""импорт панд в качестве ПД от Google.импорт файлов colab загружен = файлы.загрузить()

для fn в uploaded.keys():

печать('пользователь загрузил файл "{имя}" с длина {длина} байтов.формат(имя=ФН, длина=лен(загружен[ФН])))

"""

импорт включает в себя как НП

импорт панд в качестве ПД

данные = ПД.read_csv (сведения сахарный диабет'.файл CSV')

данных.функция isnull().любой()

данных.формы

#ОБРАБОТКА ДАННЫХ

X = data.iloc[:,1:9].значения

y = data.iloc[:,9].значения

#МАСШТАБИРОВАНИЕ ДАННЫХ

от sklearn.импорт первичной обработки StandardScaler

СК = StandardScaler()

Х = СК.fit_transform(х)

#РАЗДЕЛЕНИЕ ДАННЫХ В ТЕСТЕ И ОБУЧЕНИИ

из sklearn.model_selection импортируйте train_test_split

X_train,X_test,y_train,y_test = train_test_split(х,г,test_size = 0.2,random_state=1)

#СОЗДАНИЕ МОДЕЛИ

импорт кераса

от выбранной позиции.импорт моделей последовательного

от кераса.слои импортируют плотную# нейронную сеть

из tensorflow.keras импортируйте регуляризаторы

импорт matplotlib.pyplot как plt

модель = последовательная()

model.add(Dense(20, input_dim=8, activation='relu', activity_regularizer=regularizers.l2(1e-4)))

модель.добавить(плотный(15, активация='ноготок', activity_regularizer=регуляризаторов.Л2(1е-4)))

модель.добавить(плотное(10, активация='ноготок', activity_regularizer=регуляризаторов.Л2(1е-4)))

модель.добавить(плотный(3, активация='ноготок', activity_regularizer=регуляризаторов.Л2(1е-4)))

model.add(Dense(1, activation='sigmoid'))

модель.резюме()

#ВЫБРАННЫЙ МЕТОД

модель.компиляции(оптимизатор='Адам', потери='mean_squared_error', метрика=['точность'])

#ОБУЧАЮЩАЯ МОДЕЛЬ С ОБУЧАЮЩИМ НАБОРОМ И НАБОРОМ ПЕРЕКРЕСТНОЙ ПРОВЕРКИ

history = model.fit(X_train, y_train, epochs=100, batch_size=64, validation_data=(X_test,y_test))

#ТОЧНОСТЬ ПОСТРОЕНИЯ ГРАФИКА И ПОТЕРИ

loss_train = history.history['потеря']

loss_val = history.history['val_loss']

эпохи = диапазон(1,101)

ДПП.участок(эпох, loss_train, 'г', метка='обучения потери')

ДПП.участок(эпох, loss_val, " б " метка='потеря валидации)

plt.title ("потеря обучения и валидации"))

plt.xlabel("эпохи")

plt.ylabel('потеря')

ДПП.легенда()

ДПП.показать()

loss_train = history.history['точность']

loss_val = history.history['val_accuracy']

эпохи = диапазон(1,101)

plt.plot(epochs, loss_train, 'g', label='точность обучения')

ДПП.участок(эпох, loss_val, " б " метка='точность проверки')

plt.title ("точность обучения и валидации"))

plt.xlabel("эпохи")

plt.ylabel('точность')

ДПП.легенда()

ДПП.показать()

Ссылка для набора данных: https://drive.google.com/file/d/1ECaKuAyniai1m1KD7bs-ffJ3PTNVJR9U/view?usp=sharing

Что я уже пробовал:

Я попробовал несколько вещей, но они не сработали хорошо.

Kris Lantz

Почему ты кричишь? Мы прямо здесь.

Richard MacCutchan

Наверное, он внизу. :)

Richard MacCutchan

- Я пробовал кое-что, но ничего не вышло."
Это действительно не очень полезный комментарий. Пожалуйста, отредактируйте свой вопрос, правильно отформатируйте код, покажите, что вы пробовали, и объясните точно, что происходит или не происходит.

Abhay binwal

Я сделал несколько комментариев в коде и только попробовал метод отсева для предотвращения переобучения, но это не сработало хорошо.

1 Ответов

Рейтинг:
0

Visweswaran N

Существует огромный диапазон возможностей по поводу того, почему модель чрезмерно облегает. Я хотел бы затронуть несколько общих вопросов.

Прежде чем перейти к ответу, я хотел бы дать краткое объяснение тому, что Выпадение это из этой исследовательской работы, опубликованной оригинальным автором на:Выпадение

Выпадение:
Простой метод предотвращения чрезмерной подгонки моделей нейронных сетей путем удаления или отбрасывания единиц(также называемых нейронами) при случайном обучении. Там по модели не будет зависеть от конкретных нейронов или единиц.


Поскольку вы столкнулись с проблемой чрезмерной подгонки, вам нужно добавить выпадающие слои вместе с вашими плотными слоями.

Трюки Со Стохастическим Градиентным Спуском рассказывает, почему SGD хорош для обучения больших наборов данных.

Кроме того в вашем случае поскольку это проблема бинарной классификации я бы пошел на binary_crossentropy как моя функция потерь.

Хорошо теперь давайте войдем в код и посмотрим:

Сначала добавьте наш импорт:

# SWAMI KARUPPASWAMI THUNNAI
import pandas as pd
import numpy as np
# vague explanation: convert labels into numbers
from sklearn.preprocessing import LabelEncoder
# Feature scaling
from sklearn.preprocessing import StandardScaler
# Our sequentially stacker NN model
from keras.models import Sequential
from keras.layers import Dense, Dropout


Прочтите набор данных:
dataset = pd.read_csv("DIABETES DATA.csv")


Наши скалеры и энкодеры:

encoder = LabelEncoder()
scaler = StandardScaler()


Наши независимые и зависимые переменные:

X = dataset.iloc[:, :-1]
y = dataset.iloc[:, -1]


Кодирование категориальных Варс и масштаб по оси Х

X.iloc[:, 0] =  encoder.fit_transform(X.iloc[:, 0:1])
X.iloc[:, :] = scaler.fit_transform(X.iloc[:, :])
X = np.array(X)


Наша нейронная сеть:

classifier = Sequential()
classifier.add(Dense(1000, input_dim=9, activation="relu"))
classifier.add(Dropout(0.2))
classifier.add(Dense(500, activation="relu"))
classifier.add(Dropout(0.2))
classifier.add(Dense(250, activation="relu"))
classifier.add(Dropout(0.2))
classifier.add(Dense(100, activation="relu"))
classifier.add(Dropout(0.2))
classifier.add(Dense(1, activation="relu"))
classifier.summary()

Layer (type)                 Output Shape              Param #   
=================================================================
dense_1 (Dense)              (None, 1000)              10000     
_________________________________________________________________
dropout_1 (Dropout)          (None, 1000)              0         
_________________________________________________________________
dense_2 (Dense)              (None, 500)               500500    
_________________________________________________________________
dropout_2 (Dropout)          (None, 500)               0         
_________________________________________________________________
dense_3 (Dense)              (None, 250)               125250    
_________________________________________________________________
dropout_3 (Dropout)          (None, 250)               0         
_________________________________________________________________
dense_4 (Dense)              (None, 100)               25100     
_________________________________________________________________
dropout_4 (Dropout)          (None, 100)               0         
_________________________________________________________________
dense_5 (Dense)              (None, 1)                 101       
=================================================================
Total params: 660,951
Trainable params: 660,951
Non-trainable params: 0


Выбор adam так как SGD хорошо работает для больших наборов данных

classifier.compile(optimizer="adam", loss="binary_crossentropy", metrics=["accuracy"])


Окончательно:

classifier.fit(X, y, batch_size=20, epochs=100)


Дает:

768/768 [==============================] - 1s 679us/step - loss: 0.4177 - acc: 0.7539
Epoch 99/100
768/768 [==============================] - 1s 677us/step - loss: 0.4609 - acc: 0.7552
Epoch 100/100
768/768 [==============================] - 1s 712us/step - loss: 0.4449 - acc: 0.8008


Visweswaran N

Я не знаю, почему в моем ответе слишком много пустых строк.

Abhay binwal

А как насчет точности перекрестной проверки точности?

Abhay binwal

Я имею в виду, что я тоже получаю хорошую точность для тренировочного набора, но когда я перехожу к перекрестной проверке, точность падает.