导入用到的库
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('./deeplearning.mplstyle')
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from lab_utils_common import dlc
from lab_coffee_utils import load_coffee_data, plt_roast, plt_prob, plt_layer, plt_network, plt_output_unit
import logging
logging.getLogger("tensorflow").setLevel(logging.ERROR)
tf.autograph.set_verbosity(0)
载入数据,X记载咖啡烘焙的温度和持续时间,Y实际为表现,即咖啡豆烘焙结果的好坏
X,Y = load_coffee_data();
print(X.shape, Y.shape)
运行结果:(200,2) (200,1)
plt_roast(X,Y)
展示了原始数据以及分区
print(f"Temperature Max, Min pre normalization: {np.max(X[:,0]):0.2f}, {np.min(X[:,0]):0.2f}")
print(f"Duration Max, Min pre normalization: {np.max(X[:,1]):0.2f}, {np.min(X[:,1]):0.2f}")
norm_l = tf.keras.layers.Normalization(axis=-1)
norm_l.adapt(X) # learns mean, variance
Xn = norm_l(X)
print(f"Temperature Max, Min post normalization: {np.max(Xn[:,0]):0.2f}, {np.min(Xn[:,0]):0.2f}")
print(f"Duration Max, Min post normalization: {np.max(Xn[:,1]):0.2f}, {np.min(Xn[:,1]):0.2f}")
先以两位小数的精度读出温度、烘焙持续时长的最大值和最小值
数据的标准化 :用keras库进行
axis=-1代表在列上进行标准化
调用adapt方法,让标准化层学习数据的均值和方差,X是输入数据,并将标准化后的值赋给Xn
Xt = np.tile(Xn,(1000,1))
Yt= np.tile(Y,(1000,1))
print(Xt.shape, Yt.shape)
np.tile(A,reps) 会将数组 A 按照 reps 指定的模式进行重复。
(1000,1)代表行重复1000次,列重复1次
运行结果:(200000,2)(200000,1)
创建神经网络
tf.random.set_seed(1234) # applied to achieve consistent results
model = Sequential(
[
tf.keras.Input(shape=(2,)),
Dense(3, activation='sigmoid', name = 'layer1'),
Dense(1, activation='sigmoid', name = 'layer2')
]
)
set_seed(1234)的主要作用是确保神经网络在不同运行中的初始状态、训练过程和结果具有一致性和可重复性。
shape=(2,)定义了输入数据的形状,这里表示输入数据是一个二维向量。如果后面的model.fit规定了输入,这步可省略
Dense(神经单元个数,激活函数,名称)
model.summary()
介绍输出模型各层的参数状况,运行结果:
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
layer1 (Dense) (None, 3) 9
layer2 (Dense) (None, 1) 4
=================================================================
Total params: 13
Trainable params: 13
Non-trainable params: 0
_________________________________________________________________
Param = (输入数据维度+1)* 神经元个数
+1,是因为到每个神经元都有一个Bias。
第二层的输入维度是上一层神经元的个数,因此(3+1)*1=4
plt_layer(X,Y.reshape(-1,),W1,b1,norm_l)
调用该函数观察第一个隐藏层每个神经元训练后的结果
其中:颜色映射代码如下:
cmap = plt.get_cmap('Blues')#获取 'Blues' 颜色映射
new_cmap = truncate_colormap(cmap, 0.0, 0.5)# 截取颜色映射的一部分,即把0-0.5的区域用蓝色映射
pcm = ax.pcolormesh(tmp_x0, tmp_x1, z,
norm=cm.colors.Normalize(vmin=0, vmax=1), # 归一化颜色值
cmap=new_cmap, shading='nearest', alpha = 0.9) # 绘制颜色填充图
ax.figure.colorbar(pcm, ax=ax)# 添加颜色条,显示颜色与预测概率值的对应关系,帮助解释颜色填充图。
输出层结果可视化:
plt_output_unit(W2,b2)
由于输出层的输入是三个神经元,所以用三维图形展示
pcm = ax.scatter(x, y, z, c=d, cmap=cmap, alpha = 1 )
#cmap 是 'Blues' 颜色映射,它将 d 中的值映射到蓝色调的颜色范围。具体来说:较小的值会映射到较浅的蓝色。较大的值会映射到较深的蓝色。
训练结果: