一、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