Posted on 1 Comment

卷積神經網路CNN介紹

卷積神經網路CNN

卷積神經網路(Convolutional Neural Network,簡稱 CNN)是一種專門用於圖像處理的神經網路。它包含許多卷積層和池化層,可以捕捉圖像中的空間關係和細節。

  • 卷積層: Conv2D (tf.keras.layers.Conv2D),使用一個卷積核來提取圖片特徵
  • 池化層: MaxPooling2D (tf.keras.layers.MaxPooling2D),通過計算輸入圖像的不同區域的最大值或平均值來進行池化

卷積層(Conv2D)

使用一個卷積核來提取圖片特徵。
以下為其參數設定的介紹: 卷積層(Conv2D)參數設定

卷積層中的每個神經元都有一個濾波器(也稱為卷積核),用來提取圖像的特徵。每個濾波器都有一個指定的大小和深度,並且會在輸入圖像的不同區域進行卷積運算。例如,如果濾波器的大小為 3×3,且深度為 16,則每個濾波器都會提取 3×3 的區域中深度為 16 的特徵。

以下為其計算方法的簡單範例

當有部分的卷積核超出圖片範圍時,有兩種方法去解決:
1. 忽略它: 將padding設定為valid

2. 將整個圖像周圍填充0: 將padding設定為same

池化層(MaxPooling2D)

池化層則是將輸入圖像的大小縮小的層,它的主要功能是對圖像的特徵進行下采樣 (downsampling),降低網絡的計算量並減少過擬合 (overfitting) 的風險。它通過計算輸入圖像的不同區域的最大值或平均值來進行池化。通過池化,可以將圖像中的高維度特徵轉化為低維度特徵、降低計算複雜度,同時還能保留圖像中重要的特徵。

最大值池化層和平均值池化層是兩種常用的池化方法。

最大值池化層對卷積過的特徵圖 (convolutional feature map) 進行下采樣時,會將其中每個子區域 (sub-region) 取出其中的最大值,這樣可以保留最重要的特徵,可以適用於辨識邊緣、輪廓、細節的圖像。

平均值池化層對卷積過的特徵圖進行下采樣時,會將其中每個子區域取出其中的平均值。平均值池化更能保留圖像整體特徵,適用於辨識整體顏色、紋理、形狀等。

記得不同情境需求評估適用池化層種類,並且池化層種類通常與當時訓練資料有關。

下面為一個最大池化層的實作步驟解釋:

池化層有兩個重要參數: pool_sizestrides,分別代表步長和池化的大小,上圖的示例為步長2且池化大小為(2,2)的最大池化層的範例。

如何對彩色圖片做卷積處理

因為彩色圖片為一個RBG圖片

若是黑白圖片為(25,25,1),則相同大小的彩圖形狀會是(25,25,3),因此卷積核的形狀也會從(3,3)變為(3,3,3)

每一個圖層都要算三次然後再加總,總共要三個圖層,因此複雜度從黑白->彩色會增加9倍以上

Posted on 1 Comment

卷積層(Conv2D)參數設定

卷積層(Conv2D)介紹

以下為官方介紹連結:
https://keras.io/api/layers/convolution_layers/convolution2d/

參數介紹

參數

常用參數

  • filters:指定層中濾波器(也稱為卷積核)的數量。通常,增加濾波器的數量可以提高模型的表現,但也會增加計算複雜度。
  • kernel_size:指定濾波器的大小。濾波器的大小越大,模型可以捕捉到的特徵就越大,但也會增加計算複雜度。
  • strides:指定濾波器在輸入數據集上的步長。步長越大,模型就會捕捉到越少的特徵,但也會減少計算複雜度。
  • padding:指定是否對輸入數據集進行 padding。如果選擇 padding,則會在輸入數據集的周圍填充一圈 0,以便濾波器可以捕捉到輸入數據集的邊界特徵。

在設定這些參數時,需要考慮模型的複雜度和需要的特徵。例如,如果輸入數據集很大,且需要捕捉較大的特徵,那麼可能需要使用較大的濾波器和較大的步長。如果輸入數據集較小,且需要捕捉較多的細節,那麼可能需要使用較小的濾波器和較小的步長。

還可以嘗試使用不同的 padding 方式來控制輸入數據集的大小。例如,如果你使用「same」padding,則輸出數據集的大小將與輸入數據集的大小相同;如果你使用「valid」padding,則輸出數據集的大小將比輸入數據集的大小小。

Posted on

如何提高機器學習的準確率

提高準確率的方向

可以考慮用以下幾個方式來提高準確率:

  • 增加訓練數據:模型訓練的資料越多,模型就有更多的資訊來學習,因此準確率往往會提高。
  • 調整超參數:你可以調整超參數(例如學習率、損失函數、正則化項等)來提高模型的準確率。
  • 改變模型結構:你可以增加或刪減模型中的層數、增加每層的神經元數量,或者使用不同的激活函數來改變模型的結構。
  • 訓練更長時間:模型訓練的時間越長,模型就有更多的時間來學習,因此準確率往往會提高。
  • 使用不同的模型:你可以試試不同的模型結構,例如殘差網路或卷積神經網路,看看哪個模型的準確率更高。

數據資料的準備

請見我的另一篇文章: 準備數據集資料的方針

調整超參數

超參數是指在訓練模型時不能由模型自動學習的參數。它們通常會影響模型的性能,因此在訓練模型時需要手動設置。

一些常見的超參數包括:

  • 學習率:決定了模型在訓練過程中更新權重的速度。
  • 損失函數:決定了模型在訓練過程中最小化的目標函數。
  • 正則化項:決定了模型在訓練過程中對過擬合的懲罰力度。
  • 批量大小:決定了模型在訓練過程中每次更新權重時使用的樣本數量。

設置超參數的方法有很多,其中常見的方法包括網格搜索隨機搜索

網格搜索是指對每個超參數設置一組固定的值,然後枚舉所有可能的組合來尋找最佳超參數。
隨機搜索則是隨機設置超參數的值,然後找出準確率最高的超參數組合。

也可以使用自動調參工具,例如 Hyperopt Optuna,來幫助你設置超參數。這些工具可以自動幫你調整超參數,以便找到最佳的超參數組合。

使用TensorFlow Tuner 對一個模型的參數進行調優

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

# Define the model
def build_model(hp):
    model = keras.Sequential()
    model.add(layers.Dense(units=hp.Int('units', min_value=32, max_value=512, step=32), activation='relu', input_shape=(784,)))
    model.add(layers.Dense(10, activation='softmax'))
    model.compile(
        optimizer=keras.optimizers.Adam(hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4])),
        loss='categorical_crossentropy',
        metrics=['accuracy'])
    return model

# Define the tuner
tuner = keras.tuner.RandomSearch(
    build_model,
    objective='val_accuracy',
    max_trials=5,
    directory='my_dir',
    project_name='MNIST')

# Load the MNIST dataset
(x_train, y_train), (x_val, y_val) = keras.datasets.mnist.load_data()

# Normalize the data
x_train = x_train.reshape(-1, 784).astype('float32') / 255
x_val = x_val.reshape(-1, 784).astype('float32') / 255

# Start the tuning
tuner.search(x_train, y_train, epochs=2, validation_data=(x_val, y_val))

# Print the best model
best_model = tuner.get_best_models(num_models=1)[0]
best_model.summary()

使用網格搜索調整超參數

網格搜索是一種超參數調整方法,它可以幫助我們找到最佳的超參數組合。網格搜索的基本思路是,對於每個超參數,設定一組固定的值,然後枚舉所有可能的超參數組合,最終找到最佳的超參數組合。

舉例來說,假設有一個模型,需要調整兩個超參數:學習率和正則化率。可以設定學習率的可能取值為 0.1、0.01 和 0.001。然後,就會有九種可能的超參數組合:

學習率:0.1,正則化率:0.1
學習率:0.1,正則化率:0.01
學習率:0.1,正則化率:0.001
學習率:0.01,正則化率:0.1
學習率:0.01,正則化率:0.01
學習率:0.01,正則化率:0.001
學習率:0.001,正則化率:0.1
學習率:0.001,正則化率:0.01
學習率:0.001,正則化率:0.001

可以對每組超參數進行訓練,並計算每組超參數的準確率。最後,你就可以找到準確率最高的超參數組合。

from sklearn.model_selection import GridSearchCV

# 定義模型
model = SomeModel()

# 定義超參數組合
param_grid = {'learning_rate': [0.1, 0.01, 0.001],
              'regularization_rate': [0.1, 0.01, 0.001],
              'batch_size': [32, 64, 128]}

# 使用網格搜索尋找最佳超參數組合
grid_search = GridSearchCV(model, param_grid, cv=5)
grid_search.fit(X_train, y_train)

# 輸出最佳超參數組合
print(grid_search.best_params_)

在這個範例中,定義了三個超參數:學習率、正則化率和批量大小。我們將每個超參數的可能取值列出來,然後使用 GridSearchCV 進行網格搜索。最後輸出最佳超參數組合。

網格搜索是一種有效的調整超參數的方法,但它有一個缺點:如果超參數的可能取值較多,那麼需要訓練的模型數量就會變得很多。這可能會導致訓練時間過長。

因此,可以考慮使用隨機搜索來調整超參數,它可以在較短的時間內找到較佳的超參數組合。

用隨機搜索來調整超參數

from sklearn.model_selection import RandomizedSearchCV

# 定義模型
model = SomeModel()

# 定義超參數組合
param_dist = {'learning_rate': scipy.stats.uniform(0.01, 0.1),
              'regularization_rate': scipy.stats.uniform(0.01, 0.1),
              'batch_size': [32, 64, 128]}

# 使用隨機搜索尋找最佳超參數組合
random_search = RandomizedSearchCV(model, param_dist, n_iter=10, cv=5)
random_search.fit(X_train, y_train)

# 輸出最佳超參數組合
print(random_search.best_params_)

Keras中使用隨機搜索調整超參數

在 Keras 中,可以使用 fit() 方法來訓練模型,並在調用該方法時傳遞超參數。以下是一個使用隨機搜索調整 Keras 模型超參數的範例:

from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import uniform

# 定義模型工廠函數
def create_model(learning_rate=0.01, regularization_rate=0.0):
    model = Sequential()
    model.add(Dense(32, input_dim=8, kernel_regularizer=l2(regularization_rate)))
    model.add(Activation('relu'))
    model.add(Dense(1))
    model.add(Activation('sigmoid'))
    model.compile(loss='binary_crossentropy', optimizer=Adam(lr=learning_rate), metrics=['accuracy'])
    return model

# 封裝模型為 KerasClassifier
model = KerasClassifier(build_fn=create_model, verbose=0)

# 定義超參數組合
param_dist = {'learning_rate': uniform(0.01, 0.1),
              'regularization_rate': uniform(0.01, 0.1)}

# 使用隨機搜索尋找最佳超參數組合
random_search = RandomizedSearchCV(model, param_dist, n_iter=10, cv=5)
random_search.fit(X_train, y_train)

# 輸出最佳超參數組合
print(random_search.best_params_)

改變模型結構

可嘗試以下的超參數設置來試試看:

學習率:0.001 到 0.01 之間的浮點數。
正則化率:0.001 到 0.01 之間的浮點數。
批量大小:32、64 或 128。
層數:2 到 4 層之間的整數。
神經元數量:64、128 或 256。

甚麼是神經元

神經元(neuron)是生物神經系統中的基本單元,它負責接收、處理和傳遞信息。在人類大腦中,神經元通過樹狀結構相互連接,形成了神經網絡。

在人工神經網絡中,神經元也是基本單元。它們通過連接形成了多層結構,用於解決各種複雜的計算和學習任務。神經元通常由輸入、權重、偏差和激活函數組成。輸入是神經元接收的數據,權重是用於計算輸出的參數,偏差是用於調整輸出水平的參數,激活函數是用於決定神經元是否觸發的函數。

在訓練神經網絡時,神經元的權重和偏差會被調整,以使得輸出與預期輸出更加接近。通過不斷調整神經元的參數,神經網絡最終可以學習到解決任務所需的知識和技能。

Posted on 1 Comment

準備數據集資料的方針

如何準備數據集

使用質量高的資料,如:​

  • 清晰的圖像: 圖像清晰且無模糊或雜訊。​
  • 正確的標記: 圖像被正確地標記為相應的類別。​
  • 代表性的數據: 數據集中的數據能夠代表所有可能的輸入圖像,例如不同的角度、光線、尺寸等。​

避免以下狀況:​

  • 模糊或不清晰的圖像: 圖像中有大量的模糊或雜訊。​
  • 錯誤的標記: 圖像被錯誤地標記為其他類別。​
  • 不代表性的數據: 數據集中的數據只代表一小部分可能的輸入圖像。

數據集要多少張才足夠

所需的圖片張數會視實際情況而會有所不同。例如,以撲克牌辨識為例,若數據集中只有每種牌的一種花色,或者您的數據集中可能有每種牌的多種花色,隨著分類的數量的增加,所需要的數據集規模也會隨之增加。
因此,在建立模型之前,需要先了解所要建構的數據集的結構,以確保使用的模型能夠正確地處理數據。

決定數據集大小需要考慮的因素有很多,因此無法給出一個硬性的準則。不過,通常而言,越多的訓練數據可以訓練出的模型表現越好。
然而,過多的訓練數據也可能會導致過擬合(overfitting)的問題,即模型對訓練數據表現良好,但對新數據的表現不佳。因此,在建立模型時,還需要考慮到模型的複雜度和訓練數據集的大小之間的平衡。

此外,訓練數據集的質量也很重要。如果您的數據集中有大量的標記錯誤或不清晰的圖像,那麼即使您的數據集很大,模型的表現也可能不佳。
因此,在確定數據集大小時,需要考慮許多因素,並嘗試找出最佳平衡。可以嘗試不同的數據集大小,並觀察模型的表現,以找出最佳的數據集大小。

若只是在測試模型階段,可以先嘗試使用少量的數據集來訓練模型。這可以幫助我們快速測試準備數據集的想法,並大致的了解模型的表現。
當確定了模型的結構和超參數後,可以考慮增加數據集的大小,以提高模型的準確度。因此,在建立模型時,建議先使用少量的數據集來確定模型的結構和超參數,然後再考慮增加數據集的大小。
所謂的少量,若只是測試階段,可以只需要幾百張圖像來確定模型的結構和超參數。但是,需要注意的是,模型的表現可能受到數據集質量的影響。即使數據集很小,如果數據集中的圖像質量很高,那麼模型的表現也可能很好。

可以嘗試使用以下數量的圖像:

  • 少量數據集: 例如,您可以使用 100-200 張圖像來訓練模型。
  • 中等數據集: 例如,您可以使用 1000-5000 張圖像來訓練模型。
  • 大型數據集: 例如,您可以使用 10000 張或更多的圖像來訓練模型。

數據集數量算法: 如果我們要使用 52 張圖像,並且對每張圖像進行 5 種不同的變化,則您的數據集大小就是 52*5=260 張圖像。

怎麼準備圖像資料集

在準備圖形資料時,有時我們會思考若先使用修圖軟體去背,內把要辨識的目標以外的東西都留白,是否有助於計算模型?

在實際運用上,將資料集中非目標部分留白並不會對模型的訓練有明顯的幫助。在訓練模型時,我們最好提供所有可能的資料,以便模型在訓練過程中學習到的特徵越豐富越好。同時,我們也希望模型能夠學習到那些與目標無關的資訊,因為這些資訊可能會在模型在測試時遇到類似的情況時派上用場。

有些人可能會擔心,如果資料集中包含了那些與目標無關的資訊,會不會對模型的訓練帶來干擾?實際上,當模型的訓練資料足夠多,且資料的質量足夠高時,這種情況很少會發生。在這種情況下,模型會自動學習到與目標相關的特徵,並且會忽略那些與目標無關的資訊。

訓練資料的數量的要求取決於許多因素,例如模型的複雜度、資料的質量、資料的分布等。在一般情況下,越複雜的模型、資料質量越高、資料分布越不均勻,訓練資料的數量就需要越多。

然而,要確切地知道訓練資料的數量是否足夠,通常需要通過不斷地實驗和驗證來確定。例如,我們可以對模型進行不斷地訓練並觀察它的效果,然後根據模型的表現是否達到滿意的程度來判斷是否需要增加訓練資料的數量。

然而,實際上,訓練資料的數量往往不是決定模型表現的唯一因素。在訓練模型時,我們還要考慮模型的複雜度、訓練過程中使用的技巧 (例如正則化、數據增強等)、訓練超參數的設定等因素。所以,在訓練模型時,我們需要對所有這些因素都要進行綜合考慮,才能得到最好的模型表現。

如何選擇具代表性的資料集

  • 篩選條件應該基於數據品質:例如,如果有一些圖片的解析度很低,或者圖片中的物體模糊不清,那麼這些圖片可能對訓練準確度沒有太大的幫助,因此可以考慮刪除這些圖片。
  • 篩選方針應該基於訓練目標:例如,如果你的訓練目標是辨識不同種類的動物,那麼你可以考慮保留足夠多的各種動物的圖片,並且刪除一些與訓練目標無關的圖片 (例如,建築物、景觀等)。
  • 篩選條件和方針應該基於數據平衡:例如,如果你的數據集中有一些類別的圖片數量遠大於其他類別的圖片數量,那麼這可能會影響訓練準確度。因此,你可以考慮刪除一些數量較多的類別的圖片,以平衡數據。

梗圖分享

Posted on

如何判讀訓練結果

訓練過程

下面為一個epochs為10的訓練過程的log

機器學習結果判讀

如上圖,當我們下了model.fit開始跑機器學習後,會可以看到跑出下面這些資訊,這時候要如何解讀這些資訊呢?
loss: 0.0337, accuracy: 0.9910, val_loss: 0.1509, val_accuracy: 0.9762​

  • loss:指的是模型在訓練數據集上的損失。損失越低,代表模型的表現越好。​
  • accuracy:指的是模型在訓練數據集上的準確率。準確率越高,代表模型的表現越好。​
  • val_loss:指的是模型在驗證數據集上的損失。損失越低,代表模型的表現越好。​
  • val_accuracy:指的是模型在驗證數據集上的準確率。準確率越高,代表模型的表現越好。​

0.9762 的準確率可以說是相當不錯的,但是在某些應用中可能還不夠。例如,在自動駕駛應用中,準確率可能需要更高,因為一個錯誤的預測可能會導致嚴重的後果。
在這個結果的數據集中,準確率為 0.9762 ,其大約會有 2.38% 的錯誤率。
如果有 100 張圖片,則大約有 2.38 張圖片會被錯誤地預測。

學習效果不好的原因

如果模型在驗證數據集上的準確率低於實際準確率,那可能是因為以下原因:

  • 驗證數據集不具有代表性: 如果驗證數據集中的數據與實際應用中的數據有很大的差異,那麼模型的驗證數據集上的準確率可能會低於實際準確率。
  • 模型過度擬合: 如果模型在訓練數據集上的表現很好,但是在驗證數據集上的表現較差,那麼這可能是因為模型過度擬合了訓練數據集。過度擬合的模型往往在訓練數據集上表現較好,但是在沒有看過的數據集上表現較差。因此,可嘗試增加數據集的大小使用正則化來減少模型的過度擬合。
  • 模型訓練不足: 如果模型沒有被訓練足夠長的時間,那麼它的表現可能會不夠好。你可以增加訓練的 epoch 數,或者增加每個 epoch 中的訓練次數來幫助模型學習。
  • 還有一種情況就是模型的訓練準確率和驗證準確率之間的差距較大,這可能是因為模型過擬合或者過欠擬合。如果模型過擬合,則訓練準確率會很高,但是驗證準確率會很低;如果模型過欠擬合,則訓練準確率和驗證準確率都會很低。可以通過調整模型的超參數來平衡訓練準確率

歸納學習成效不好的原因如下:

  • 欠擬合。如果模型過於簡單,則可能會欠擬合。欠擬合的模型在訓練數據集上的表現可能不夠好,導致訓練準確率越來越差。
  • 過擬合。如果模型過於複雜,則可能會過擬合。過擬合的模型在訓練數據集上的表現可能很好,但是在沒有看過的數據集上的表現可能較差。
  • 學習率過大。如果模型的學習率過大,則模型可能會跳過最佳解,導致訓練準確率越來越差。

如何解決

  • 調整模型的複雜度。你可以增加或減少模型的層數或每層的神經元數量,以平衡模型的複雜度。
  • 使用正則化。正則化是一種常見的技巧,可以減少模型的過擬合。
  • 調整學習率。你可以使用不同的學習率來平衡收敛速度和準確率。
Posted on

Keras介紹

甚麼是Keras

Keras是一個用Python編寫的開源神經網路庫,旨在快速實現深度神經網路,專注於使用者友好、模組化和可延伸性,除標準神經網路外,Keras還支援卷積神經網路和迴圈神經網路。包含許多常用神經網路構建塊的實現,例如層、目標、啟用功能、最佳化器和一系列工具,可以更輕鬆地處理圖像和文字資料。

Keras由純Python編寫而成並基於Tensorflow、Theano以及CNTK後端。Keras 為支持快速實驗而生,能夠把你的idea迅速轉換為結果,如果你有如下需求,請選擇Keras:

  • 簡易和快速的原型設計(keras具有高度模塊化,極簡,和可擴充特性)
  • 支持CNN和RNN,或二者的結合
  • 無縫CPU和GPU切換

Keras建立模型的流程

  • 載入數據集: 首先,您需要載入您要用來訓練模型的圖像數據集。您可以使用 Python 的數據讀取庫(如 pandas 或 numpy) 來讀取本地數據集,或者使用 Keras 自帶的數據集(如 MNIST 手寫數字數據集)。
  • 將數據拆分為訓練集和測試集: 接下來,您需要將數據集拆分為訓練集和測試集。這樣可以幫助您評估模型的表現。通常,您會將大約 80% 的數據集用於訓練,剩餘的 20% 用於測試。
  • 預處理數據: 在進行模型訓練之前,您需要對數據進行預處理。這可能包括將圖像大小轉換為相同的大小,標準化像素值等。
  • 建立模型: 接下來,您可以使用 Keras 來建立模型。Keras 提供了許多不同的模型建構器(如 Sequential 或 functional API),您可以使用它們來建立不同類型的模型。在建立模型時,您需要考慮使用哪種模型類型(如卷積神經網絡或長短期記憶網絡)、使用哪些層類型(如卷積層、池化層、全連接層等),以及如何連接這些層。在決定模型結構時,您可以參考相關研究或嘗試不同的組合以找出最佳的模型結構。
  • 編譯模型: 一旦您已經建立了模型,您需要使用 Keras 的 compile 方法將其編譯。在編譯時,您需要指定損失函數和優化器。損失函數用於評估模型的表現,優化器用於更新模型的權重以使損失最小化。
  • 訓練模型: 一旦您已經編譯了模型,您就可以使用 Keras 的 fit 方法對模型進行訓練。在訓練過程中,您需要指定訓練集和模型訓練的參數,如批次大小和訓練輪數。
  • 評估模型: 一旦模型訓練完成,您就可以使用 Keras 的 evaluate 方法對模型進行評估。評估時,您需要指定測試集,Keras 會自動計算損失和指標(如準確率)。
  • 使用模型: 一旦您已經訓練好了模型,就可使用model.predict來預測資料

與Tensorflow的關係

TensorFlow是一個用於構建和訓練模型的平台。它提供了很多功能,可以讓你輕鬆地構建、訓練和部署各種不同類型的模型。

Keras是一個用於構建和訓練深度學習模型的高階框架。它是在TensorFlow之上構建的,可以讓你輕鬆地使用TensorFlow的功能。

总之,TensorFlow是一個底層的框架,Keras是建立在TensorFlow之上的高階框架,可以讓你更輕鬆地構建和訓練模型。

基礎範例

這是一個建立模型的範例,主要用以做為圖片分類的神經學習,使用了下面幾種模型結構:
1、卷積層: 可以使用一或多個卷積層來提取圖像中的特徵。
2、池化層: 可以使用池化層來縮小圖像的尺寸,並且保留有用的特徵。
3、全連接層: 可以使用一或多個全連接層來將特徵轉換為預測結果。

from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
from keras.models import Sequential
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
# X_train 和 y_train 都是 NumPy 陣列
images = np.array(images)
labels= np.array(labels)
# 如果 y_train 是字符串類型的標籤,則可以使用 sklearn 的 LabelEncoder 來將它們轉換為數值。例如:
le = LabelEncoder()
y_train = le.fit_transform(y_train)
# 分割為訓練集及驗證集
X_train, X_test, y_train, y_test = train_test_split(images, labels, test_size=0.2)
# 建立模型
model = Sequential()

# 加入卷積層
model.add(Conv2D(filters=32, kernel_size=(3,3), activation='relu', input_shape=(200,200,3)))

# 加入池化層
model.add(MaxPooling2D(pool_size=(2,2)))

# 加入卷積層
model.add(Conv2D(filters=64, kernel_size=(3,3), activation='relu'))

# 加入池化層
model.add(MaxPooling2D(pool_size=(2,2)))

# 將特徵圖拉平
model.add(Flatten())

# 加入全連接層
model.add(Dense(units=64, activation='relu'))

# 加入輸出層
model.add(Dense(units=52, activation='softmax'))

# 編譯模型
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

# 開始訓練
model.fit(X_train, y_train, epochs=10, batch_size=32, validation_data=(X_test, y_test))

這是一個使用 Keras 載入模型並預測答案的範例

import numpy as np
import tensorflow as tf
from tensorflow import keras

# 載入模型
model = keras.models.load_model('model.h5')

# 假設我們有一個輸入矩陣 X,其中包含一些資料點
X = np.array([[0.1, 0.2, 0.3], [0.4, 0.5, 0.6]])

# 使用模型預測答案
predictions = model.predict(X)

# 輸出預測結果
print(predictions)
Posted on

用opencv作圖片旋轉

可以使用 OpenCV 的 cv2.getRotationMatrix2D() 函數來生成旋轉矩陣,然後使用 cv2.warpAffine() 函數將圖像旋轉。

import cv2
import numpy as np

# 讀取第一幅圖像
image = cv2.imread('image1.jpg')

import cv2
import numpy as np

def rotate_image(image, angle):
    # 取得圖像的高度和寬度
    (h, w) = image.shape[:2]
    # 計算圖像的中心點
    center = (w // 2, h // 2)
    # 取得旋轉矩陣
    M = cv2.getRotationMatrix2D(center, angle, 1.0)
    # 旋轉圖像
    rotated_image = cv2.warpAffine(image, M, (w, h))
    return rotated_image

# 示例: 將圖像旋轉 90 度
rotated_image = rotate_image(image, 90)

# 顯示結果
cv2.imshow('image', image)
cv2.imshow('rotated_image', rotated_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

請注意,旋轉角度是以逆時針方向為正的。例如,如果要將圖像逆時針旋轉 90 度,則角度值應設為 90。

此外,如果你想要在旋轉圖像時保留圖像的邊界,你可以使用 cv2.warpAffine() 函數的 borderValue參數來設置(255,255,255)。這樣會將旋轉後圖像的邊界填充為白色。

import cv2
import numpy as np

# 讀取第一幅圖像
image = cv2.imread('image1.jpg')


def rotate_image(image, angle):
    # 取得圖像的高度和寬度
    (h, w) = image.shape[:2]
    # 計算圖像的中心點
    center = (w // 2, h // 2)
    # 取得旋轉矩陣,並在旋轉時保留圖像的邊界
    M = cv2.getRotationMatrix2D(center, angle, 1.0)
    # 旋轉圖像
    rotated_image = cv2.warpAffine(image, M, (w, h), borderValue=(255,255,255))
    return rotated_image

# 示例: 將圖像旋轉 90 度
rotated_image = rotate_image(image, 90)


# 顯示結果
cv2.imshow('image', image)
cv2.imshow('rotated_image', rotated_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
Posted on

調整圖片的亮度

可以使用 OpenCV 的 cv2.convertScaleAbs() 函數來增亮圖像。這個函數會將圖像的每個像素值乘上一個指定的比例因子並加上一個常數,以此來調整圖像的亮度。

請注意,這個函數可能會導致圖像中的一些像素值超出 0 到 255 的範圍,因此你可能需要在函數末尾使用new_image = np.where(new_image > 255, 255, new_image)來將這些像素值限制在合法範圍內。

import cv2
import numpy as np

# 讀取第一幅圖像
image = cv2.imread('image1.jpg')

def increase_brightness(image, value):
    # 將圖像的每個像素值乘上指定的比例因子並加上常數
    new_image = cv2.convertScaleAbs(image, alpha=1, beta=value)
    # 將像素值限制在 0 到 255 之間
    new_image = np.where(new_image > 255, 255, new_image)
    return new_image

# 示例: 將圖像的亮度提高 50
bright_image = increase_brightness(image, 50)
# 示例: 將圖像的亮度降低50
dark_image = increase_brightness(image, -50)


# 顯示結果
cv2.imshow('image', image)
cv2.imshow('bright_image', bright_image)
cv2.imshow('dark_image', dark_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

Posted on

用opencv做圖像融合

OpenCV 的 cv2.addWeighted() 函數可用來實現圖像增量。

這個函數有三個輸入參數:

src1: 第一個輸入圖像,應該是第一幅圖像的數組。
alpha: 一個浮點數,用於決定第一幅圖像在輸出圖像中的權重。
src2: 第二個輸入圖像,應該是第二幅圖像的數組。
此函數返回值為加權的結果,其中第一幅圖像的權重為 alpha,第二幅圖像的權重為 1-alpha。

例如,假設你想要將第一幅圖像的 50% 与第二幅圖像的 50%相加,你可以使用以下代碼:

import cv2

# 讀取第一幅圖像
img1 = cv2.imread('image1.jpg')

# 讀取第二幅圖像
img2 = cv2.imread('image2.jpg')

# 將第一幅圖像的 50% 和第二幅圖像的 50% 相加
result = cv2.addWeighted(img1, 0.5, img2, 0.5, 0)

# 顯示結果
cv2.imshow('Result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

PS: 在使用 cv2.addWeighted() 函數時,兩幅圖像的大小必須相同,否則會出現錯誤。

Posted on

為每個python專案建立獨立的虛擬環境

甚麼是虛擬環境

虛擬環境 (virtual environment) 是一個隔離的 Python 環境,可以讓您在同一台電腦上安裝不同版本的 Python 套件,或是不同專案之間使用不同的套件版本。

使用虛擬環境可以幫助您避免不同專案之間因為套件版本不同而造成的衝突。例如,如果您有兩個專案,一個專案需要使用舊版本的套件,而另一個專案需要使用新版本的套件,您可以在兩個專案中分別建立兩個虛擬環境,並在每個虛擬環境中安裝所需的套件版本。這樣就可以避免在不同專案中使用不同版本的套件造成的衝突。

虛擬環境還可以讓您在不影響全域環境的情況下,安裝、卸載或更新套件。這對於在測試某些套件時特別有用,因為您可以在虛擬環境中安裝或卸載套件,而不用擔心會對全域環境造成影響。

總的來說,虛擬環境可以讓您更輕鬆地在同一台電腦上進行多個 Python 專案的開發,並且可以有效地隔離不同專案之間的套件版本。

於Windows建立虛擬環境

要建立新的虛擬環境,請選擇 Python 解譯器,並建立用來存放的 .\venv 目錄:

python -m venv --system-site-packages .\venv

啟動虛擬環境:

.\venv\Scripts\activate

在不影響主機系統設定的情況下,在虛擬環境中安裝套件。首先,請升級 pip:

pip install --upgrade pip

pip list  # show packages installed within the virtual environment

之後再離開虛擬環境:

deactivate 

於macOS建立虛擬環境

要建立新的虛擬環境,請選擇 Python 解譯器,並建立用來存放的 ./venv 目錄:

python3 -m venv --system-site-packages ./venv

使用殼層特定的指令啟動虛擬環境:

source ./venv/bin/activate  # sh, bash, or zsh
. ./venv/bin/activate.fish  # fish
source ./venv/bin/activate.csh  # csh or tcsh

虛擬環境啟用時,你的殼層提示會包含 (venv) 前置字元。

在不影響主機系統設定的情況下,在虛擬環境中安裝套件。首先,請升級 pip:

pip install --upgrade pip

pip list  # show packages installed within the virtual environment

之後再離開虛擬環境:

deactivate

啟動虛擬環境

可使使用下列指令啟動已建立好的虛擬環境

source ./env/bin/activate

為你的專案設定使用函式庫的列表

匯出現在專案所使用的函式庫

python -m pip freeze > requirements.txt

安裝函式庫列表

python -m pip install -r requirements.txt