Knet笔记

Knet深度学习框架实战

Knet笔记

Knet(发音为“kay-net”)是Koç大学的深度学习框架,它基于julia,使用动态计算图,支持GPU操作和自动区分。

版本控制及权限控制

本文使用的版本:Knet 1.0.0、AutoGrad 1.0.0、(CUDAapi 0.5.0)

(不控制版本的话每次使用时都会自动更新,自动更新可能会有bug)


Pkg.add("Knet")

Pkg.rm("AutoGrad")

Pkg.add(PackageSpec(name="AutoGrad",version="1.0.0"))

Pkg.build("Knet")

Pkg.pin(PackageSpec(name="Knet",version="1.0.0"))

Pkg.rm("AutoGrad")

Pkg.add(PackageSpec(name="AutoGrad",version="1.0.0"))

Pkg.build("AutoGrad")

Pkg.pin(PackageSpec(name="AutoGrad",version="1.0.0"))

赋予权限:sudo chmod -R 777 ~/.julia/

example

  • 线性回归

using Knet

#定义模型:

#其中x每列是一个数据,列数是数据的数目;y列数为数据的数目。

#w第一个元素为行向量,第二个元素为标量。w为一个参数列表,可以为元组,数组,字典。

#grad函数返回一个可以计算loss梯度的函数,该函数的参数传递与loss相同,且第一个为参数。

predict(w,x) = w[1]*x .+ w[2]
loss(w,x,y) = mean(abs2,y-predict(w,x))

lossgradient = grad(loss)



#参数传递默认为引用

#把数据集x,y合并传递参数data,再在里面展开(x,y)

#函数train!和train区别??,有默认值的参数放';'后。

function train(w, data; lr=.1)

    for (x,y) in data
        dw = lossgradient(w, x, y)
        for i in 1:length(w)
            w[i] -= lr * dw[i]
        end        
    end
    return w
end



#训练也可以使用类似@time weights = [ copy(train!(w, [(x, y)])) for epoch=1:10 ]的语句

#Any[..]可将不同类型的数据捆绑在一起,作为一个整体传递参数

include(Knet.dir("data","housing.jl"))
x,y = housing()
w = Any[ 0.1*randn(1,13), 0.0 ]
for i=1:10; train(w, [(x,y)]); println(loss(w,x,y)); end

  • softmax分类

`

前提知识:

张量中一般最后一维度为样本数量,如(784,N)

softmax与线性模型的区别在于最后目标函数是负对数似然

数据集标准形式为(..,N),x和y合并成训练形式(xi,yi),训练形式的xi(yi)为从x(yi)中抽取lengthofbatch个构成

`



`GZip需要提前安装`

using Knet,GZip

`定义模型:

#nll(~,~)用于计算Negative Log-Likelihood(负对数似然),[预测值(前)减真实值(后)],用作损失函数。

#w[1]为(10,784)大小,w[2]为(10,1)大小

#x为(28,28,1,sizeofbatch)大小,通过mat转化为(784,sizeofbatch);y0为(sizeofbatch,)大小`

predict(w,x)=w[1]*mat(x) .+ w[2]

loss(w,x,y0)=nll(predict(w,x),y0)`预测为(10*sizeofbatch)大小,真实值为(sizeofbatch,)大小`

lossgrad=grad(loss)

function train(w,data;lr=0.1)

    for (xtrb,ytrb) in data

        print(size(ytrb))

        dw=lossgrad(w,xtrb,ytrb)

        w-=lr.*dw

    end

    return w

end

`#minibatch将数据集张量转化为小批量的数据集[(xi,yi)...],可混洗。第三个参数为每批的大小。

#x~为(28*28*1*N),y~为长度为N的Uint8`

include(Knet.dir("data/mnist.jl"))

xtrn,ytrn,xtst,ytst=mnist()

dtrn=minibatch(xtrn,ytrn,100)

dtst=minibatch(xtst,ytst,100)

#

w=Any[0.1f0*randn(Float32,10,784),zeros(Float32,10,1)]

println((:epoch, 0, :trn, accuracy(w,dtrn,predict), :tst, accuracy(w,dtst,predict)))

train(w, dtrn; lr=0.5)

for epoch=1:10

    train(w, dtrn; lr=0.5)

    println((:epoch, epoch, :trn, accuracy(w,dtrn,predict), :tst, accuracy(w,dtst,predict)))

end

[未完成待续……]

### Knet框架概述 Knet是一个由Julia语言开发的深度学习库,旨在提供简洁而高效的接口用于构建和训练神经网络模型[^1]。该框架支持自动微分机制来简化梯度计算过程,并且能够充分利用GPU加速运算以提高效率。 #### 主要特点: - **简单易用**:通过高级抽象层减少编写代码的工作量; - **性能优越**:利用底层优化技术实现快速执行速度; - **灵活性高**:允许用户自定义操作并集成其他C/C++库; #### 安装与环境配置 为了使用Knet进行项目开发,在Ai Studio或者Colab平台上可以按照如下方式准备运行环境: 1. 确认已安装最新版本的Julia解释器; 2. 添加官方包管理仓库并将`Knet.jl`加入到本地环境中; 3. 对于希望启用CUDA支持的情况,则需额外下载NVIDIA驱动程序及相关工具链; ```julia using Pkg Pkg.add("Knet") ``` #### 构建简单的卷积神经网络(CNN) 下面给出一段基于MNIST手写数字识别任务的小型CNN实例演示: ```julia using Knet, MNIST function cnn(x; f=relu) Conv((5,5), 1=>16, pad=(2,2), stride=(1,1))(x) |> batchnorm |> f .| MaxPool((2,2))() |> Conv((5,5), 16=>32, pad=(2,2), stride=(1,1))() |> batchnorm |> f .| MaxPool((2,2))() |> Dense(32*7*7 => 10)(flatten(_)) end model = @knet function (x,y) pred = softmax(cnn(x)) loss = crossentropy(pred, y) accuracy = mean(argmax.(pred,dims=1).==y') return loss,accuracy,pred end; ``` 上述代码片段展示了如何定义一个具有两层卷积结构加全连接分类头的基础架构,并设置了损失函数以及评估指标。 #### 数据预处理与加载 对于特定应用场景下的数据集创建流程,请参照相关指南完成图像裁剪、增强变换等工作。通常情况下可借助第三方Python脚本辅助生成符合要求的数据文件夹布局形式供后续读取调用。 ```julia data = map(i->(float32(MNIST.image(i)'), onehot(MNIST.label(i)', 0:9)), rand(1:60_000, nbatch)) dtrain, dtest = splitobs(shuffleobs(data); at=0.8); ``` 这里是从内置测试集中随机抽取样本作为输入张量传入模型前必要的转换步骤之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值