吴恩达机器学习_可选实验_神经元和层

        在本实验中,我们将探索神经元/单元和层的内部工作原理。特别是,该实验室将与您在课程 1 中掌握的模型、回归/线性模型和逻辑模型进行比较。该实验室将介绍 Tensorflow,并演示如何在该框架中实现这些模型

导包

        该实验代码主要使用的是Tensorflow 

import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.keras.layers import Dense, Input
from tensorflow.keras import Sequential
from tensorflow.keras.losses import MeanSquaredError, BinaryCrossentropy
from tensorflow.keras.activations import sigmoid
from lab_utils_common import dlc
from lab_neurons_utils import plt_prob_1d, sigmoidnp, plt_linear, plt_logistic
plt.style.use('./deeplearning.mplstyle')
import logging
//导入上述所有包的内容
logging.getLogger("tensorflow").setLevel(logging.ERROR)
tf.autograph.set_verbosity(0)
//日志文件前者是控制只输出error的错误日志
//后者set_verbosity(0)函数是用来设置日志级别为0.
//该级别越大,日志显示内容越详细为0表示不显示日志。
//这里主要是只使用autograph进行作图,而不用输入日志。

        注意,如果你使用的是本地的编译器,lab_utils_common和lab_neurons_utils两个包要从吴老师的jupyter中获取。同时plt.style.use所使用的./deeplearning.mplstyle文件也同样如此

无激活神经元-回归/线性模型

数据集

        这里使用的是第一课房价预测的线性回归例子   

X_train = np.array([[1.0], [2.0]], dtype=np.float32)           #(size in 1000 square feet)
Y_train = np.array([[300.0], [500.0]], dtype=np.float32)       #(price in 1000s of dollars)

fig, ax = plt.subplots(1,1)
ax.scatter(X_train, Y_train, marker='x', c='r', label="Data Points")
ax.legend( fontsize='xx-large')
ax.set_ylabel('Price (in 1000s of dollars)', fontsize='xx-large')
ax.set_xlabel('Size (1000 sqft)', fontsize='xx-large')
plt.show()

         x_train和y_train是训练集数据,fig,ax包括后续调用的ax的函数都是使用pyplot进行构图,如下

回归/线性模型

        由未激活的神经元实现的功能与课程 1 中的线性回归相同:

        我们构建一个神经元并比较它和我们所熟悉的线性回归函数

linear_layer = tf.keras.layers.Dense(units=1, activation = 'linear', )

        如果你还有神经网络课程上的印象,你应该认识tf.xxxxxx.Dense这个函数,是tensorflow中 搭建层的函数,其中units的参数是层中神经元的数量,activation的参数是该层神经元的激活函数。这里使用的是线性激活函数,说明输出的激活是由输入数据线性计算而来的。

        获取该神经元的权重

linear_layer.get_weights()

        没有权重,因为权重尚未实例化。让我们在 X_train 的一个示例中尝试该模型。这将触发权重的实例化。请注意,图层的输入必须是二维的,因此我们将对其进行重塑。

a1 = linear_layer(X_train[0].reshape(1,1))
print(a1)

        结果是一个形状为 (1,1) 的张量(数组的另一个名称)或一个条向量。现在让我们看看权重和偏差。这些权重被随机初始化为小数字,偏差默认初始化为零。

w, b= linear_layer.get_weights()
print(f"w = {w}, b={b}")

        具有单个输入特征的线性回归模型 (1) 将具有单个权重和偏差。这与我们上面linear_layer的尺寸相匹配。权重初始化为随机值,因此让我们将它们设置为一些已知值。

set_w = np.array([[200]])
set_b = np.array([100])

# set_weights takes a list of numpy arrays
linear_layer.set_weights([set_w, set_b])
print(linear_layer.get_weights())

        我们来比较方程1和输出层

a1 = linear_layer(X_train[0].reshape(1,1))
print(a1)
alin = np.dot(set_w,X_train[0].reshape(1,1)) + set_b
print(alin)

 

它们产生相同的值!现在,我们可以使用线性层对训练数据进行预测。

prediction_tf = linear_layer(X_train)
prediction_np = np.dot(X_train, set_w) + set_b
print(prediction_tf)
print(prediction_np)

plt_linear(X_train, Y_train, prediction_tf, prediction_np)

sigmoid激活的神经元

由具有 Sigmoid的神经元/单元实现的功能与课程 1 中的逻辑回归相同:

数据集

        这里的使用reshape对矩阵进行重塑,正如老师课上所述,tensorflow中所处理的数据格式是矩阵即二位数组,所以这里进行了重塑。reshape的参数为负数表示任意,这里则是重塑成任意行(按数组的数量具体而定)一列的矩阵

        然后y_train==1这里使用了numpy数组的广播机制,得到一个bool类型的数组,长度和y_train一样,数组中的值则是看y_train中等于1为true否则为false。同理y_train==0也是如此,只是比较对象为0

X_train = np.array([0, 1, 2, 3, 4, 5], dtype=np.float32).reshape(-1,1)  # 2-D Matrix
Y_train = np.array([0,  0, 0, 1, 1, 1], dtype=np.float32).reshape(-1,1)  # 2-D Matrix

pos = Y_train == 1
neg = Y_train == 0
print(pos)
print(neg)
print(X_train[pos])

pos = Y_train == 1
neg = Y_train == 0

fig,ax = plt.subplots(1,1,figsize=(4,3))
ax.scatter(X_train[pos], Y_train[pos], marker='x', s=80, c = 'red', label="y=1")
ax.scatter(X_train[neg], Y_train[neg], marker='o', s=100, label="y=0", facecolors='none', 
              edgecolors=dlc["dlblue"],lw=3)

ax.set_ylim(-0.08,1.1)
ax.set_ylabel('y', fontsize=12)
ax.set_xlabel('x', fontsize=12)
ax.set_title('one variable plot')
ax.legend(fontsize=12)
plt.show()

 

逻辑神经元

        我们可以通过添加 sigmoid 激活来实现“逻辑神经元”。神经元的功能由上述(2)描述。
本节将创建一个包含逻辑层的 Tensorflow 模型,以演示创建模型的替代方法。Tensorflow 最常用于创建多层模型。顺序模型是构建这些模型的一种便捷方法。

model = Sequential(
    [
        tf.keras.layers.Dense(1, input_dim=1,  activation = 'sigmoid', name='L1')
    ]
)

        model.summary() 显示模型中的层数和参数数量。此模型中只有一个层,而该层只有一个单元。该单位有两个参数,w 和 b

model.summary()

logistic_layer = model.get_layer('L1')
w,b = logistic_layer.get_weights()
print(w,b)
print(w.shape,b.shape)

将权重和偏差设置成确定的值

set_w = np.array([[2]])
set_b = np.array([-4.5])
# set_weights takes a list of numpy arrays
logistic_layer.set_weights([set_w, set_b])
print(logistic_layer.get_weights())

 

比较方程2和层的输出

a1 = model.predict(X_train[0].reshape(1,1))
print(a1)
alog = sigmoidnp(np.dot(set_w,X_train[0].reshape(1,1)) + set_b)
print(alog)

它们产生相同的值!现在,我们可以使用逻辑层和 NumPy 模型对训练数据进行预测。

plt_logistic(X_train, Y_train, model, set_w, set_b, pos, neg)

得到相同的结果。

  • 23
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值