-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathKeras神经网络拟合sin函数之玄学调参.py
More file actions
176 lines (83 loc) · 2.38 KB
/
Keras神经网络拟合sin函数之玄学调参.py
File metadata and controls
176 lines (83 loc) · 2.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
# coding: utf-8
# In[1]:
import numpy as np
from sklearn.preprocessing import MinMaxScaler
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Dense,Activation
from keras.optimizers import Adam,SGD
import matplotlib.pyplot as plt
get_ipython().magic('matplotlib inline')
# # 生成数据
# In[13]:
def getData():
X = np.linspace(0, 2 * np.pi, 1000)
X = X[: np.newaxis]
y = np.sin(X)
return X,y
# In[14]:
X,y = getData()
plt.plot(X,y)
# # 定义模型
# In[19]:
def model():
model = Sequential()
model.add(Dense(64,input_dim=1,activation='relu'))
model.add(Dense(1,activation='sigmoid'))
model.compile(optimizer ='adam',loss = 'mse')
return model
# In[20]:
model = model()
# # 训练
# In[21]:
model.fit(X,y,batch_size= 12,epochs=10,shuffle=True, verbose=1)
# In[22]:
y_hat = model.predict(X)
# In[23]:
plt.plot(X, y, 'b', X, y_hat, 'r--')
# ## 可以看到拟合效果并不好,增大训练次数为100次
# In[26]:
model.fit(X,y,batch_size= 12,epochs=100,shuffle=True, verbose=1)
# In[27]:
y_hat = model.predict(X)
plt.plot(X, y, 'b', X, y_hat, 'r--')
# ## 效果所有改善,增大为1000次
# In[28]:
model.fit(X,y,batch_size= 12,epochs=1000,shuffle=True, verbose=1)
# In[30]:
y_hat = model.predict(X)
plt.plot(X, y, 'b', X, y_hat, 'r--')
# ### 可以看到拟合效果比100好,但是拟合范围限于0-π,无法拟合y小于0的情况,什么原因呢?
# In[29]:
def sigmoid(z):
return 1 / (np.exp(-z) + 1)
# In[31]:
z = np.linspace(-5, 5, 1000)
s = sigmoid(z)
# In[32]:
plt.plot(z,s)
# ### sigmoid激活函数返回值总大于0,所以神经网络输出为大于0的值,无法拟合负数
# ### 解决方法:调整目标值y的范围为0-1之间
# In[34]:
y = (y + 1)/2
# ## 重新训练
# In[35]:
model.fit(X,y,batch_size= 12,epochs=1000,shuffle=True, verbose=1)
# In[36]:
y_hat = model.predict(X)
plt.plot(X, y, 'b', X, y_hat, 'r--')
# # 训练结束,拟合相对较好。接下来可调整参数
# - 数据范围
# - 迭代次数
# - 模型神经单元个数
# - 模型神经层数
# # 模型在小样本上的表现
# In[39]:
X = np.arange(0, 100, 1)
y = (np.sin(X) + 1)/2
# In[40]:
y_hat = model.predict(X)
plt.plot(X, y, 'b', X, y_hat, 'r--')
# ## 拟合效果又不行了
# ### 原因:
# - 训练集和测试集分布应该相同