pytorchのバージョン:
合計でいくつかの手順があります。
1. データセットをロードします (もちろん、ここでは独自のデータセットを使用できますが、パラメーター、h、w、チャンネルの調整に注意してください)
2. ニューラル ネットワーク モデルを定義します (ここでは 2 つの方法が書かれています)
3. モデルを確認する
4.モデルをGPUに転送する
5. 損失関数とオプティマイザー
6. トレーニング
7. 曲線を描く
8. モデルを評価する
#LeNet-5网络结构
import torch.nn as nn
import torch
import torchvision
from torchvision import transforms
from torch.utils import data
import matplotlib.pyplot as plt
import torch.nn.functional as F
#定义加载数据集函数
def load_data_mnist(batch_size):
'''下载MNIST数据集然后加载到内存中'''
train_dataset=torchvision.datasets.MNIST(root='dataset',train=True,transform=transforms.ToTensor(),download=True)
test_dataset=torchvision.datasets.MNIST(root='dataset',train=False,transform=transforms.ToTensor(),download=True)
return (data.DataLoader(train_dataset,batch_size,shuffle=True),
data.DataLoader(test_dataset,batch_size,shuffle=False))
#LeNet-5在MNIST数据集上的表现
batch_size=64
train_iter,test_iter=load_data_mnist(batch_size=batch_size)
###########################################################################
# 神经网络模型的第一种形式
# net = nn.Sequential(
# nn.Conv2d(1, 6, kernel_size=5, padding=2), nn.Sigmoid(),
# nn.AvgPool2d(kernel_size=2, stride=2),
# nn.Conv2d(6, 16, kernel_size=5), nn.Sigmoid(),
# nn.AvgPool2d(kernel_size=2, stride=2), nn.Flatten(),
# nn.Linear(16 * 5 * 5, 120), nn.Sigmoid(),
# nn.Linear(120, 84), nn.Sigmoid(),
# nn.Linear(84, 10))
# 神经网络模型的第二种形式
class net1(nn.Module):
def __init__(self):
super(net1, self).__init__()
self.C1 = nn.Conv2d(1, 6, kernel_size=5, padding=2)
self.C2 = nn.Conv2d(6, 16, kernel_size=5)
self.linear1 = nn.Linear(16 * 5 * 5, 120)
self.linear2 = nn.Linear(120, 84)
self.linear3 = nn.Linear(84, 10)
def forward(self, x):
n = self.C1(x)
n = nn.Sigmoid()(n)
n = nn.AvgPool2d(kernel_size=2, stride=2)(n)
n = self.C2(n)
n = nn.Sigmoid()(n)
n = nn.AvgPool2d(kernel_size=2, stride=2)(n)
n = nn.Flatten()(n)
n = self.linear1(n)
n = nn.Sigmoid()(n)
n = self.linear2(n)
n = nn.Sigmoid()(n)
n = self.linear3(n)
return n
net = net1()
######################################################################
#检查模型
x = torch.rand(size=(1, 1, 28, 28), dtype=torch.float32)
# 对应第一种神经网络模型
# for layer in net:
# x = layer(x)
# print(layer.__class__.__name__, 'output shape:\t', x.shape)
# 对应第二种神经网络模型
model_modules = [x for x in net.modules()]
print(model_modules)
print(len(model_modules))
####################################################################
# 获取GPU设备
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print(device)
# 传送网络到GPU
net.to(device)
######################################################################
#损失函数
loss_function=nn.CrossEntropyLoss()
#优化器
optimizer=torch.optim.Adam(net.parameters())
#####################################################################
# 开始训练
num_epochs = 10
train_loss = []
for epoch in range(num_epochs):
for batch_idx, (x, y) in enumerate(train_iter):
# x = x.view(x.size(0), 28 * 28)
# 传送输入和标签到GPU
x, y = x.to(device), y.to(device) # x是inputs, y是labels
out = net(x)
y_onehot = F.one_hot(y, num_classes=10).float() # 转为one-hot编码
loss = loss_function(out, y_onehot) # 均方差
# 清零梯度
optimizer.zero_grad()
loss.backward()
# w' = w -lr * grad
optimizer.step()
train_loss.append(loss.item())
if batch_idx % 10 == 0:
print(epoch, batch_idx, loss.item())
####################################################################
#绘制损失曲线
plt.figure(figsize=(8,3))
plt.grid(True,linestyle='--',alpha=0.5)
plt.plot(train_loss,label='loss')
plt.legend(loc="best")
plt.show()
################################################
#评估模型
total_correct = 0
for batch_idx, (x, y) in enumerate(test_iter):
# x = x.view(x.size(0),28*28)
# 传送输入和标签到GPU
x, y = x.to(device), y.to(device) # x是inputs, y是labels
out = net(x)
pred = out.argmax(dim=1)
correct = pred.eq(y).sum().float().item()
total_correct += correct
total_num = len(test_iter.dataset)
test_acc = total_correct / total_num
print(total_correct, total_num)
print("test acc:", test_acc)
matpotlib は以下を示します:
################################################ #########################
トレーニングされたモデルが比較的大きく、複数のモジュールがある場合、nn.modules のサブクラスをネストして、最終的な大きなモデルに統合できます。
例えば:
ここでは、nn.Conv2d(1, 6, kernel_size=5, padding=2) レイヤーをモジュールに分割します。
net1 クラスで net2 クラスを呼び出すことで、最終的に完全なモデルが実装されます。
class net2(nn.Module):
def __init__(self):
super(net2, self).__init__()
self.CCC1 = nn.Conv2d(1, 6, kernel_size=5, padding=2)
def forward(self,x):
x = self.CCC1(x)
return x
class net1(nn.Module):
def __init__(self):
super(net1, self).__init__()
# self.C1 = nn.Conv2d(1, 6, kernel_size=5, padding=2)
self.net22 = net2()
self.C2 = nn.Conv2d(6, 16, kernel_size=5)
self.linear1 = nn.Linear(16 * 5 * 5, 120)
self.linear2 = nn.Linear(120, 84)
self.linear3 = nn.Linear(84, 10)
def forward(self, x):
# n = self.C1(x)
n = self.net22(x)
n = nn.Sigmoid()(n)
n = nn.AvgPool2d(kernel_size=2, stride=2)(n)
n = self.C2(n)
n = nn.Sigmoid()(n)
n = nn.AvgPool2d(kernel_size=2, stride=2)(n)
n = nn.Flatten()(n)
n = self.linear1(n)
n = nn.Sigmoid()(n)
n = self.linear2(n)
n = nn.Sigmoid()(n)
n = self.linear3(n)
return n
net = net1()
################################################ ########################
モデルをチェックするもう 1 つの非常に優れた方法:
(ただし、torchsummary パッケージをダウンロードする必要があります)
torchsummary インポート概要から
summary(net, (1,28,28)) # 最初のパラメータはインスタンス化したモデル、2 番目のパラメータは入力したサイズ、batch_size は自動的に -1 になるため、ここに記述する必要はありません。したがって (1, 28, 28) は C、H、W です 。 # このステートメントは net.to(device) の後に配置する必要があります。そう しないと、さまざまなデバイス上のモデルとパラメーター データの エラー出力テーブルが作成されます。 異なるレイヤーのサイズとパラメーターの出力
tensorflow版:
import tensorflow as tf
# Load MNIST dataset
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# Normalize pixel values to be between 0 and 1
x_train, x_test = x_train / 255.0, x_test / 255.0
# Define model architecture
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10)
])
# Compile model
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
model.compile(optimizer='adam',
loss=loss_fn,
metrics=['accuracy'])
# Train model
model.fit(x_train, y_train, epochs=5)
# Evaluate model on test data
model.evaluate(x_test, y_test)