废话不多说,直接看效果,效果图是我用工具 ScreenToGif 处理后的结果,实际动作偏慢些。
效果示例]
附上源码及介绍:
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
#如果想在jupyter跑,请加上%matplotlib atuo
# 记录损失,这里我没用上,有兴趣可以自己输出损失曲线
class History(tf.keras.callbacks.Callback):
def on_train_begin(self, logs={}):
self.losses = []
# 每epoch一次(即一次feed batch,输出一个loss)
def on_epoch_end(self, epoch, logs={}):
self.losses.append(logs.get('loss'))
# 自定义模拟函数,可以自己定制
def function():
x_data = np.linspace(-1, 1, 300)[:, np.newaxis]
noise = np.random.normal(0, 0.05, x_data.shape)
y_data = np.power(x_data, 3) + np.square(x_data) - 0.05 + noise
return x_data, y_data
# 建立神经模型
def build_model():
model = tf.keras.Sequential([
tf.keras.layers.Flatten(input_shape=(1,)), # 将输入的维度压缩成一个维度
tf.keras.layers.Dense(30, activation='relu'), # 1个隐藏层,10个units,激活函数为relu(实现非线性变换是因为relu能把小于0部分消掉,实现矩阵的稀疏性)
# tf.keras.layers.Dense(10, activation='relu'), #这里我屏蔽了,有需要可以自己加层数
tf.keras.layers.Dropout(0.2), # 随机丢弃0.2,防止过拟合
tf.keras.layers.Dense(1)
])
optimizer = tf.keras.optimizers.Adam(0.001)
model.compile(optimizer=optimizer, loss="mse")
return model
if __name__ == '__main__':
x_data, y_data = function()
# plt.plot(x_data, y_data)
model = build_model()
history = History()
# plot the real data(画出真实图)
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1) # 画子图,(1, 1, 1)一行一列,第一个
ax.plot(x_data, y_data)
plt.ion() # 作用:打开交互模式,默认为阻塞,即plt.show后程序不能运行,则不能跑动态图
plt.show()
for i in range(200):
model.fit(x_data, y_data, batch_size=150, epochs=5, callbacks=[history])
if i % 2 == 0:
try:
# 移除上一条曲线
ax.lines.remove(lines[0])
except Exception:
pass
y_pred = model.predict(x_data)
lines = ax.plot(x_data, y_pred)
plt.pause(1)