1.从最简单的神经网路开始
在学习机器学习的过程中,大家对神经网络应该都有一个基本概念:神经网络就像一个函数拟合器,它可以拟合任意函数。
def NeuralNetwork(inputs, weight): # 定义神经网络
prediction = inputs * weight # 将数据与权重相乘
return prediction
inputs = 2 # 输入数据,可随意更换
weight = -1 # 权重
pred = NeuralNetwork(inputs, weight) # 前向传播,即获得预测结果
print(pred)
刚刚我们完成的就是前向传播的过程,也就是一个预测的过程 。
预测其实就是神经网络对输入数据进行“思考”后得到的结果。
2.神经网络工作原理概述
上面的那个神经网络将输入乘以权重,将输入数据“缩放”一定的比例。
神经网络的交互:
1.接受输入的变量,并以此作为信息来源;
2.拥有权重变量,并以此作为知识;
3.融合信息和知识,输出预测结果
目前为止所有的神经网络都是这样工作的,他使用权重中的知识解释输入数据的信息。
另一种理解神经网络权重的方法是将权重作为网络的输入和预测之间敏感度的度量:如果权重非常高,即使是最小的输入也可以对预测结果产生非常大的影响;如果权重很小,那就算是很大的输入也只能对预测结果产生很小的扰动。
3.使用多个输入进行预测
在实际场景中,如果能给神经网络提供的信息越多,那么神经网络应该能做出更准确的预测。
import numpy as np
weights = np.array([0.012, 0.3, 0.25])
inputs = np.array([26, 0.75, 1.2])
def NeuralNetwork(inputs, weights):
pred=inputs.dot(weights)
#dot()函数可以通过numpy库调用,也可以由数组实例对象进行调用。a.dot(b) 与 np.dot(a,b)效果相同。
return pred
pred = NeuralNetwork(inputs, weights)
print(pred)
4.只用一个输入做出多个输出
多输出可能是比多输入更简单的拓展。如果是3个输出,则预测过程与三个单一权重的独立神经网络是一样的。需要注意的是,这3个预测结果完全独立。
假设我们在一场球赛上,想通过某个球队的胜负记录预测球员的心情(是高兴还是悲伤)、下一场比赛的结果以及队员的受伤比例,来看看这个例子怎么做:
import numpy as np
weights=np.arry([0.3,0.2,0.9])
inputs=0.65
def NeuralNetwork(inputs,weights):
pred=inputs*weights
return pred
pred = NeturalNetwork(inputs,weights)
#print(pred)
print("受伤比例预测:{}".format(pred[0]))
print("比赛胜负预测:{}".format(pred[1]))
print("悲伤程度预测:{}".format(pred[2]))
5.基于多个输入得到多个输出
基于给定的多个输入,神经网络预测得到多个输出。
假设我们在一场球赛上,想通过某个球队的胜负记录、粉丝数和球员数量来预测球员的心情(是高兴还是悲伤)、下一场比赛的结果以及队员的受伤比例,来看看这个例子怎么做:
import numpy as np
#从左到右分别是:[是否受伤, 是否胜利, 是否难过]
weights = np.array([[0.02, 0.01, 0.05], #胜负记录
[0.001, 0.025, 0.04], #粉丝数量
[0.013, 0.03, 0.001]]) #球员数量
inputs = np.array([0.65, 12.0, 8.0]) #分别是该球队的胜负记录、粉丝数量、球员数量
def NeuralNetwork(inputs, weights):
pred = inputs.dot(weights)
return pred
pred = NeuralNetwork(inputs, weights)
# print(pred)
print("受伤比例预测:{}".format(pred[0]))
print("比赛胜负预测:{}".format(pred[1]))
print("悲伤程度预测:{}".format(pred[2]))
6.用预测结果进一步预测
神经网络是可以堆叠的!可以将一个网络的输出提供给另一个网路作为输入。这相当于两个连续的向量矩阵乘法。
这样做的原因是:在处理复杂问题时,对于单一权重矩阵来说过于复杂(即参数的数量不够)。
建立大等于n的最小完全平方数模型:
# 生成输入数据
import numpy
num_inputs=1
num_examples=10
features = numpy.random.randint(1, 10, (num_examples, num_inputs))
import math
def PerfectSquare(n): # 求最小完全平方数的方法
result = 0
if n >= 0:
result = n ** 0.5
result = math.ceil(result)
result = result ** 2
return result
# 输出1~10的最小完全平方数
for item in range(1, 10):
print(PerfectSquare(item), end=" ")
# 生成输入对应的标签
labels = []
for item in features[:,0].tolist():
labels.append(PerfectSquare(item))
labels = numpy.expand_dims(labels, axis=-1) #注意:需要在最后增加一个维度
# 将数据转换成tensor
import paddle
features = features.astype('float32')
labels = labels.astype('float32')
train_datas = paddle.to_tensor(features)
y_true = paddle.to_tensor(labels)
#.构建线性回归模型
import paddle
model = paddle.nn.Linear(in_features=1, out_features=1) # 使用最简单的线性变换层
# 定义Momentum优化器
lr = paddle.optimizer.lr.CosineAnnealingDecay(learning_rate=0.25, T_max=100)
optimizer = paddle.optimizer.Adam(learning_rate=lr,
parameters=model.parameters(),
weight_decay=paddle.regularizer.L2Decay(0.0002))
mse_loss = paddle.nn.MSELoss() # 计算预测值和目标值的均方差误差
#模型训练
for i in range(100):
y_predict = model(train_datas)
loss = mse_loss(y_predict, y_true)
loss.backward()
optimizer.step()
optimizer.clear_grad()
print(loss.numpy())
#模型检验
infer_features = numpy.random.randint(1, 10, (1, 1)).astype('float32')
infer_features = paddle.to_tensor(infer_features)
fetch_list = model(infer_features)