一、图像成像原理
区域经过透镜,形成了一个锥型区域,该光线被光敏电阻所感知。多个光敏电阻并列即可呈现图像。一个光敏电阻一个像素,如下就可形成2像素的图片。
对彩色图像而言,需对传感器器件进行改进,如绿色、红色、蓝色的传感器合成一组,最终像素值来自于三种不同的光敏器件。
二、卷积
单通道进行卷积
多通道进行卷积,以3通道为例
卷积核的输入通道数、输出通道数、宽度和高度,确定了一个卷积核。
其中:输出通道数:等于卷积核的个数;输入通过数:等于上一层的通道数。
代码示例:
import torch
in_chanels,outchuaels=5,10
width,height=100,100
kernel_size=3
batch_size=1
#batch为1 小批量第几个,输入通道为5,宽和高为100*100的图片
input=torch.randn(batch_size,in_chanels,width,height)
conv_layer=torch.nn.Conv2d(in_chanels,outchuaels,kernel_size=kernel_size)
output=conv_layer(input)
print(input.shape)
print(output.shape)
print(conv_layer.weight.shape)
输出:torch.Size([1, 5, 100, 100])
torch.Size([1, 10, 98, 98])
torch.Size([10, 5, 3, 3])
1为样本数量,卷积核:输出通道为10,输入通道为5,大小为3*3
三、padding
外围按0进行填充
代码实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25input=[3,4,6,5,7, 2,4,6,8,2, 1,6,7,8,4, 9,7,4,6,2, 3,7,5,4,1] #转化成(B,C,W,H),批量维度,通道,宽,高 input=torch.Tensor(input).view(1,1,5,5) conv_layer=torch.nn.Conv2d(1,1,kernel_size=3,padding=1,bias=False) kennel=torch.Tensor([1,2,3,4,5,6,7,8,9]).view(1,1,3,3) conv_layer.weight.data=kennel.data output=conv_layer(input) print(output)
四、最大池化层
- 一个简单的卷积神经网络
1样本数量、通道数、宽度、高度确立了一个卷积层。
1(batch,20,4,4)展开为1为一行,进行变换得到10*1的结果。
1利用卷积神经网络做手写数字的识别:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139import torch from torchvision import transforms from torchvision import datasets from torch.utils.data import DataLoader import torch.nn.functional as F import torch.optim as optim batch_size=64 #利用transforms 转换为tensor 类型的图片, transform =transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,),(0.3081,)) ]) train_dataset=datasets.MNIST(root='../data/mnist',train=True,download=True,transform=transform) train_loader= DataLoader(train_dataset,shuffle=True,batch_size=batch_size) test_dataset=datasets.MNIST(root='../data/mnist',train=False,download=True,transform=transform) test_loader=DataLoader(train_dataset,shuffle=False,batch_size=batch_size) class Net(torch.nn.Module): def __init__(self): super(Net,self).__init__() self.conv1=torch.nn.Conv2d(1,10,kernel_size=5) self.conv2=torch.nn.Conv2d(10,20,kernel_size=5) self.pooling=torch.nn.MaxPool2d(20) self.fc=torch.nn.Linear(320,10) def forward(self,x): batch_size=x.size(0) x=F.relu(self.pooling(self.conv1(x))) x=F.relu(self.pooling(self.conv2(x))) x=x.view(batch_size,-1) #变成全连接网络需要的输入 x=self.fc(x) return x model=Net() crierion=torch.nn.CrossEntropyLoss() optimizer=optim.SGD(model.parameters(),lr=0.01,momentum=0.5) def train(epoch): running_loss=0.0 for batch_idx,data in enumerate(train_loader,0): inputs,target=data optimizer.zero_grad() #forward +backward+update outputs=model(inputs) loss=crierion(outputs,target) loss.backward() optimizer.step() running_loss+=loss.item() if batch_idx%300==299: print('[%d,%5d] loss:%.3f' %(epoch+1,batch_idx+1,running_loss/300)) running_loss==0.0 def test(): correct=0 total=0 with torch.no_grad(): for data in test_loader: images,labels=data outputs=model(images) _,predicted=torch.max(outputs.data,dim=1) total+=labels.size(0) correct+=(predicted==labels).sum().item() print('Accuacy on test set:%d %%'%(100*correct/total)) if __name__=='__main__': for epoch in range(10): train(epoch) test()
1
最后
以上就是怕孤单大侠最近收集整理的关于一个简单的卷积神经网络的全部内容,更多相关一个简单内容请搜索靠谱客的其他文章。
发表评论 取消回复