Skip to content

Commit 4502217

Browse files
committed
第六章代码小修改
1 parent 588b3d2 commit 4502217

File tree

2 files changed

+172
-11
lines changed

2 files changed

+172
-11
lines changed

chapter6/inspect_jena_weather_dataset.py

+12-11
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import os
2+
23
import numpy as np
3-
from matplotlib import pyplot as plt
4-
from keras.models import Sequential
54
from keras import layers
5+
from keras.models import Sequential
66
from keras.optimizers import RMSprop
7+
from matplotlib import pyplot as plt
78

89
data_dir = ''
910
fname = os.path.join(data_dir, 'jena_climate_2009_2016.csv')
@@ -149,14 +150,9 @@ def generator(data, lookback, delay, min_index, max_index, shuffle=False, batch_
149150
validation_steps=val_steps)
150151
'''
151152
'''
152-
# 使用一个正则化后多层的GRU模型
153+
# 使用一个双向的GRU模型
153154
model = Sequential()
154-
model.add(layers.GRU(32,
155-
dropout=0.1,
156-
recurrent_dropout=0.5,
157-
return_sequences=True,
158-
input_shape=(None, float_data.shape[-1])))
159-
model.add(layers.GRU(64, activation='relu', dropout=0.1, recurrent_dropout=0.5))
155+
model.add(layers.Bidirectional(layers.GRU(32), input_shape=(None, float_data.shape[-1])))
160156
model.add(layers.Dense(1))
161157
162158
model.compile(optimizer=RMSprop(), loss='mae')
@@ -166,9 +162,14 @@ def generator(data, lookback, delay, min_index, max_index, shuffle=False, batch_
166162
validation_steps=val_steps)
167163
'''
168164

169-
# 使用一个双向的GRU模型
165+
# 使用一个正则化后多层的GRU模型
170166
model = Sequential()
171-
model.add(layers.Bidirectional(layers.GRU(32), input_shape=(None, float_data.shape[-1])))
167+
model.add(layers.GRU(32,
168+
dropout=0.1,
169+
recurrent_dropout=0.5,
170+
return_sequences=True,
171+
input_shape=(None, float_data.shape[-1])))
172+
model.add(layers.GRU(64, activation='relu', dropout=0.1, recurrent_dropout=0.5))
172173
model.add(layers.Dense(1))
173174

174175
model.compile(optimizer=RMSprop(), loss='mae')
+160
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
import os
2+
3+
import numpy as np
4+
from keras import layers
5+
from keras.models import Sequential
6+
from keras.optimizers import RMSprop
7+
from matplotlib import pyplot as plt
8+
9+
data_dir = ''
10+
fname = os.path.join(data_dir, 'jena_climate_2009_2016.csv')
11+
12+
f = open(fname)
13+
data = f.read()
14+
f.close()
15+
16+
lines = data.split('\n')
17+
header = lines[0].split(',')
18+
lines = lines[1:]
19+
20+
print(header)
21+
print(len(lines))
22+
23+
# 解析数据
24+
float_data = np.zeros((len(lines), len(header) - 1))
25+
for i, line in enumerate(lines):
26+
values = [float(x) for x in line.split(',')[1:]]
27+
float_data[i, :] = values
28+
29+
# 画出温度序列
30+
temp = float_data[:, 1] # 温度序列
31+
plt.plot(range(len(temp)), temp)
32+
plt.show()
33+
34+
# 画出前10天的温度序列
35+
plt.plot(range(1440), temp[:1440])
36+
plt.show()
37+
38+
# 把前200000个序列作为训练数据,正规化
39+
mean = float_data[:200000].mean(axis=0)
40+
float_data -= mean
41+
std = float_data[:200000].std(axis=0)
42+
float_data /= std
43+
44+
45+
# 定义一个生成序列样本和目标序列的生成器
46+
# data:正则化后的原始数据
47+
# lookback:往前看多少步
48+
# delay:往后看第多少步
49+
# min_index和max_index:限制序列的选择区间
50+
# shuffle:是否打乱数据
51+
# batch_size:每个样本多少数据
52+
# step:多少一个周期,设置为6表示一小时一个数据点
53+
def generator(data, lookback, delay, min_index, max_index, shuffle=False, batch_size=128, step=6):
54+
if max_index is None:
55+
max_index = len(data) - delay - 1
56+
i = min_index + lookback
57+
while 1:
58+
if shuffle:
59+
rows = np.random.randint(min_index + lookback, max_index, size=batch_size)
60+
else:
61+
if i + batch_size >= max_index:
62+
i = min_index + lookback
63+
rows = np.arange(i, min(i + batch_size, max_index))
64+
i += len(rows)
65+
66+
samples = np.zeros((len(rows), lookback // step, data.shape[-1]))
67+
targets = np.zeros((len(rows),))
68+
for j, row in enumerate(rows):
69+
indices = range(rows[j] - lookback, rows[j], step)
70+
samples[j] = data[indices]
71+
targets[j] = data[rows[j] + delay][1]
72+
yield samples, targets
73+
74+
75+
# 准备训练、验证和测试数据生成器
76+
lookback = 720
77+
step = 3
78+
delay = 144
79+
batch_size = 128
80+
81+
train_gen = generator(float_data,
82+
lookback=lookback,
83+
delay=delay,
84+
min_index=0,
85+
max_index=200000,
86+
shuffle=True,
87+
step=step,
88+
batch_size=batch_size)
89+
val_gen = generator(float_data,
90+
lookback=lookback,
91+
delay=delay,
92+
min_index=200001,
93+
max_index=300000,
94+
shuffle=True,
95+
step=step,
96+
batch_size=batch_size)
97+
test_gen = generator(float_data,
98+
lookback=lookback,
99+
delay=delay,
100+
min_index=300001,
101+
max_index=None,
102+
shuffle=True,
103+
step=step,
104+
batch_size=batch_size)
105+
106+
# 看到所有验证数据需要生成的次数
107+
val_steps = (300000 - 200001 - lookback) // batch_size
108+
109+
# 看到所有测试数据需要生成的次数
110+
test_steps = (len(float_data) - 300001 - lookback) // batch_size
111+
112+
'''
113+
# 使用一个一维卷积层和GRU层结合的模型
114+
model = Sequential()
115+
model.add(layers.Conv1D(32, 5, activation='relu',
116+
input_shape=(None, float_data.shape[-1])))
117+
model.add(layers.MaxPooling1D(3))
118+
model.add(layers.Conv1D(32, 5, activation='relu'))
119+
model.add(layers.GRU(32, dropout=0.1, recurrent_dropout=0.5))
120+
model.add(layers.Dense(1))
121+
122+
model.compile(optimizer=RMSprop(), loss='mae')
123+
history = model.fit_generator(train_gen, steps_per_epoch=500,
124+
epochs=40,
125+
validation_data=val_gen,
126+
validation_steps=val_steps)
127+
'''
128+
129+
# 使用简单一维卷积层的模型
130+
model = Sequential()
131+
model.add(layers.Conv1D(32, 5, activation='relu',
132+
input_shape=(None, float_data.shape[-1])))
133+
model.add(layers.MaxPooling1D(3))
134+
model.add(layers.Conv1D(32, 5, activation='relu'))
135+
model.add(layers.MaxPooling1D(3))
136+
model.add(layers.Conv1D(32, 5, activation='relu'))
137+
model.add(layers.GlobalMaxPool1D())
138+
model.add(layers.Dense(1))
139+
140+
model.compile(optimizer=RMSprop(), loss='mae')
141+
history = model.fit_generator(train_gen, steps_per_epoch=500,
142+
epochs=40,
143+
validation_data=val_gen,
144+
validation_steps=val_steps)
145+
146+
# 画出训练过程中损失函数值的变化曲线
147+
loss = history.history['loss']
148+
val_loss = history.history['val_loss']
149+
150+
epochs = range(1, len(loss) + 1)
151+
152+
plt.figure()
153+
154+
plt.plot(epochs, loss, 'bo', label='Training loss')
155+
plt.plot(epochs, val_loss, 'b', label='Validation loss')
156+
plt.title('Training and validation loss')
157+
plt.legend()
158+
159+
plt.show()
160+
print('end')

0 commit comments

Comments
 (0)