让我们尝试制作MobileNet V. 2
在嘈杂的图像上找到一条亮带。是的,使用深度卷积网络来实现这样的策略有点过分了,但最初它的目的就像烟雾测试一样,以确保模型有效。我们将使用合成数据对其进行训练:
import numpy as np
import tensorflow as tf
from matplotlib import pyplot as plt
SHAPE = (32, 320, 1)
def gen_sample():
while True:
data = np.random.normal(0, 1, SHAPE)
i = np.random.randint(0, SHAPE[1]-8)
data[:,i:i+8,:] += 4
yield data.astype(np.float32), np.float32(i)
ds = tf.data.Dataset.from_generator(gen_sample, output_signature=(
tf.TensorSpec(shape=SHAPE, dtype=tf.float32),
tf.TensorSpec(shape=(), dtype=tf.float32))).batch(100)
d, i = next(gen_sample())
plt.figure()
plt.imshow(d)
plt.show()
现在我们构建并训练一个模型:
model = tf.keras.models.Sequential([
tf.keras.applications.MobileNetV2(
input_shape=SHAPE, include_top=False, weights=None, alpha=0.5),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(1)
])
model.compile(
optimizer=tf.keras.optimizers.Adam(
learning_rate=tf.keras.optimizers.schedules.ExponentialDecay(
initial_learning_rate=0.01, decay_steps=1000, decay_rate=0.9)),
loss='mean_squared_error')
history = model.fit(ds, steps_per_epoch=10, epochs=40)
我们使用生成的数据,所以我们不需要验证集,不是吗?所以我们可以观察损失如何减少。而且它确实减少得很好:
Epoch 1/40
10/10 [==============================] - 27s 2s/step - loss: 15054.8417
Epoch 2/40
10/10 [==============================] - 23s 2s/step - loss: 193.9126
Epoch 3/40
10/10 [==============================] - 24s 2s/step - loss: 76.9586
Epoch 4/40
10/10 [==============================] - 25s 2s/step - loss: 68.8521
...
Epoch 37/40
10/10 [==============================] - 20s 2s/step - loss: 4.5258
Epoch 38/40
10/10 [==============================] - 20s 2s/step - loss: 22.1212
Epoch 39/40
10/10 [==============================] - 20s 2s/step - loss: 28.4854
Epoch 40/40
10/10 [==============================] - 20s 2s/step - loss: 18.0123
训练碰巧没有达到最佳结果,但它仍然应该是合理的:答案应该在真实值±8左右。我们来测试一下:
d, i = list(ds.take(1))[0]
model.evaluate(d, i)
np.stack((model.predict(d).ravel(), i.numpy()), 1)[:10,]
4/4 [==============================] - 0s 32ms/step - loss: 16955.7871
array([[ 66.84666 , 222. ],
[ 66.846664, 46. ],
[ 66.846664, 71. ],
[ 66.84668 , 268. ],
[ 66.846664, 86. ],
[ 66.84668 , 121. ],
[ 66.846664, 301. ],
[ 66.84667 , 106. ],
[ 66.84665 , 138. ],
[ 66.84667 , 95. ]], dtype=float32)
哇!如此巨大的评价损失从何而来?为什么模型不断预测相同的愚蠢值?训练期间一切都那么美好!
事实上,在一天左右的时间里,我意识到发生了什么事,但我向其他人提供了解决这个谜题并赚取一些积分的可能性。