2017-01-14 3 views
2

У меня есть массив изображений, которые я хочу передать TensorFlow. Я хочу сосредоточить изображения вокруг среднего и стандартизировать стандартное отклонение. Я последовал за this answer, но, похоже, я не могу получить нулевое значение. Я изучаю numpy, поэтому, возможно, мне не хватает чего-то простого.Центрирование массива изображений в python

Мой текущий код:

import numpy as np 

# Load pickled data 
import pickle 

# TODO: Fill this in based on where you saved the training and testing data 

training_file = 'train.p' 

with open(training_file, mode='rb') as f: 
    train = pickle.load(f) 

X_train, y_train = train['features'], train['labels'] 

# Let us inspect whether the data is centered. 
for ch in range(3): 
    print("for channel %s mean or clahe data: %s" %(
      ch, X_train[:,ch].mean())) 

X_norm = np.copy(X_train) 
for ch in range(3): 
    X_norm[:, ch] = (X_norm[:, ch] - X_norm[:,ch].mean())/ X_norm[:, ch].std() 

# Let us inspect our new mean. 
for ch in range(3): 
    print("for channel %s new mean for CLAHE data: %s new std: %s" % (
      ch, X_norm[:,ch].mean(), X_norm[:,ch].std())) 

ОТМЕЧЕННЫХ набор данных может быть получена из here

С выходом:

for channel 0 mean or clahe data: 88.9090870931 
for channel 1 mean or clahe data: 88.2472258708 
for channel 2 mean or clahe data: 87.5765175619 
for channel 0 new mean for CLAHE data: 8.77830238806 new std: 45.7207148838 
for channel 1 new mean for CLAHE data: 8.79695563094 new std: 45.7780456089 
for channel 2 new mean for CLAHE data: 8.71418658131 new std: 45.5661789057 

Мой желаемый результат будет иметь для каждого канала в среднем около ноль и стандартное отклонение 1.

ответ

2

T Основной проблемой является то, что массив имеет тип uint8 (целые числа 0..255). Это не может быть действительно центрировано или нормализовано без изменения типа массива. Например:

X_norm = np.array(X_train, dtype=np.float, copy=True) 

Теперь записи являются числами с плавающей запятой, поэтому центрирование и масштабирование отлично работают. Тем не менее, вы можете запустить из памяти (массив большой), так что при попытке вещи, я хотел бы использовать только кусочек данных:

X_norm = np.array(X_train[:100], dtype=np.float, copy=True) 

Там другая проблема с кодом: [:, ch] селектора не делайте то, что вы думаете, что он делает. Он срезает вторую ось (ось = 1), а не последнюю. То, что вы имели в виду, это [..., ch], где многоточие означает «столько же колоний, сколько необходимо». См. NumPy indexing.


Полезно для отладки: print(X_norm.dtype), print(X_norm[:, 0].shape)

Смежные вопросы