【AI达人养成营】 基于图像处理基础的几类模型和实例
收藏
首先,感谢张团长(手动@豪哥)让我接触到paddlepaddle的平台,并且经过接近一个月的学习大概入了一个小门,了解和接触到一点有关于计算机视觉、图像处理以及一些深度学习的概念,这些在接触到paddle之前我是前所未闻的,可以说带我很好的入了一个门。当然短暂的学习明显是不够的,即使课程结束了,仍然要继续努力继续学习,在这样一个氛围浓厚、资源共享的平台基础上,有效的挖掘到更多更好的资源扩充自己的见解,并且真切的用到之后可以做的项目中去。
其次是我关于图像分类基础的几类模型的整理(包括源代码和结果实例)
#一、线性回归模型
#1.自定义随机样本
import numpy
num_inputs = 2
num_examples = 500
true_w=[1.2,2.5]
true_b=6.8
features = numpy.random.normal(0,1,(num_examples,num_inputs)).astype('float32')
labels = features[:,0]*true_w[0]+features[:,1]*true_w[1]+true_b
labels = labels+numpy.random.normal(0,0.001,labels.shape[0])
labels = labels.astype('float32')
labels = numpy.expand_dims(labels,axis=-1) #最后添加一个维度
#2.构建线性回归模型
import paddle
train_data = paddle.to_tensor(features) #数据转型
y_true = paddle.to_tensor(labels)
model = paddle.nn.Linear(in_features=2, out_features=1) #两个输入一个输出
#3.构建优化器和损失函数
sgd_optmiser = paddle.optimizer.SGD(learning_rate=0.001,parameters=model.parameters()) #优化器采用梯度下降法 学习率为0.001,可变参数对应model的参数
mse_loss = paddle.nn.MSELoss() #使用均方损失函数for i in range(5000):
y_predict = model(train_data)
loss = mse_loss(y_predict,y_true)
loss.backward()
sgd_optmiser.step() #下一步
sgd_optmiser.clear_grad() #计数器清零 以上两条很关键
print(model.weight.numpy()) #学习到的权重
print(model.bias.numpy()) #学习到的参数
print(loss.numpy()) #损失值
#与初始值对比,可以发现相差不大,学习的挺好
#注意的是,线性回归用的是连续性数据,离散型数据可以使用softmax分类器
#二、基于softmax的手写数字识别分类(最基础的版本了,等价于Hello World的阉割版)
#1.调用数据集。手写数字数据集来自MNIST数据集 train 60000+,test 10000+,样本由28 * 28像素组成的矩阵,取值在0~255 之间
import paddle
train_dataset = paddle.vision.datasets.MNIST(mode="train",backend="cv2") #训练数据集
test_dataset = paddle.vision.datasets.MNIST(mode="test",backend="cv2") #测试数据集
#小例子查看数据集中的数据
import matplotlib.pyplot as plt
train_data0,train_label0 = train_dataset[1][0],train_dataset[1][1] #对应数据
train_data0 = train_data0.reshape([28,28]) #将数据以28 * 28 的形式展现出
plt.figure(figsize=(10,10)) #以10英寸显示窗口
plt.imshow(train_data0,cmap=plt.cm.binary) #可视化操作
linear = paddle.nn.Sequential(
paddle.nn.Flatten(), #“压扁”操作
paddle.nn.Linear(784,10) #函数输入784输出10
)
model=paddle.Model(linear)
model.prepare(paddle.optimizer.Adam(learning_rate=0.001,parameters=model.parameters()),
paddle.nn.CrossEntropyLoss(),#交叉熵损失函数。配合线性模型,即可构成softmax分类器
paddle.metric.Accuracy(topk=(1,2)) #精确度
)
model.fit(train_dataset,epochs=3,batch_size=64,verbose=1)
model.evaluate(test_dataset,batch_size=64,verbose=1)
#三、基于多层感知机的手写数字识别分类
import paddle
import paddle.nn.functional as F
from paddle.vision.transforms import ToTensor
#导入数据
train_dataset=paddle.vision.datasets.MNIST(mode="train",transform=ToTensor())
val_dataset=paddle.vision.datasets.MNIST(mode="test",transform=ToTensor())
#定义模型
class MLPModel(paddle.nn.Layer): #继承
def __init__(self): #初始化
super(MLPModel,self).__init__()
self.flatten = paddle.nn.Flatten()
self.hidden = paddle.nn.Linear(in_features=784,out_features=128)
self.output = paddle.nn.Linear(in_features=128,out_features=10)
def forward(self,x): #数据处理顺序
x=self.flatten(x)
x=self.hidden(x)
x=F.relu(x)
x=self.output(x)
return x
#高阶API封装成实例
model = paddle.Model(MLPModel())
model.prepare(paddle.optimizer.Adam(parameters=model.parameters()), #优化函数
paddle.nn.CrossEntropyLoss(), #损失函数
paddle.metric.Accuracy()) #求解精度
model.fit(train_dataset,
epochs=5,
batch_size=64,
verbose=1)
model.evaluate(val_dataset,verbose=1) #验证数据集评估
#四、卷积网络LeNet-5来实现数字识别
#LeNet-5 对应七个隐藏层:卷积L1->池化L2->卷积L3->池化L4->线性L5->线性L6->线性L7
import paddle
import paddle.nn.functional as F
from paddle.vision.transforms import Compose, ToTensor
transform = Compose([ToTensor()])
#导入CIFAR10图像数据
train_dataset=paddle.vision.datasets.Cifar10(mode="train", transform=transform)
val_dataset=paddle.vision.datasets.Cifar10(mode="test", transform=transform)
#定义模型
class LeNetModel(paddle.nn.Layer):
def __init__(self):
super(LeNetModel, self).__init__()
# 创建卷积和池化层块,每个卷积层后面接着2x2的池化层
#卷积层L1
self.conv1 = paddle.nn.Conv2D(in_channels=3, #CIFAR10数据集有3个颜色通道
out_channels=6,
kernel_size=5,
stride=1,
data_format='NCHW')
#池化层L2
self.pool1 = paddle.nn.MaxPool2D(kernel_size=2,
stride=2)
#卷积层L3
self.conv2 = paddle.nn.Conv2D(in_channels=6,
out_channels=16,
kernel_size=5,
stride=1,
data_format='NCHW')
#池化层L4
self.pool2 = paddle.nn.MaxPool2D(kernel_size=2,
stride=2)
#线性层L5
self.fc1=paddle.nn.Linear(400,120) #需根据数据形状改写
#线性层L6
self.fc2=paddle.nn.Linear(120,84)
#线性层L7
self.fc3=paddle.nn.Linear(84,10)
#正向传播过程
def forward(self, x):
x = self.conv1(x)
x = F.relu(x)
x = self.pool1(x)
x = F.relu(x)
x = self.conv2(x)
x = self.pool2(x)
x = paddle.flatten(x, start_axis=1,stop_axis=-1)
x = self.fc1(x)
x = F.relu(x)
x = self.fc2(x)
x = F.relu(x)
out = self.fc3(x)
return out
model=paddle.Model(LeNetModel())
model.prepare(paddle.optimizer.Adam(parameters=model.parameters()),
paddle.nn.CrossEntropyLoss(),
paddle.metric.Accuracy())
model.fit(train_dataset,
epochs=5,
batch_size=64,
verbose=1)
model.evaluate(val_dataset,verbose=1)
0
收藏
请登录后评论