繁体   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