Я хочу глубоко изучить данные в виде экспоненциальных функций, но, похоже, они не изучены должным образом. Изменение функции активации вообще не помогло.
# 딥러닝을 구동하는 데 필요한 케라스 함수 호출
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






несколько вопросов, которые следует помнить при обучении нейронных сетей:
sigmoid однако цель Y является экспоненциальной. Лучше изменить функцию активации вывода на exponential или подумать о цели предварительной обработки Y перед передачей ее в модель. Вы не можете использовать sidmoid, потому что он выводит [-1,1], но все значения в Y очень большие и определенно превышают 1.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