通过简单实践理解机器学习概念(flux.jl)
jake484
于 2021-09-17 10:48:37 发布 104

文章标签: 神经网络 机器学习
版权
Flux.jl简介
Flux是什么

Flux 是一个纯 Julia ML 堆栈,可让通过机器学习相关算法构建预测模型。
怎样构建

提供训练和测试数据
构建具有可配置参数的模型以进行预测
通过调整参数来迭代训练模型以改进预测
验证模型

实例

假设一个预测目标: y = x + 1 y = x + 1 y=x+1

using Flux
f(x) = x + 1

    1
    2

    f (generic function with 1 method)

获得训练数据与测试数据

x_train = [0 1 2 3 4]
y_train = f.(x_train)

x_test = [5 6 7 8 9]
y_test = f.(x_test)

    1
    2
    3
    4
    5

构建预测模型

model = Dense(1, 1) #构建训练模型

    1

Dense可以视为神经网络,第一个参数为输入量个数,第二个参数为输出量个数。所以上面构建的为一个输入量与一个输出量(和预测目标相符)

model.weight #权重

    1

    1×1 Matrix{Float32}:
    -1.0748355

这是自动初始化的结果

model.bias   #偏量

    1

    1-element Vector{Float32}:
    0.0

predict = model

    1

这是因为Dense(1, 1)实现了功能σ(Wx+b),例如:

predict(x_train)

    1

    1×5 Matrix{Float32}:
    1.07484 0.0 -1.07484 -2.14967 -3.22451

相当于是x前面的系数为权重的线性方程。

接下来设置损失函数,使用均方差mse

loss(x,y)= Flux.Losses.mse(predict(x),y)

    1

可以看一下现在的loss

loss(x_train, y_train)

    1

    18.064499

接下来设置训练数据与训练参数

data = [(x_train, y_train)]
parameters = params(predict)

    1
    2

Params([Float32[-1.0748355], Float32[0.0]])

此时参数就是权重与偏量
训练

通过train!来训练,训练后查看loss

train!(loss, parameters, data, opt)
loss(x_train, y_train)

    1
    2

    1.8237922

好像还不错?再看看测试集的结果怎么样

predict(x_test)

    1

    1×5 Matrix{Float32}:
    2.09523 2.4653 2.83536 3.20543 3.57549

额,确实不咋地。因为我们期望的结果是y_test,也就是
[5 6 7 8 9],为什么呢?因为才训练了一次而已。多整几次!
改进预测

训练个200次

for i in 1:200
    train!(loss, parameters, data, opt)
    println(loss(x_train, y_train))
end

    1
    2
    3
    4

最后一行结果是:3.9790393e-14,这个loss确实可以
验证

最后看一下参数

parameters

    1

    Params([Float32[1.0000001], Float32[0.99999976]])

是不是就是: y = x + 1 y=x+1 y=x+1

看看测试集的结果怎么样

predict(x_test)

    1

    1×5 Matrix{Float32}:
    5.0 6.0 7.0 8.0 9.0

————————————————
版权声明:本文为CSDN博主「jake484」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jake484/article/details/120344229

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐