Как глубоко изучить простые данные в экспоненциальной форме?

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

# 딥러닝을 구동하는 데 필요한 케라스 함수 호출
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

# 필요한 라이브러리 불러오기
import numpy as np
import tensorflow as tf

# 실행할 때마다 같은 결과를 출력하기 위해 설정하는 부분
np.random.seed(3)
tf.random.set_seed(3)

# 준비된 수술 환자 데이터를 불러오기
Data_set = np.loadtxt("size.csv", delimiter = ",")

# 환자의 기록과 수술 결과를 X와 Y로 구분하여 저장
X = Data_set[:,0]
Y = Data_set[:,1]

print(X)
print(Y)

Выход:

[1992. 1994. 1996. 1998. 1999. 2001. 2004. 2006. 2007. 2009. 2011. 2014.
 2015. 2017. 2019. 2020. 2021. 2022. 2023.]
[800. 500. 350. 250. 180. 130.  90.  65.  45.  40.  28.  22.  14.  10.
   7.   6.   5.   4.   3.]

Я думаю, что у модели слишком большие потери, но я не знаю, как сделать правильную модель. Даже если я увеличу количество эпох до 10000, потеря больше не уменьшится. Как мне решить эту проблему?

# 딥러닝 구조를 결정 (모델을 설정하고 실행)
model = Sequential()
model.add(Dense(30, input_dim = 1, activation = 'relu'))
model.add(Dense(1, activation = 'sigmoid'))

# 딥러닝 실행
model.compile(loss = 'mean_squared_error', optimizer = 'adam', metrics = ['accuracy'])
model.fit(X, Y, epochs = 100, batch_size = 10)

Выход:

2/2 [==============================] - 0s 9ms/step - loss: 60102.5781 - accuracy: 0.0000e+00
Epoch 99/100
2/2 [==============================] - 0s 8ms/step - loss: 60102.5781 - accuracy: 0.0000e+00
Epoch 100/100
2/2 [==============================] - 0s 8ms/step - loss: 60102.5781 - accuracy: 0.0000e+00
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

  1. Используйте правильные функции активации. В вашем случае функция активации вывода sigmoid однако цель Y является экспоненциальной. Лучше изменить функцию активации вывода на exponential или подумать о цели предварительной обработки Y перед передачей ее в модель. Вы не можете использовать sidmoid, потому что он выводит [-1,1], но все значения в Y очень большие и определенно превышают 1.
  2. Перед входом в модель ввод X должен быть правильно масштабирован. Это связано с тем, что инициализированные веса NN представляют собой очень маленькие случайные числа, очень близкие к нулю. Поэтому лучше всего масштабировать входные данные таким образом, чтобы они распределялись вокруг 0: часть данных в отрицательной области, а часть в положительной. Вы можете сделать это, применив standard scaler или аналогичные шаги предварительной обработки.

X = [1992, 1994, 1996, 1998, 1999, 2001, 2004, 2006, 2007, 2009, 2011, 2014,
 2015, 2017, 2019, 2020, 2021, 2022, 2023,]

Y = [800, 500, 350, 250, 180, 130,  90,  65,  45,  40,  28,  22,  14,  10,
   7,   6,   5,   4,   3,]

X = tf.constant(X)
Y = tf.constant(Y)


model = Sequential()
model.add(Dense(30, input_dim = 1, activation = 'relu'))
model.add(Dense(1,  activation =  'exponential'))

def scale_standard(Z):
    return (Z - tf.math.reduce_min(Z)) / (tf.math.reduce_max(Z) - tf.math.reduce_min(Z))    

def scale_max(Z):
    return Z / tf.math.reduce_max(Z)
                                          
X = scale_standard(X)

pred = model(X)
print(pred)


# 딥러닝 실행
model.compile(loss = 'mean_squared_error', 
              optimizer = 'adam', 
              metrics = ['r2_score'])

model.fit(X, Y, epochs = 1000, batch_size = 10)

Выходы:

Epoch 998/1000
2/2 ━━━━━━━━━━━━━━━━━━━━ 0s 1ms/step - loss: 140.9382 - r2_score: 0.9969 
Epoch 999/1000
2/2 ━━━━━━━━━━━━━━━━━━━━ 0s 1ms/step - loss: 140.9404 - r2_score: 0.9969 
Epoch 1000/1000
2/2 ━━━━━━━━━━━━━━━━━━━━ 0s 1ms/step - loss: 140.9404 - r2_score: 0.9969 

Другие вопросы по теме