一、CNN網路是什麼意思?
CNN全稱卷積神經網路(Convolutional Neural Network),是一種前饋神經網路,最初是由Fukushima於1980年提出來的,主要用於圖像識別、語音識別等領域。CNN是一種深度學習模型,特殊之處在於它利用了圖像的二維結構信息。
二、CNN網路的特點
CNN網路最大的優點是能夠從輸入的圖像中自動提取特徵。傳統的神經網路需要人工選擇特徵,而CNN可以自動學習並優化自己的特徵,使得模型具有更好的泛化能力。此外,CNN能夠處理高維數據,並具有平移和縮放不變性。
三、CNN網路結構
CNN主要由卷積層、池化層和全連接層組成。
卷積層:卷積層是CNN的核心,它對輸入的圖像進行特徵提取和卷積操作,得到一系列新的特徵圖。
池化層:池化層對特徵圖進行降採樣操作,減小模型複雜度,提高模型的泛化能力。
全連接層:全連接層對上一層的所有特徵進行連接,將特徵轉換為預測的類別。
四、CNN網路結構搭建
import numpy as np
import tensorflow as tf
# 定義卷積層函數
def conv2d(x, W):
return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')
# 定義池化層函數
def max_pool_2x2(x):
return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],
strides=[1, 2, 2, 1], padding='SAME')
# 定義輸入層
x = tf.placeholder(tf.float32, [None, 784])
# 將輸入轉化為4維張量
x_image = tf.reshape(x, [-1, 28, 28, 1])
# 定義第一層卷積層
W_conv1 = tf.Variable(tf.truncated_normal([5, 5, 1, 32], stddev=0.1))
b_conv1 = tf.Variable(tf.constant(0.1, shape=[32]))
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
h_pool1 = max_pool_2x2(h_conv1)
# 定義第二層卷積層
W_conv2 = tf.Variable(tf.truncated_normal([5, 5, 32, 64], stddev=0.1))
b_conv2 = tf.Variable(tf.constant(0.1, shape=[64]))
h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
h_pool2 = max_pool_2x2(h_conv2)
# 定義全連接層
W_fc1 = tf.Variable(tf.truncated_normal([7 * 7 * 64, 1024], stddev=0.1))
b_fc1 = tf.Variable(tf.constant(0.1, shape=[1024]))
h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)
# 定義輸出層
W_fc2 = tf.Variable(tf.truncated_normal([1024, 10], stddev=0.1))
b_fc2 = tf.Variable(tf.constant(0.1, shape=[10]))
y_pred = tf.matmul(h_fc1, W_fc2) + b_fc2
y_true = tf.placeholder(tf.float32, [None, 10])
# 定義損失函數和優化器
cross_entropy = tf.reduce_mean(
tf.nn.softmax_cross_entropy_with_logits_v2(labels=y_true, logits=y_pred))
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
# 訓練模型
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for i in range(1000):
batch = mnist.train.next_batch(50)
if i % 100 == 0:
train_accuracy = accuracy.eval(feed_dict={
x: batch[0], y_true: batch[1], keep_prob: 1.0})
print('step %d, training accuracy %g' % (i, train_accuracy))
train_step.run(feed_dict={x: batch[0], y_true: batch[1], keep_prob: 0.5})
# 測試模型
test_accuracy = accuracy.eval(feed_dict={
x: mnist.test.images, y_true: mnist.test.labels, keep_prob: 1.0})
print('test_accuracy %g' % test_accuracy)
五、CNN網路添加高斯噪音
在實際應用中,由於數據的不穩定性,我們會遇到很多噪音數據,這就會對訓練模型產生影響。為了解決這個問題,我們可以在輸入數據中添加高斯噪音,提高訓練模型的魯棒性。
# 定義添加高斯噪音的函數
def add_noise(image):
row, col = image.shape
mean = 0
var = 0.1
sigma = var ** 0.5
gauss = np.random.normal(mean, sigma, (row, col))
gauss = gauss.reshape(row, col)
noisy = image + gauss
return noisy
# 定義生成帶噪音數據集的函數
def generateNoisyDataset(dataset, noise_rate):
for i in range(len(dataset)):
dataset[i] = add_noise(dataset[i])
return dataset
# 讀取MNIST數據集
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()
# 將數據集進行隨機打亂
permute_train = np.random.permutation(train_images.shape[0])
train_images = train_images[permute_train]
train_labels = train_labels[permute_train]
# 生成帶噪音數據集
noise_train_images = generateNoisyDataset(train_images, 0.1)
noise_test_images = generateNoisyDataset(test_images, 0.1)
# 訓練模型
model.fit(noise_train_images, train_labels, epochs=10,
validation_data=(noise_test_images, test_labels))
六、CNN網路主要的應用領域是
CNN網路主要用於圖像識別、目標檢測、物體識別等領域。在圖像識別領域,CNN已經達到了人眼識別的水平,被廣泛應用於人臉識別、車牌識別、自然場景文字識別等。
七、CNN網路用語
- Batch:一次批量的樣本
- Epoch:所有批次訓練一次,稱為一個Epoch
- Convolution Layer:卷積層
- Pooling Layer:池化層
- Dropping:Dropout
- Activation Function:激活函數
- Optimizer:優化器
八、CNN網路結構及原理
CNN網路的結構和原理源於生物學中的視覺系統。CNN首先通過卷積層進行特徵提取,然後通過池化層來提高模型的魯棒性。最後通過全連接層將特徵映射到類別,得到最後的預測結果。CNN的核心是卷積操作和權重共享,這使得CNN網路可以自動學習和優化自己的特徵。
九、CNN網路模型
CNN網路模型包括LeNet-5、AlexNet、VGG、GoogLeNet、ResNet等。其中LeNet-5是最早的CNN網路模型,AlexNet是在2012年ImageNet上取得了巨大突破的模型,VGG在2014年ImageNet上獲得了更好的結果,而GoogLeNet和ResNet則採用了更深層次的網路結構,並在2015年ImageNet上取得了更好的效果。
原創文章,作者:JXAM,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/134111.html
微信掃一掃
支付寶掃一掃