著者:chen_h
マイクロ・シグナル&QQ:862251340
マイクロチャネル公共数:coderpai
(D)pytorchの研究ノート
畳み込みニューラルネットワークCNN(畳み込みニューラルネットワーク)とは何ですか
畳み込みニューラルネットワークは、近年の人工ニューラルネットワーク緩やかな上昇で、畳み込みニューラルネットワークを使用するので、予測画像と音声認識にも広く普及適用される技術をより良い結果を与えることができます。側面は、ニューラルネットワークは、最も一般的な画像認識、コンピュータに適用されますが、一定の技術革新のために、それはまた、ビデオ分析、自然言語処理、薬物の発見に使用されている、というように畳み込み。最近の火アルファGoは、コンピュータを見てみようゴーまた、この技術が適用され、理解しています。
コンボリューションとニューラルネットワーク
レッツ・ニューラルネットワークはそれの畳み込み演算でどのように具体的な話、画像識別の例を与える、我々は神経細胞の多くが存在し、ニューラルネットワークは、神経一連の層で構成されていることを神経層の各層を知っている。これらの神経元は、物事のニューラルネットワークを識別するための鍵である。それぞれはニューラルネットワークの入力と出力値を持つことになります、入力値が画像であるときとき、実際には、ニューラルネットワークの入力カラフルなパターンが、数字の山ということではありません。この回答を避ける。ニューラルネットワークは、時間のその利点を再生することができます畳み込みニューラルネットワークがある時のように多くの情報を入力、に対処するとき。畳み込みニューラルネットワーク、それは何ですか?
私たちは最初の畳み込みニューラルネットワーク語が。「コンボリューション」とそれを破る「ニューラルネットワーク。」もはや、画素毎に入力された情報を処理して行われているコンボリューションニューラルネットワークが、それぞれの絵に小画素領域は、処理のために、このアプローチは、画像情報の連続性を強化する。ニューラルネットワークはなく点よりも、グラフィックを見ることができるようになる。このアプローチはまた、ニューラルネットワークイメージの理解を深めた。具体的には、畳み込みニューラルネットワークは、画像上で収集した情報の連続スクロールにバッチフィルタ像を持っている、すべての時間がちょうどコレクト小さな画素面積を収集し、その後、COLLATE情報を集め、この時間を整理しました情報の一部は、実際にこれらのニューラルネットワークからのこれらのエッジ情報から得られた同様のバッチフィルタスイープで、同一工程で、次に画像情報のエッジの一部を見ると、この時点でそのようなニューラルネットワークとして、提示されているとまた、顔情報からフィルタを介して、エッジのような要約エッジとしてより高いレベルの要約情報構造内の情報、目を引くことができ、鼻、等と、情報の鼻の目が加算されています。私たちは、その後、完全に、神経層の分類を接続する複数の層の一般的な画像に設定された最後の情報を、私たちは入力が結果の種類に分けることができます得ることができるようにということ。
私たちは、ニューラルネットワークは、特に画像が重畳されているかについて話をグーグルビデオコンボリューションの傍受をご紹介します。以下は猫の絵があり、絵は長い間持って、広くて!ピクチャーのための高い3つのパラメータはここに!非常にあります高は、使用される色を生成するために使用されるコンピュータ情報を指す。高さが3である場合、それは、黒と白、あなたは情報を有していてもよく、カラー写真場合の写真、高いユニットだけ1、赤、緑、青の色である場合。フィルタ画像は常に物事を移動している一例としての色の写真我々は、彼が画像内の画素ブロックの小グループ小グループを収集し続けた後に、すべての情報を収集した後、出力の値は、我々は非常に高いものと理解することができます、長さ及び小さい幅「絵」この画像は、エッジ情報の一部を含むことが可能であり、同様の処理が高さを追加し、圧縮次に、画像の数倍畳み込み、長さと幅とを繰り返し、次いで、入力があります写真をより深く理解する。圧縮は、神経層に一般的な分類の巣の情報を増加させ、私たちは、このような画像を分類することができるようになります。
プーリング(プーリング)
研究では、各コンボリューションの時点で、神経層が誤っていくつかの情報を失う可能性があることを発見した。このとき、(プーリング)のプールは、この問題に良い解決策になることができます。また、プールは、フィルタをスクリーニングする過程で、缶層の有用な情報は、次の層の分析にフィルタリングするだけでなく、計算負荷ニューラルネットワークを減らします。ボリュームセットは、我々は長さと幅を圧縮していない場合にはように、追加の作業が精度を向上させるために非常に有効であることができるので、より多くの情報、プールへの圧縮作業を保持する可能な限り。これらの技術では、あります私たちは、ニューラルネットワークの友人の私たち自身の畳み込みを構築することができます。
人気のCNN構造
より一般建築構造一の畳み込み情報層(畳み込み)した後、上部、第一入力画像(イメージ)の下側から順に、そのようなされた後、コンボリューションの方法で処理したプール(プール)のここで最大プーリング方法である。その後、同様の処理後に使用し、一般に二層ニューラルネットワーク層である神経層(完全に接続された)完全接続層を着信第二の処理の情報を取得するために、そして最終的に分類予想の分類器(分類器)に接続する。これは、簡単な画像処理導入にちょうど畳み込みニューラルネットワークです。
CNN畳み込みニューラルネットワーク
コンボリューションニューラルネットワークは、現在広く新興のアプリケーションが既に存在している、画像の識別に使用され、その後、我々は、手書き数字CNNその段階の分析によって、ステップを行います。
ここでは学習プロセスのCNN最後の層は、のは、ビジュアライゼーションを見てみましょうです。
MNIST手書きデータ
import torch
import torch.nn as nn
import torch.utils.data as Data
import torchvision # 数据库模块
import matplotlib.pyplot as plt
torch.manual_seed(1) # reproducible
# Hyper Parameters
EPOCH = 1 # 训练整批数据多少次, 为了节约时间, 我们只训练一次
BATCH_SIZE = 50
LR = 0.001 # 学习率
DOWNLOAD_MNIST = True # 如果你已经下载好了mnist数据就写上 False
# Mnist 手写数字
train_data = torchvision.datasets.MNIST(
root='./mnist/', # 保存或者提取位置
train=True, # this is training data
transform=torchvision.transforms.ToTensor(), # 转换 PIL.Image or numpy.ndarray 成
# torch.FloatTensor (C x H x W), 训练的时候 normalize 成 [0.0, 1.0] 区间
download=DOWNLOAD_MNIST, # 没下载就下载, 下载了就不用再下了
)
値がゼロよりも大きい場合、ローカルブラックの値が0と白です。
また、離れてトレーニングデータから、そして、それは良いトレーニングを持っていないかどうかを確認するためにテストをいくつかのテストデータを与えました。
test_data = torchvision.datasets.MNIST(root='./mnist/', train=False)
# 批训练 50samples, 1 channel, 28x28 (50, 1, 28, 28)
train_loader = Data.DataLoader(dataset=train_data, batch_size=BATCH_SIZE, shuffle=True)
# 为了节约时间, 我们测试时只测试前2000个
test_x = torch.unsqueeze(test_data.test_data, dim=1).type(torch.FloatTensor)[:2000]/255. # shape from (2000, 28, 28) to (2000, 1, 28, 28), value in range(0,1)
test_y = test_data.test_labels[:2000]
CNNモデル
、我々はこのモデルを構築するためにCNN CNNをクラスを使用する前と同様に、全体のプロセスは、畳み込みである(。 Conv2d
)- >活性化関数(ReLU
) - >プールされ、(ダウンサンプリングMaxPooling
) - >再びそれを行う- >多次元畳み込みを平坦化図に機能- >フルアクセス接続層(Linear
) - >出力
class CNN(nn.Module):
def __init__(self):
super(CNN, self).__init__()
self.conv1 = nn.Sequential( # input shape (1, 28, 28)
nn.Conv2d(
in_channels=1, # input height
out_channels=16, # n_filters
kernel_size=5, # filter size
stride=1, # filter movement/step
padding=2, # 如果想要 con2d 出来的图片长宽没有变化, padding=(kernel_size-1)/2 当 stride=1
), # output shape (16, 28, 28)
nn.ReLU(), # activation
nn.MaxPool2d(kernel_size=2), # 在 2x2 空间里向下采样, output shape (16, 14, 14)
)
self.conv2 = nn.Sequential( # input shape (16, 14, 14)
nn.Conv2d(16, 32, 5, 1, 2), # output shape (32, 14, 14)
nn.ReLU(), # activation
nn.MaxPool2d(2), # output shape (32, 7, 7)
)
self.out = nn.Linear(32 * 7 * 7, 10) # fully connected layer, output 10 classes
def forward(self, x):
x = self.conv1(x)
x = self.conv2(x)
x = x.view(x.size(0), -1) # 展平多维的卷积图成 (batch_size, 32 * 7 * 7)
output = self.out(x)
return output
cnn = CNN()
print(cnn) # net architecture
"""
CNN (
(conv1): Sequential (
(0): Conv2d(1, 16, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
(1): ReLU ()
(2): MaxPool2d (size=(2, 2), stride=(2, 2), dilation=(1, 1))
)
(conv2): Sequential (
(0): Conv2d(16, 32, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
(1): ReLU ()
(2): MaxPool2d (size=(2, 2), stride=(2, 2), dilation=(1, 1))
)
(out): Linear (1568 -> 10)
)
"""
トレーニング
ここでは、トレーニングが始まるだろうx
y
持ってVariable
、その後に設置、ラップをcnn
計算しoutput
、最後に計算エラー。次のコードは省略されている計算の精度accuracy
部分を
optimizer = torch.optim.Adam(cnn.parameters(), lr=LR) # optimize all cnn parameters
loss_func = nn.CrossEntropyLoss() # the target label is not one-hotted
# training and testing
for epoch in range(EPOCH):
for step, (b_x, b_y) in enumerate(train_loader): # 分配 batch data, normalize x when iterate train_loader
output = cnn(b_x) # cnn output
loss = loss_func(output, b_y) # cross entropy loss
optimizer.zero_grad() # clear gradients for this training step
loss.backward() # backpropagation, compute gradients
optimizer.step() # apply gradients
"""
...
Epoch: 0 | train loss: 0.0306 | test accuracy: 0.97
Epoch: 0 | train loss: 0.0147 | test accuracy: 0.98
Epoch: 0 | train loss: 0.0427 | test accuracy: 0.98
Epoch: 0 | train loss: 0.0078 | test accuracy: 0.98
"""
最後に、我々は最終的に予測値を右に見て10件のデータを取りに来:
test_output = cnn(test_x[:10])
pred_y = torch.max(test_output, 1)[1].data.numpy().squeeze()
print(pred_y, 'prediction number')
print(test_y[:10].numpy(), 'real number')
"""
[7 2 1 0 4 1 4 9 5 9] prediction number
[7 2 1 0 4 1 4 9 5 9] real number
"""
可視化のトレーニング
これは、主に使用されている可視化を理解するのに役立ちますので、可視化コードを言及する必要があるので、ビデオを追加するために、突然希望した後に行われるものであるmatplotlib
とsklearn
我々が使用しているため、行わT-SNE
次元削減手段を高次元、最後の層CNNビジュアル出力、即ちCNNフォワード・コードx = x.view(x.size(0), -1)
、この結果。
コードの可視化がポイントではない、結果の我々の直接可視化は、それを示しています。
リンク:
https://morvanzhou.github.io/tutorials/machine-learning/torch/4-01-CNN/
https://github.com/MorvanZhou/PyTorch-Tutorial/blob/master/tutorial-contents/401_CNN.py