赞
踩
感知器是最简单的ANN架构之一,它基于阈值逻辑单元(TLU)。输入输出是数字(而不是二进制开关值),并且每个输入连接都与权重相关联。TLU计算其输入的加权和(
z
=
w
1
x
1
+
w
2
x
2
+
.
.
.
+
w
n
x
n
=
x
⊤
w
z=w_1x_1+w_2x_2+...+w_nx_n=x^\top w
z=w1x1+w2x2+...+wnxn=x⊤w),然后将阶跃函数应用于该和并输出结果:(
h
w
(
x
)
=
s
t
e
p
(
z
)
h_w(x)=step(z)
hw(x)=step(z)),其中,
z
=
x
⊤
w
z=x^\top w
z=x⊤w。
感知机中使用的常见阶跃函数(假设阈值=0)
单个TLU可用于简单的线性二进制分类。
感知器仅由单层TLU组成,每个TLU连接到所有的输入。当一层中的所有神经元都连接到上一层中的每个神经元(即其输入神经元),该层称为全连接层或密集层。
感知器的输入被送到称为输入神经元的特殊直通神经元:它们输出被送入的任何输入。所有输入神经元形成输入层。此外,通常会添加一个额外的偏置特征(
x
0
=
1
x_0=1
x0=1):通常使用一种称为偏置神经元的特殊类型的神经元来表示该特征,该神经元始终输出1。下图的感知器可以将实例同时分为三个不同的二进制类,这使其成为多输出分类器。
计算全连接层的输出
h
W
,
b
=
ϕ
(
X
W
+
b
)
h_{W,b}=\phi (XW+b)
hW,b=ϕ(XW+b)
X代表输入特征的矩阵。每个实例一行,每个特征一列。
权重矩阵W包含除偏置神经元外的所有连接权重。在该层中,每个输入神经元一行,每个人工神经元一列。
偏置向量b包含偏置神经元和人工神经元之间的所有连接权重。每个人工神经元有一个偏置项。
函数
ϕ
\phi
ϕ称为激活函数:当人工神经元是TLU时,它是阶跃函数。
感知器如何训练?Hebb规则:两个神经元同时触发时,它们之间的连接权重会增加。具体来说,感知器一次被送入一个训练实例,并且针对每个实例进行预测。对于产生错误预测的每个输出神经元,它会增强来自输入的连接权重,这些权重将有助于正确的预测。感知器学习规则(权重更新):
w
i
,
j
(
下一步
)
=
w
i
,
j
+
η
(
y
j
−
y
j
^
)
x
i
w_{i,j}^{(下一步)}=w_{i,j}+\eta (y_j-\hat{y_j})x_i
wi,j(下一步)=wi,j+η(yj−yj^)xi
w
i
,
j
w_{i,j}
wi,j是第
i
i
i个输入神经元和第
j
j
j个输出神经元之间的连接权重。
x
i
x_i
xi是当前训练实例的第
i
i
i个输入值。
y
j
^
\hat{y_j}
yj^是当前训练实例的第
j
j
j个输出神经元的输出。
y
j
y_j
yj是当前训练实例的第
j
j
j个输出神经元的目标输出。
η
\eta
η是学习率。
每个输出神经元的决策边界都是线性的,因此感知器无法学习复杂的模式(就像逻辑回归分类器一样)。
Scikit-Learn提供了一个Perceptron类,该类实现了单个TLU网络。
from sklearn.datasets import load_iris
from sklearn.linear_model import Perceptron
iris = load_iris()
X = iris.data[:, (2, 3)] # petal length, petal width
y = (iris.target == 0).astype(int) # if iris.target == 0: 1, else 0.
per_clf = Perceptron()
per_clf.fit(X, y)
y_pred = per_clf.predict([[2, 0.5]])
print(y_pred)
python -m pip install virtualenv
输入以下命令创建一个隔离的Python环境:
cd E:\大四\大四上\NLP\ML
python -m virtualenv my_env
现在开始,每当想要激活这个环境,只需要打开终端并输入:
cd E:\大四\大四上\NLP\ML
.\my_env\Scripts\activate
要停用这个环境,用deactivate命令。当这个环境处于激活状态时,使用pip安装的任何软件包都将被安装在这个隔离的环境中,Python只拥有这些包的访问权限。
现在可以使用简单的pip命令安装必必需的模块及其依赖项了:
pip install jupyter matplotlib numpy scipy scikit-learn
python -m ipykernel install --user --name=python
现在可以输入以下命令,来启动Jupyter:
jupyter notebook
pip install tensorflow
要测试安装,则需要打开Python 或 Jupyter notebook,然后导入 TensorFlow 和 tf.keras 并打印其版本。
import tensorflow as tf
from tensorflow import keras
fashion_mnist = keras.datasets.fashion_mnist
(X_train_full, y_train_full), (X_test, y_test) = fashion_mnist.load_data()
X_valid, X_train = X_train_full[:5000] / 255.0, X_train_full[5000:] / 255.0
y_valid, y_train = y_train_full[:5000], y_train_full[5000:]
model = keras.models.Sequential()
# 创建一个Sequential模型(仅由顺序连接的单层堆栈组成,称为顺序API)
model.add(keras.layers.Flatten(input_shape=[28, 28]))
# 第一层是Flatten层,将每个输入图像转换成一维度组
model.add(keras.layers.Dense(300, activation="relu"))
# 具有300个神经元的Dense隐藏层,使用ReLU激活函数
model.add(keras.layers.Dense(100, activation="relu"))
# 具有100个神经元的Dense隐藏层,使用ReLU激活函数
model.add(keras.layers.Dense(10, activation="softmax"))
# 包含10个神经元的Dense输出层,使用softmax激活函数
model_0 = keras.models.Sequential([
keras.layers.Flatten(input_shape=[28, 28]),
keras.layers.Dense(300, activation="relu"),
keras.layers.Dense(100, activation="relu"),
keras.layers.Dense(10, activation="softmax")
])
model.compile(loss="sparse_categorical_crossentropy",
optimizer="sgd",
metrics=["accuracy"])
现在该模型已经准备好进行训练,我们只需要调用其fit()方法即可。
history = model.fit(X_train, y_train, epochs=30,
validation_data=(X_valid, y_valid))
import pandas as pd
import matplotlib.pyplot as plt
pd.DataFrame(history.history).plot(figsize=(8,5))
plt.grid(True)
plt.gca().set_ylim(0,1) # 设置竖轴范围为0~1
plt.show()
model.evaluate(X_test, y_test)
比如使用测试集的前3个实例来预测:
X_new = X_test[:3]
y_proba = model.predict(X_new)
y_proba.round(2)
import numpy as np
# y_pred = model.predict_classes(X_new)
y_pred = np.argmax(model.predict(X_new), axis=-1)
print(y_pred)
print(np.array(class_names)[y_pred])
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
housing = fetch_california_housing()
X_train_full, X_test, y_train_full, y_test = train_test_split(
housing.data, housing.target)
X_train, X_valid, y_train, y_valid = train_test_split(
X_train_full, y_train_full)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_valid = scaler.transform(X_valid)
X_test = scaler.transform(X_test)
import tensorflow as tf
from tensorflow import keras
model = keras.models.Sequential([
keras.layers.Dense(30, activation="relu", input_shape=X_train.shape[1:]),
keras.layers.Dense(1)
])
model.compile(loss="mean_squared_error", optimizer="sgd")
history = model.fit(X_train, y_train, epochs=20,
validation_data=(X_valid, y_valid))
mse_test = model.evaluate(X_test, y_test)
X_new = X_test[:3] # 假设这是3个新的实例
y_pred = model.predict(X_new)
print(y_pred)
input_ = keras.layers.Input(shape=X_train.shape[1:])
hidden1 = keras.layers.Dense(30, activation="relu")(input_)
hidden2 = keras.layers.Dense(30, activation="relu")(hidden1)
concat = keras.layers.Concatenate()([input_, hidden2])
output = keras.layers.Dense(1)(concat)
model = keras.Model(inputs=[input_], outputs=[output])
构建模型后,需要编译模型,对其进行训练,评估并使用它来进行预测。
import tensorflow as tf
from tensorflow import keras
input_A = keras.layers.Input(shape=[5], name="wide_input")
input_B = keras.layers.Input(shape=[6], name="deep_input")
hidden1 = keras.layers.Dense(30, activation="relu")(input_B)
hidden2 = keras.layers.Dense(30, activation="relu")(hidden1)
concat = keras.layers.concatenate([input_A, hidden2])
output = keras.layers.Dense(1, name="output")(concat)
model = keras.Model(inputs=[input_A, input_B], outputs=[output])
model.compile(loss="mse", optimizer=keras.optimizers.SGD(lr=1e-3))
X_train_A, X_train_B = X_train[:, :5], X_train[:, 2:]
X_valid_A, X_valid_B = X_valid[:, :5], X_valid[:, 2:]
X_test_A, X_test_B = X_test[:, :5], X_test[:, 2:]
X_new_A, X_new_B = X_test_A[:3], X_test_B[:3]
history = model.fit((X_train_A, X_train_B), y_train, epochs=20,
validation_data=((X_valid_A, X_valid_B), y_valid))
mse_test = model.evaluate((X_test_A, X_test_B), y_test)
y_pred = model.predict((X_new_A, X_new_B))
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。