機械学習 ----PyTorch モデルのトレーニング

パイトーチ

  • 以前に純粋な手動線形回帰を使用しましたが、線形回帰の問題は実際には、損失関数が最小化されるときの w の値を見つけることです。
  • PyTorch の多くの関数はカプセル化されており、それらを直接使用できます。

損失関数

手書き損失関数
def loss(y, y_pred):
	"""损失函数"""
	# (真实值 - 预测值)^2 的平均值
    return ((y_pred - y)**2).mean()
PyTorch によってカプセル化された損失関数

损失函数就是计算 (预测值-真实值)^2的平均值
(均方误差)

torch.nn.MSELoss()方法参数:

  1. 全データの予測値
  2. すべての真の値
  3. (平均二乗誤差が計算されるため、位置の交換についても同様です)
import torch
X = torch.tensor([1,2,3,4],dtype=torch.float32)
Y = torch.tensor([2,4,6,8],dtype=torch.float32)
w = torch.tensor(0.0,dtype=torch.float32,requires_grad=True)

def forward(x):
    return w * x

# 均方差计算预测值和真实值之间的距离
loss = torch.nn.MSELoss()
# 计算此时的损失
y_pre = forward(X)
l = loss(y_pre,Y)
print(f"此时的损失值:{
      
      l}")

ここに画像の説明を挿入します


オプティマイザ

オプティマイザーは手書きの勾配降下法アルゴリズムを置き換え、PyTorch が自動的に勾配を計算してパラメーターを更新します。

オプティマイザーの定義

optim模块内包含多个优化器,都是基于基本的梯度下降算法改进的算法,可以更快的求出最优的参数解,例如: SGD, Adam,Momentum,RMSProp,这里使用的是SGD梯度下降算法

  1. バックプロパゲーションを通じて更新する必要があるパラメーター。更新する必要があるパラメーターが複数ある場合があるため、パラメーター 1 はリストです。
  2. lr名前付きパラメータは学習率です
optimizer = torch.optim.SGD([W], lr=learning_rate)
完全な線形回帰

l.backward()损失函数反向传播计算梯度
optimizer.step() 通过优化器 更新w参数 向梯度的方向走一步 (求解loss损失值关于w的偏导值)
optimizer.zero_grad() 清空梯度计算,防止梯度累加导致结果错误

# 创建x、y数据和自定义w参数
X = torch.tensor([1,2,3,4],dtype=torch.float32)
Y = torch.tensor([2,4,6,8],dtype=torch.float32)
w = torch.tensor(0.0,dtype=torch.float32,requires_grad=True)
# 定义学习率 和 训练模型迭代次数
learning_rate = 0.001
n_iters = 1000
# 创建损失函数
loss = torch.nn.MSELoss()
# 创建优化器 把w参数扔进去,要计算损失值关于w的关系(偏导数) 把学习率扔进去
optimizer = torch.optim.SGD([w],lr=learning_rate)

# 正向传播函数(模型)
def forward(x):
    """正向传播函数"""
    return w * x

# 训练模型
for epoch in range(n_iters):
    # 通过正向传播获取到预测值
    y_pred = forward(X)
    # 通过损失函数获取到损失值
    l = loss(y_pred,Y)
    # 反向传播计算梯度
    l.backward()
    # 通过优化器 更新w参数  向梯度的方向走一步
    optimizer.step()
    # 清空梯度计算,防止梯度累加导致结果错误
    optimizer.zero_grad()
    
    if epoch % 100 == 0:
        # 打印纪元 w参数的变化和损失值的变化
        print(f'epoch: {
      
      epoch},w: {
      
      w},loss: {
      
      l:.8f}')

モデル構築

モデルを構築すると、手書きの順伝播関数が不要になります。

torch.nn.Linear(input_size,output_size)線形モデルを表す関数

  • input_size: 入力データの次元
  • Output_size: 出力データの次元

model.parameters()模型中的参数

# 创建x、y数据和自定义w参数
X = torch.tensor([[1],[2],[3],[4]],dtype=torch.float32)
Y = torch.tensor([[2],[4],[6],[8]],dtype=torch.float32)
# 测试集
X_test = torch.tensor([5],dtype=torch.float32)
# 定义模型参数
n_samples,n_features = X.shape
print(n_features)
# 因为当前定义的输入和输出维度一致  所以参数输入和输出都为n_features
model = torch.nn.Linear(n_features,n_features)
# 定义学习率 和 训练模型迭代次数
learning_rate = 0.01
n_iters = 1000
# 创建损失函数
loss = torch.nn.MSELoss()
# 创建优化器 把模型需要更新参数扔进去,要计算损失值关于w的关系(偏导数) 把学习率扔进去
optimizer = torch.optim.SGD(model.parameters(),lr=learning_rate)


# 训练模型
for epoch in range(n_iters):
    # 通过正向传播获取到预测值
    y_pred = model(X)
    # 通过损失函数获取到损失值
    l = loss(y_pred,Y)
    # 反向传播计算梯度
    l.backward()
    # 通过优化器 更新w参数  向梯度的方向走一步
    optimizer.step()
    # 清空梯度计算,防止梯度累加导致结果错误
    optimizer.zero_grad()
    
    if epoch % 100 == 0:
        # 获取到模型中w参数的值和b的值
        w,b = model.parameters()
        # 打印纪元 w参数的变化和损失值的变化
        print(f'epoch: {
      
      epoch},w: {
      
      w[0,0].item()},loss: {
      
      l}')

ここに画像の説明を挿入します

トレーニングが完了したら、テスト セットを使用して w パラメーターをテストします。

test_model = model(X_test)

ここに画像の説明を挿入します
y = 2x + b データ 5 は 10 に限りなく近い


要約:

PyTorch トレーニング モデル プロセス:

  1. トレーニング セットを取得し、入力次元と出力次元を取得します。
  2. 入力および出力の寸法に基づいて適切なモデルを作成する
  3. 損失関数の作成
  4. オプティマイザーの作成
  5. 学習モデル 順伝播 ➡ 逆伝播 ➡ 勾配降下 ➡ ループ
  6. モデルを評価するためのテスト セットを取得する

機械学習は、一度に解決策を見つけるのではなく、ゆっくりと解決策に近づくプロセスです。

おすすめ

転載: blog.csdn.net/bjsyc123456/article/details/124849919