簡體   English   中英

在 CNN model 中使用通道均值和標准差對訓練數據進行歸一化

[英]normalize training data with channel means and standard deviation in CNN model

我正在使用 CNN 進行多類圖像分類,但准確率不是很好。 我假設我需要使用通道均值和標准差對訓練數據進行歸一化,以便提高准確性。 我提出了一種方法來做到這一點,但它不是很有效,因為我只是將隨機值作為均值,將標准差作為歸一化。 我不確定如何找到通道均值及其標准差。 我想知道有沒有辦法做到這一點。 誰能指出我如何做到這一點? 有什么可能的想法嗎?

我目前的嘗試

import tensorflow as tf
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Dense, Conv2D, MaxPooling2D, Dropout, Flatten, Input
from keras.datasets import cifar10
from keras.utils import to_categorical

(X_train, y_train), (X_test, y_test)= cifar10.load_data()
output_class = np.unique(y_train)
n_class = len(output_class)

input_shape = (32, 32, 3)
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
y_train_one_hot = to_categorical(y_train)
y_test_one_hot = to_categorical(y_test)

x = tf.keras.Input(shape=(32, 32, 3))
conv = Conv2D(128, (3, 3), activation='relu',input_shape=(32, 32, 3))(x)
conv = MaxPooling2D(pool_size=(2,2))(conv)
conv = Conv2D(64, (2,2))(conv)
conv = MaxPooling2D(pool_size=(2,2))(conv)
conv = Flatten()(conv)
conv = Dense(64, activation='relu')(conv)
conv = Dense(10, activation='softmax')(conv)
model = Model(inputs = x, outputs = conv)

我的標准化嘗試

這是我的標准化方式,我只是將隨機值分配給均值和標准差:

mean = [125.307, 122.95, 113.865]  ## random value
std = [62.9932, 62.0887, 66.7048]  ## random value

for i in range(3):
  X_train[:,:,:,i] = (X_train[:,:,:,i] - mean[i]) / std[i]
  X_test[:,:,:,i] = (X_test[:,:,:,i] - mean[i]) / std[i]

我想知道是否有任何方式以編程方式找到通道均值及其標准偏差,以便我們可以進行標准化。 這樣做有更好的主意嗎? 還有什么可以提高我的樣品 model 的准確性? 如何找到通道均值及其標准差? 任何可能的策略或編碼嘗試?

我相信您可以通過這種方式進行數據規范化,這很有希望:

(X_train, y_train), (X_test, y_test) = cifar10.load_data()
X_train = X_train.astype('float32') / 255.0
X_test = X_test.astype('float32') / 255.0
nb_classes = 10
Y_train = to_categorical(y_train, nb_classes)
Y_test = to_categorical(y_test, nb_classes)

## find channel mean, std and do data normalization
train_mean = np.mean(X_train, axis=0)
train_std = np.std(X_train, axis=0)
X_train = (X_train - train_mean) / train_std
X_test = (X_test - train_mean) / train_std

## then do training ....

希望這是你想要做的標准化。 如果您有任何問題,請告訴我:)

要將訓練圖像值從 0-255 標准化為 0-1,您只需將它們除以 255。

x_train = x_train.astype('float32') / 255
x_test = x_test.astype('float32') / 255
# subtract mean
x_train_mean = np.mean(x_train, axis=0)
x_train -= x_train_mean
x_test -= x_train_mean

請注意,您的網絡精度不佳的主要原因是網絡較淺。 嘗試增加 Conv2D 層的數量和其中的過濾器數量。 您還沒有提供優化器設置,但是學習率為 0.01 的 Adam 是一個好的開始。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM