在之前的简单线性回归代码中,没有用到矩阵的形式。
所以当有多个变量的时候写起来也比较复杂,今天就用矩阵来表示这些变量,以达到简化的效果。
写一个简单的神经网络,来看看tf.Keras.Dense层和pytorch.nn.Linear层里面究竟是怎样实现的,它的过程是怎样的。
如果对神经网络,以及矩阵乘法不太了解的,请去百度百科了解一下,也是非常的简单。
下面先来写一下代码 :
import tensorflow as tf import numpy as np x = #假设x.shape(n,2) y = #假设y.shape(n,1) w = tf.Variable(tf.random.randn([2,1],name='weight') #w,b这里的参数与x,y的 shape对应 b = tf.Variable(tf.random.randn([1],name='bias') def linear_regression(): return x*w + b def square_loss(y_pred,y_true): return tf.reduce_mean(tf.pow(y_pred-y_true,2).sum()) optimizer = tf.optimizers.SGD(0.01) #应用随机梯度下降算法,是梯度下降下降算法的一种改进。 def run_optimization(): with tf.GradientTape() as g: #获取 梯度信息 pred = linear_regression() loss = square_loss(pred,y) gradients = g.gradients(loss,[w,b]) #得到loss对变量w,b的梯度 optimizer.apply_gradients(zip(gradients,[w.b]) #通过梯度信息,更新变量w,b将loss最小化 for i in range(100): run_optimization()
下面是pytorch代码
import torch import numpy as np from torch.autograd import Variable x = #numpy.float32数据类型 y = #numpy.float32数据类型 x , y = torch.from_numpy(x), torch.from_numpy(y) #将numpy数据转换成tensor w = Variable(torch.randn(1),requires_grad=True) b = Variable(torch.randn(1),requires_grad=True) def linear_regression(): return x*w.expand_as(x) + b.expand_as(x) for i in range(100): if (w.grad is not None) and (b.grad is not None): w.grad.data.zero_() #因为梯度会累加 , 所以在更新之前要先将之前的梯度信息归零 b.grad.data.zero_() pred = linear_regression() loss = torch.mean((pred - y) ** 2) loss.backward()#方向传播 ,得到 变量的梯度 print(loss) w.data.add_(- 0.01 * w.grad.data) #利用上一步计算中得到的w的梯度信息更新w中的data数值 b.data.add_(- 0.01 * b.grad.data) #利用上一步计算中得到的b的梯度信息更新b中的data数值
上面没有用到形成的神经网络,下面来调用api实现线性回归
import torch import torch.nn as nn import torch.optim from torch.autograd import Variable x = y = class Net(nn.Model): def __init__(self): super(Net,self).__init__() #自动寻找基类 self.layers = nn.Linear(1,1) #输入输出数据的维度 def forwadr(self,x): x = self.layers(x) return x #进行前向传播 net = Net() optimizer = torch.optim.SGD(0.001) error = torch.nn.MSELoss() for i in range(1100): pred = net(x) loss = error(pred,y) optimizer.zero_grad() #清除梯度信息 loss.backward() #生成梯度信息 optimizer.step() #应用梯度信息
在用TensorFlow来实现一下,对比一下两框架的区别以便跟好的学习
import tensorflow as tf from tensorflow.keras import Model , layers x = y = class Net(Model): def __init__(self): super(Net,self).__init__() self.layers = layers.Dense(1,activation='relu') def forward(self,x): x = self.layers(x) return x def square_loss(y_pred,y_true): return tf.reduce_mean(tf.pow(y_pred-y_true,2).sum()) optimizer = tf.optimizers.SGD(0.001) net = Net() def run_optimization(): with tf.gradientTape() as g: pred = net(x) loss = square_loss(pred,y) trainable_cariables = net.trainable_variables gradients = g.gradient(loss,trainable_cariables) optimizer.apply_gradients(zip(gradients,trainable_cariables))
通过代码,我们已经对这两个框架的基本的使用有了一定的了解,也对利用神经网络完成线性回归任务用了一定的了解,那要实现逻辑回归呢??有没有想过?例如识别手写数字。
Thank for your reading !!!
公众号:FPGA之旅