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 = load_coffee_data();
print(X.shape, Y.shape)
这是关于烘焙咖啡的时间和温度烘焙出来的是否为好咖啡的数据集
plt_roast(X,Y)

如果数据归一化,将更快地对数据进行权重拟合(反向传播)。数据中的每个特征都被归一化为具有相似的范围。
下面的过程使用Keras normalization layer. 它有以下步骤:

Sequential将各层线性排列,这里的3和1是units参数,指神经元数量,dense也是调的包
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') #提高数值稳定性
]
)
自己实现:
使用for循环访问层中的每个单元(j),并对该单元的权重(W[:,j])进行点积,然后求出单元(b[j])的偏差之和,形成z。然后可以将激活函数“g(z)”应用于该结果。
def my_dense(a_in, W, b, g): """ Computes dense layer Args: a_in (ndarray (n, )) : Data, 1 example W (ndarray (n,j)) : Weight matrix, n features per unit, j units b (ndarray (j, )) : bias vector, j units g activation function (e.g. sigmoid, relu..) Returns a_out (ndarray (j,)) : j units| """ units = W.shape[1] a_out = np.zeros(units) for j in range(units): w = W[:,j] z = np.dot(w, a_in) + b[j] a_out[j] = g(z) return(a_out) def my_sequential(x, W1, b1, W2, b2): a1 = my_dense(x, W1, b1, sigmoid) a2 = my_dense(a1, W2, b2, sigmoid) return(a2)'运行

sigmoid函数其实不适合在最后一层出现,会导致稳定性增加
看看模型情况
model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
layer1 (Dense) (None, 3) 9
layer2 (Dense) (None, 1) 4
============================================================