使用mindspore构建CNN
在使用MindSpore构建CNN之前,需要安装MindSpore并导入必要的库。以下是构建CNN的基本步骤:
- 导入MindSpore库和其他必要的库:
import mindspore.nn as nn
import mindspore.ops as ops
import mindspore.common.dtype as mstype
import mindspore.dataset as ds
import mindspore.dataset.transforms.c_transforms as C
import mindspore.dataset.vision.c_transforms as CV
import mindspore.dataset.transforms.py_transforms as PY
import mindspore.dataset.vision.py_transforms as PYCV
import mindspore.dataset.transforms.vision.c_transforms as V_C
- 定义CNN模型:
class CNN(nn.Cell):
def __init__(self):
super(CNN, self).__init__()
self.conv1 = nn.Conv2d(3, 32, kernel_size=3, stride=1, padding=1, has_bias=True)
self.relu = nn.ReLU()
self.max_pool2d = nn.MaxPool2d(kernel_size=2, stride=2)
self.conv2 = nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1, has_bias=True)
self.flatten = nn.Flatten()
self.dense1 = nn.Dense(64 * 8 * 8, 1024)
self.dropout = nn.Dropout(0.2)
self.dense2 = nn.Dense(1024, 10)
def construct(self, x):
x = self.conv1(x)
x = self.relu(x)
x = self.max_pool2d(x)
x = self.conv2(x)
x = self.relu(x)
x = self.max_pool2d(x)
x = self.flatten(x)
x = self.dense1(x)
x = self.dropout(x)
x = self.dense2(x)
return x
这是一个简单的CNN模型,包含两个卷积层、两个全连接层和一个dropout层。具体来说,该模型先通过一个3x3的卷积层,得到32个特征图,然后经过ReLU激活,再通过2x2的最大池化层进行下采样。接下来,再通过一个3x3的卷积层,得到64个特征图,然后再通过ReLU激活和2x2的最大池化层进行下采样。最后,将得到的特征图展平成一维向量,并通过两个全连接层和一个dropout层,最终输出10个类别的预测结果。
- 定义损失函数和优化器:
net = CNN()
criterion = nn.SoftmaxCrossEntropyWithLogits(sparse=True, reduction='mean')
optimizer = nn.Momentum(net.trainable_params(), learning_rate=0.001, momentum=0.9)
这里选择交叉熵损失函数和动量优化器,其中学习率为0.001,动量为0.9。
- 准备数据:
train_dataset = ds.Cifar10Dataset(dataset_dir='./data', num_parallel_workers=4, shuffle=True)
train_dataset = train_dataset.map(input_columns="image", operations=V_C.RandomCrop((28, 28)))
train_dataset = train_dataset.map(input_columns="image", operations=V_C.Resize((32, 32)))
train_dataset = train_dataset.map(input_columns="image", operations=V_C.RandomHorizontalFlip())
train_dataset = train_dataset.map(input_columns="image", operations=CV.Rescale(1.0 / 255.0, 0.0))
train_dataset = train_dataset.map(input_columns="image", operations=CV.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]))
train_dataset = train_dataset.map(input_columns="label", operations=C.TypeCast(mstype.int32))
train_dataset = train_dataset.batch(batch_size=32, drop_remainder=True)
这里使用Cifar10数据集,对数据进行了一些预处理,包括随机裁剪、调整大小、随机水平翻转、归一化等。
- 训练模型:
for epoch in range(num_epochs):
net.set_train()
for i, data in enumerate(train_dataset):
images, labels = data
loss = criterion(net(images), labels)
loss.backward()
optimizer.step()
optimizer.clear_grad()
if i % 100 == 0:
print("Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}".format(epoch+1, num_epochs, i+1, len(train_dataset), loss.asnumpy()))
在训练循环中,首先将模型设置为训练模式,然后遍历数据集,计算损失并进行反向传播和梯度更新。每经过100个批次,就输出一次训练状态。
- 评估模型:
net.set_eval()
with ops.context_mode('auto_parallel'):
correct = 0
total = 0
for data in test_dataset.create_tuple_iterator():
images, labels = data
outputs = net(images)
predicted = ops.Argmax(axis=1)(outputs)
total += labels.shape[0]
correct += (predicted == labels).sum()
print('Accuracy of the network on the test images: %d %%' % (100 * correct / total))
这里将模型设置为评估模式,然后遍历测试集,计算模型在测试集上的准确率。
完整代码如下:
import mindspore.nn as nn
import mindspore.ops as ops
import mindspore.common.dtype as mstype
import mindspore.dataset as ds
import mindspore.dataset.transforms.c_transforms as C
import mindspore.dataset.vision.c_transforms as CV
import mindspore.dataset.transforms.py_transforms as PY
import mindspore.dataset.vision.py_transforms as PYCV
import mindspore.dataset.transforms.vision.c_transforms as V_C
class CNN(nn.Cell):
def __init__(self):
super(CNN, self).__init__()
self.conv1 = nn.Conv2d(3, 32, kernel_size=3, stride=1, padding=1, has_bias=True)
self.relu = nn.ReLU()
self.max_pool2d = nn.MaxPool2d(kernel_size=2, stride=2)
self.conv2 = nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1, has_bias=True)
self.flatten = nn.Flatten()
self.dense1 = nn.Dense(64 * 8 * 8, 1024)
self.dropout = nn.Dropout(0.2)
self.dense2 = nn.Dense(1024, 10)
def construct(self, x):
x = self.conv1(x)
x = self.relu(x)
x = self.max_pool2d(x)
x = self.conv2(x)
x = self.relu(x)
x = self.max_pool2d(x)
x = self.flatten(x)
x = self.dense1(x)
x = self.dropout(x)
x = self.dense2(x)
return x
net = CNN()
criterion = nn.SoftmaxCrossEntropyWithLogits(sparse=True, reduction='mean')
optimizer = nn.Momentum(net.trainable_params(), learning_rate=0.001, momentum=0.9)
train_dataset = ds.Cifar10Dataset(dataset_dir='./data', num_parallel_workers=4, shuffle=True)
train_dataset = train_dataset.map(input_columns="image", operations=V_C.RandomCrop((28, 28)))
train_dataset = train_dataset.map(input_columns="image", operations=V_C.Resize((32, 32)))
train_dataset = train_dataset.map(input_columns="image", operations=V_C.RandomHorizontalFlip())
train_dataset = train_dataset.map(input_columns="image", operations=CV.Rescale(1.0 / 255.0, 0.0))
train_dataset = train_dataset.map(input_columns="image", operations=CV.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]))
train_dataset = train_dataset.map(input_columns="label", operations=C.TypeCast(mstype.int32))
train_dataset = train_dataset.batch(batch_size=32, drop_remainder=True)
num_epochs = 10
for epoch in range(num_epochs):
net.set_train()
for i, data in enumerate(train_dataset):
images, labels = data
loss = criterion(net(images), labels)
loss.backward()
optimizer.step()
optimizer.clear_grad()
if i % 100 == 0:
print("Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}".format(epoch+1, num_epochs, i+1, len(train_dataset), loss.asnumpy()))
test_dataset = ds.Cifar10Dataset(dataset_dir='./data', num_parallel_workers=4, shuffle=True)
test_dataset = test_dataset.map(input_columns="image", operations=CV.Rescale(1.0 / 255.0, 0.0))
test_dataset = test_dataset.map(input_columns="image", operations=CV.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]))
test_dataset = test_dataset.map(input_columns="label", operations=C.TypeCast(mstype.int32))
test_dataset = test_dataset.batch(batch_size=32, drop_remainder=True)
net.set_eval()
with ops.context_mode('auto_parallel'):
correct = 0
total = 0
for data in test_dataset.create_tuple_iterator():
images, labels = data
outputs = net(images)
predicted = ops.Argmax(axis=1)(outputs)
total += labels.shape[0]
correct += (predicted == labels).sum()
print('Accuracy of the network on the test images: %d %%' % (100 * correct / total))
原文地址: https://www.cveoy.top/t/topic/bdWp 著作权归作者所有。请勿转载和采集!