吴恩达机器学习-C2W1L1-神经元和层

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

Tensorflow和Keras
Tensorflow是谷歌开发的机器学习包。2019年,谷歌将Keras集成到Tensorflow中,并发布了Tensorflow 2.0。Keras是一个由franois Chollet独立开发的框架,它为Tensorflow创建了一个简单的、以层为中心的接口。本课程将使用Keras接口。

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)

报错

No module named ‘tensorflow’

在这里插入图片描述【原因】:错误信息为ModuleNotFoundError: No module named ‘tensorflow’,其中tensorflow是我用到的一个第三方库。
1.点击进入控制台Terminal,输入pip show 第三方库的名称

pip install tensorflow

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

数据集

我们将使用课程一的例子,房价的线性回归。

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()

运行结果:
在这里插入图片描述

线性回归模型 /模型

未激活的神经元实现的函数与课程1线性回归相同:
f w , b ( x ( i ) ) = w ⋅ x ( i ) + b (1) f_{\mathbf{w},b}(x^{(i)}) = \mathbf{w}\cdot x^{(i)} + b \tag{1} fw,b(x(i))=wx(i)+b(1)

我们可以用一个神经元或单元定义一个层,并将其与熟悉的线性回归函数进行比较。

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

我们来看看权重。

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
plt_linear(X_train, Y_train, prediction_tf, prediction_np)

具有乙状体激活的神经元

s型激活的神经元/单元实现的功能与课程1逻辑回归相同:

f w , b ( x ( i ) ) = g ( w x ( i ) + b ) (2) f_{\mathbf{w},b}(x^{(i)}) = g(\mathbf{w}x^{(i)} + b) \tag{2} fw,b(x(i))=g(wx(i)+b)(2)

where g ( x ) = s i g m o i d ( x ) g(x) = sigmoid(x) g(x)=sigmoid(x)
让我们将 w w w b b b设置为一些已知值并检查模型。

数据集

我们将使用课程1中的一个例子,逻辑回归。

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
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()

逻辑神经元

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

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

’ model.summary() '显示模型中的层数和参数数量。在这个模型中只有一层,那一层只有一个单元。该单元有两个参数: w w w b b 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)

上面的阴影反映了从0到1变化的s形的输出。

祝贺

你建立了一个非常简单的神经网络,并探索了神经元与课程1中的线性回归和逻辑回归的相似性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值