【问题标题】:normalize training data with channel means and standard deviation in CNN model在 CNN 模型中使用通道均值和标准差对训练数据进行归一化
【发布时间】:2023-03-04 10:15:01
【问题描述】:

我正在使用 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]

我想知道是否有任何方法以编程方式查找通道均值及其标准差,以便我们进行标准化。这样做有更好的主意吗?还有什么可以提高我的样本模型的准确性?如何找到通道均值及其标准差?任何可能的策略或编码尝试?

【问题讨论】:

    标签: python tensorflow keras conv-neural-network


    【解决方案1】:

    我相信您可以通过这种很有希望的方式进行数据标准化:

    (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 ....
    

    希望这是您想要为规范化做的事情。如果您有任何问题,请告诉我:)

    【讨论】:

      【解决方案2】:

      要将训练图像值从 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 是一个好的开始。

      【讨论】:

      • 标准差怎么样,我们不是在做x_test_mean = np.mean(x_test, axis=0吗?
      猜你喜欢
      • 2014-11-23
      • 2021-11-02
      • 2021-07-30
      • 2020-07-22
      • 2018-05-10
      • 2012-03-27
      • 1970-01-01
      • 2021-07-08
      • 2017-10-09
      相关资源
      最近更新 更多