![](/img/trans.png)
[英]How does sklearn.preprocessing.normalize normalize data, and can I replicate on new data with mean and standard deviation?
[英]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.