AI01, Scaling image pixel data
Back to the previous page |page management
List of posts to read before reading this article
Contents
- numpy
- keras
- pytorch
numpy
Sample image
Normalize Pixel Values
STEP 1
# example of pixel normalization
from numpy import asarray
from PIL import Image
# load image
image = Image.open('boat.png')
pixels = asarray(image)
# confirm pixel range is 0-255
print(pixels.shape)
print(pixels.dtype)
print(pixels.min(), pixels.max())
pixels
OUTPUT1
(856, 1280, 4)
uint8
0 255
array([[[221, 223, 226, 255],
[210, 212, 215, 255],
[191, 192, 195, 255],
...,
[191, 192, 195, 255],
[210, 212, 215, 255],
[221, 223, 226, 255]],
[[213, 215, 217, 255],
[190, 192, 194, 255],
[206, 207, 208, 255],
...,
[206, 207, 208, 255],
[190, 192, 194, 255],
[213, 215, 217, 255]],
[[199, 201, 204, 255],
[196, 198, 199, 255],
[236, 234, 236, 255],
...,
[236, 234, 236, 255],
[196, 198, 199, 255],
[199, 201, 204, 255]],
...,
[[193, 193, 193, 255],
[180, 180, 180, 255],
[151, 152, 152, 255],
...,
[154, 154, 155, 255],
[180, 180, 180, 255],
[193, 193, 193, 255]],
[[197, 197, 197, 255],
[192, 192, 192, 255],
[179, 179, 179, 255],
...,
[179, 179, 179, 255],
[192, 192, 192, 255],
[197, 197, 197, 255]],
[[198, 198, 198, 255],
[196, 196, 196, 255],
[192, 192, 192, 255],
...,
[192, 192, 192, 255],
[196, 196, 196, 255],
[198, 198, 198, 255]]], dtype=uint8)
STEP 2
# convert from integers to floats
pixels = pixels.astype('float32')
# normalize to the range 0-1
pixels /= 255.0
# confirm the normalization
print(pixels.min(), pixels.max())
pixels
OUTPUT2
0.0 0.003921569
array([[[0.00339869, 0.00342945, 0.00347559, 0.00392157],
[0.00322953, 0.00326028, 0.00330642, 0.00392157],
[0.00293733, 0.00295271, 0.00299885, 0.00392157],
...,
[0.00293733, 0.00295271, 0.00299885, 0.00392157],
[0.00322953, 0.00326028, 0.00330642, 0.00392157],
[0.00339869, 0.00342945, 0.00347559, 0.00392157]],
[[0.00327566, 0.00330642, 0.00333718, 0.00392157],
[0.00292195, 0.00295271, 0.00298347, 0.00392157],
[0.00316801, 0.00318339, 0.00319877, 0.00392157],
...,
[0.00316801, 0.00318339, 0.00319877, 0.00392157],
[0.00292195, 0.00295271, 0.00298347, 0.00392157],
[0.00327566, 0.00330642, 0.00333718, 0.00392157]],
[[0.00306036, 0.00309112, 0.00313725, 0.00392157],
[0.00301423, 0.00304498, 0.00306036, 0.00392157],
[0.00362937, 0.00359862, 0.00362937, 0.00392157],
...,
[0.00362937, 0.00359862, 0.00362937, 0.00392157],
[0.00301423, 0.00304498, 0.00306036, 0.00392157],
[0.00306036, 0.00309112, 0.00313725, 0.00392157]],
...,
[[0.00296809, 0.00296809, 0.00296809, 0.00392157],
[0.00276817, 0.00276817, 0.00276817, 0.00392157],
[0.00232218, 0.00233756, 0.00233756, 0.00392157],
...,
[0.00236832, 0.00236832, 0.0023837 , 0.00392157],
[0.00276817, 0.00276817, 0.00276817, 0.00392157],
[0.00296809, 0.00296809, 0.00296809, 0.00392157]],
[[0.0030296 , 0.0030296 , 0.0030296 , 0.00392157],
[0.00295271, 0.00295271, 0.00295271, 0.00392157],
[0.00275279, 0.00275279, 0.00275279, 0.00392157],
...,
[0.00275279, 0.00275279, 0.00275279, 0.00392157],
[0.00295271, 0.00295271, 0.00295271, 0.00392157],
[0.0030296 , 0.0030296 , 0.0030296 , 0.00392157]],
[[0.00304498, 0.00304498, 0.00304498, 0.00392157],
[0.00301423, 0.00301423, 0.00301423, 0.00392157],
[0.00295271, 0.00295271, 0.00295271, 0.00392157],
...,
[0.00295271, 0.00295271, 0.00295271, 0.00392157],
[0.00301423, 0.00301423, 0.00301423, 0.00392157],
[0.00304498, 0.00304498, 0.00304498, 0.00392157]]], dtype=float32)
Center Pixel Values
- Global Centering: Calculating and subtracting the mean pixel value across color channels. [mean:O, std:X]
- Local Centering: Calculating and subtracting the mean pixel value per color channel. [mean:O, std:O]
Global Centering
STEP1
# example of global centering (subtract mean)
from numpy import asarray
from PIL import Image
# load image
image = Image.open('boat.png')
pixels = asarray(image)
pixels
OUTPUT
array([[[221, 223, 226, 255],
[210, 212, 215, 255],
[191, 192, 195, 255],
...,
[191, 192, 195, 255],
[210, 212, 215, 255],
[221, 223, 226, 255]],
[[213, 215, 217, 255],
[190, 192, 194, 255],
[206, 207, 208, 255],
...,
[206, 207, 208, 255],
[190, 192, 194, 255],
[213, 215, 217, 255]],
[[199, 201, 204, 255],
[196, 198, 199, 255],
[236, 234, 236, 255],
...,
[236, 234, 236, 255],
[196, 198, 199, 255],
[199, 201, 204, 255]],
...,
[[193, 193, 193, 255],
[180, 180, 180, 255],
[151, 152, 152, 255],
...,
[154, 154, 155, 255],
[180, 180, 180, 255],
[193, 193, 193, 255]],
[[197, 197, 197, 255],
[192, 192, 192, 255],
[179, 179, 179, 255],
...,
[179, 179, 179, 255],
[192, 192, 192, 255],
[197, 197, 197, 255]],
[[198, 198, 198, 255],
[196, 196, 196, 255],
[192, 192, 192, 255],
...,
[192, 192, 192, 255],
[196, 196, 196, 255],
[198, 198, 198, 255]]], dtype=uint8)
STEP2
# convert from integers to floats
pixels = pixels.astype('float32')
print(pixels.shape)
# calculate global mean across color channels
mean = pixels.mean()
print('Mean: %.3f'% mean)
print('Min: %.3f, Max: %.3f'% (pixels.min(), pixels.max()))
# global centering of pixels
pixels -= mean
# confirm it had the desired effect
mean = pixels.mean()
print('Mean: %.3f'% mean)
print('Min: %.3f, Max: %.3f'% (pixels.min(), pixels.max()))
pixels
OUTPUT
(856, 1280, 4)
Mean: 184.501
Min: 0.000, Max: 255.000
Mean: -0.000
Min: -184.501, Max: 70.499
array([[[ 36.49881, 38.49881, 41.49881, 70.49881],
[ 25.49881, 27.49881, 30.49881, 70.49881],
[ 6.49881, 7.49881, 10.49881, 70.49881],
...,
[ 6.49881, 7.49881, 10.49881, 70.49881],
[ 25.49881, 27.49881, 30.49881, 70.49881],
[ 36.49881, 38.49881, 41.49881, 70.49881]],
[[ 28.49881, 30.49881, 32.49881, 70.49881],
[ 5.49881, 7.49881, 9.49881, 70.49881],
[ 21.49881, 22.49881, 23.49881, 70.49881],
...,
[ 21.49881, 22.49881, 23.49881, 70.49881],
[ 5.49881, 7.49881, 9.49881, 70.49881],
[ 28.49881, 30.49881, 32.49881, 70.49881]],
[[ 14.49881, 16.49881, 19.49881, 70.49881],
[ 11.49881, 13.49881, 14.49881, 70.49881],
[ 51.49881, 49.49881, 51.49881, 70.49881],
...,
[ 51.49881, 49.49881, 51.49881, 70.49881],
[ 11.49881, 13.49881, 14.49881, 70.49881],
[ 14.49881, 16.49881, 19.49881, 70.49881]],
...,
[[ 8.49881, 8.49881, 8.49881, 70.49881],
[ -4.50119, -4.50119, -4.50119, 70.49881],
[-33.50119, -32.50119, -32.50119, 70.49881],
...,
[-30.50119, -30.50119, -29.50119, 70.49881],
[ -4.50119, -4.50119, -4.50119, 70.49881],
[ 8.49881, 8.49881, 8.49881, 70.49881]],
[[ 12.49881, 12.49881, 12.49881, 70.49881],
[ 7.49881, 7.49881, 7.49881, 70.49881],
[ -5.50119, -5.50119, -5.50119, 70.49881],
...,
[ -5.50119, -5.50119, -5.50119, 70.49881],
[ 7.49881, 7.49881, 7.49881, 70.49881],
[ 12.49881, 12.49881, 12.49881, 70.49881]],
[[ 13.49881, 13.49881, 13.49881, 70.49881],
[ 11.49881, 11.49881, 11.49881, 70.49881],
[ 7.49881, 7.49881, 7.49881, 70.49881],
...,
[ 7.49881, 7.49881, 7.49881, 70.49881],
[ 11.49881, 11.49881, 11.49881, 70.49881],
[ 13.49881, 13.49881, 13.49881, 70.49881]]], dtype=float32)
Local Centering
STEP1
# example of per-channel centering (subtract mean)
from numpy import asarray
from PIL import Image
# load image
image = Image.open('boat.png')
pixels = asarray(image)
print(pixels.shape)
# convert from integers to floats
pixels = pixels.astype('float32')
pixels
OUTPUT
(856, 1280, 4)
array([[[221., 223., 226., 255.],
[210., 212., 215., 255.],
[191., 192., 195., 255.],
...,
[191., 192., 195., 255.],
[210., 212., 215., 255.],
[221., 223., 226., 255.]],
[[213., 215., 217., 255.],
[190., 192., 194., 255.],
[206., 207., 208., 255.],
...,
[206., 207., 208., 255.],
[190., 192., 194., 255.],
[213., 215., 217., 255.]],
[[199., 201., 204., 255.],
[196., 198., 199., 255.],
[236., 234., 236., 255.],
...,
[236., 234., 236., 255.],
[196., 198., 199., 255.],
[199., 201., 204., 255.]],
...,
[[193., 193., 193., 255.],
[180., 180., 180., 255.],
[151., 152., 152., 255.],
...,
[154., 154., 155., 255.],
[180., 180., 180., 255.],
[193., 193., 193., 255.]],
[[197., 197., 197., 255.],
[192., 192., 192., 255.],
[179., 179., 179., 255.],
...,
[179., 179., 179., 255.],
[192., 192., 192., 255.],
[197., 197., 197., 255.]],
[[198., 198., 198., 255.],
[196., 196., 196., 255.],
[192., 192., 192., 255.],
...,
[192., 192., 192., 255.],
[196., 196., 196., 255.],
[198., 198., 198., 255.]]], dtype=float32)
STEP2
# calculate per-channel means and standard deviations
means = pixels.mean(axis=(0,1), dtype='float64')
print('Means: %s' % means)
print('Mins: %s, Maxs: %s' % (pixels.min(axis=(0,1)), pixels.max(axis=(0,1))))
# per-channel centering of pixels
pixels -= means
# confirm it had the desired effect
means = pixels.mean(axis=(0,1), dtype='float64')
print('Means: %s' % means)
print('Mins: %s, Maxs: %s' % (pixels.min(axis=(0,1)), pixels.max(axis=(0,1))))
pixels
OUTPUT
Means: [158.43480487 159.58662109 164.9829202 255. ]
Mins: [ 0. 0. 0. 255.], Maxs: [255. 255. 255. 255.]
Means: [-3.06365524e-07 -1.24562507e-06 4.88580506e-07 0.00000000e+00]
Mins: [-158.4348 -159.58662 -164.98293 0. ], Maxs: [96.56519 95.413376 90.01708 0. ]
array([[[ 62.565197 , 63.41338 , 61.01708 , 0. ],
[ 51.565197 , 52.41338 , 50.01708 , 0. ],
[ 32.565197 , 32.41338 , 30.01708 , 0. ],
...,
[ 32.565197 , 32.41338 , 30.01708 , 0. ],
[ 51.565197 , 52.41338 , 50.01708 , 0. ],
[ 62.565197 , 63.41338 , 61.01708 , 0. ]],
[[ 54.565197 , 55.41338 , 52.01708 , 0. ],
[ 31.565195 , 32.41338 , 29.01708 , 0. ],
[ 47.565197 , 47.41338 , 43.01708 , 0. ],
...,
[ 47.565197 , 47.41338 , 43.01708 , 0. ],
[ 31.565195 , 32.41338 , 29.01708 , 0. ],
[ 54.565197 , 55.41338 , 52.01708 , 0. ]],
[[ 40.565197 , 41.41338 , 39.01708 , 0. ],
[ 37.565197 , 38.41338 , 34.01708 , 0. ],
[ 77.56519 , 74.413376 , 71.01708 , 0. ],
...,
[ 77.56519 , 74.413376 , 71.01708 , 0. ],
[ 37.565197 , 38.41338 , 34.01708 , 0. ],
[ 40.565197 , 41.41338 , 39.01708 , 0. ]],
...,
[[ 34.565197 , 33.41338 , 28.01708 , 0. ],
[ 21.565195 , 20.41338 , 15.017079 , 0. ],
[ -7.434805 , -7.5866213, -12.982921 , 0. ],
...,
[ -4.434805 , -5.5866213, -9.982921 , 0. ],
[ 21.565195 , 20.41338 , 15.017079 , 0. ],
[ 34.565197 , 33.41338 , 28.01708 , 0. ]],
[[ 38.565197 , 37.41338 , 32.01708 , 0. ],
[ 33.565197 , 32.41338 , 27.01708 , 0. ],
[ 20.565195 , 19.41338 , 14.017079 , 0. ],
...,
[ 20.565195 , 19.41338 , 14.017079 , 0. ],
[ 33.565197 , 32.41338 , 27.01708 , 0. ],
[ 38.565197 , 37.41338 , 32.01708 , 0. ]],
[[ 39.565197 , 38.41338 , 33.01708 , 0. ],
[ 37.565197 , 36.41338 , 31.01708 , 0. ],
[ 33.565197 , 32.41338 , 27.01708 , 0. ],
...,
[ 33.565197 , 32.41338 , 27.01708 , 0. ],
[ 37.565197 , 36.41338 , 31.01708 , 0. ],
[ 39.565197 , 38.41338 , 33.01708 , 0. ]]],
dtype=float32)
SUPPLEMENT1
import numpy as np
a = np.array([[1, 2],
[3, 4]])
print(a.shape)
print(np.mean(a)) # (1+2+3+4)/4 = 2.5
print(np.mean(a, axis=0)) # (1+3)/2 = 2, (2+4)/2 = 3
print(np.mean(a, axis=1)) # (1+2)/2 = 2.5, (3+4)/2 = 3.5
OUTPUT
(2, 2)
2.5
[2. 3.]
[1.5 3.5]
SUPPLEMENT2
import numpy as np
a = np.array([[[1, 2],
[3, 4]],
[[5,6],
[7,8]]])
print(a.shape)
print(np.mean(a),'\n\n') # (1+2+3+4+5+6+7+8)/8
print(np.mean(a, axis=0)) # (1+5)/2 = 3, (2+6)/2 = 4
# (3+7)/2 = 5, (4+8)/2 = 6
print(np.mean(a, axis=(0,1))) # ([1+5]/2 + [3+7]/2)/2 = 4
# ([2+6]/2 + [4+8]/2)/2 = 5
print(np.mean(a, axis=(0,2)),'\n\n') # ([1+5]/2 + [2+6]/2)/2 = 3.5
# ([3+7]/2 + [4+8]/2)/2 = 5.5
print(np.mean(a, axis=1)) # (1+3)/2 = 2, (2+4)/2 = 3
# (5+7)/2 = 6, (6+8)/2 = 7
print(np.mean(a, axis=(1,0))) # ([1+3]/2 + [5+7]/2)/2 = 4
# ([2+4]/2 + [6+8]/2)/2 = 5
print(np.mean(a, axis=(1,2)),'\n\n') # ([1+3]/2 + [2+4]/2)/2 = 2.5
# ([5+7]/2 + [6+8]/2)/2 = 6.5
print(np.mean(a, axis=2)) # (1+2)/2 = 1.5, (3+4)/2 = 3.5
# (5+6)/2 = 5.5, (7+8)/2 = 7.5
print(np.mean(a, axis=(2,0))) # ([1+2]/2 + [5+6]/2)/2 = 3.5
# ([3+4]/2 + [7+8]/2)/2 = 5.5
print(np.mean(a, axis=(2,1)),'\n\n') # ([1+2]/2 + [3+4]/2)/2 = 2.5
# ([5+6]/2 + [7+8]/2)/2 = 6.5
OUTPUT
(2, 2, 2)
4.5
[[3. 4.]
[5. 6.]]
[4. 5.]
[3.5 5.5]
[[2. 3.]
[6. 7.]]
[4. 5.]
[2.5 6.5]
[[1.5 3.5]
[5.5 7.5]]
[3.5 5.5]
[2.5 6.5]
Standardize Pixel Values
For consistency of the input data, it may make more sense to standardize images per-channel using statistics calculated per minibatch or across the training dataset, if possible.
Global Standardization
# example of global pixel standardization
from numpy import asarray
from PIL import Image
# load image
image = Image.open('boat.png')
pixels = asarray(image)
# convert from integers to floats
pixels = pixels.astype('float32')
# calculate global mean and standard deviation
mean, std = pixels.mean(), pixels.std()
print('Mean: %.3f, Standard Deviation: %.3f' % (mean, std))
# global standardization of pixels
pixels = (pixels - mean) / std
# confirm it had the desired effect
mean, std = pixels.mean(), pixels.std()
print('Mean: %.3f, Standard Deviation: %.3f' % (mean, std))
OUTPUT
Mean: 184.501, Standard Deviation: 73.418
Mean: -0.000, Standard Deviation: 1.000
Positive Global Standardization
# example of global pixel standardization shifted to positive domain
from numpy import asarray
from numpy import clip
from PIL import Image
# load image
image = Image.open('boat.png')
pixels = asarray(image)
# convert from integers to floats
pixels = pixels.astype('float32')
# calculate global mean and standard deviation
mean, std = pixels.mean(), pixels.std()
print('Mean: %.3f, Standard Deviation: %.3f' % (mean, std))
# global standardization of pixels
pixels = (pixels - mean) / std
# clip pixel values to [-1,1]
pixels = clip(pixels, -1.0, 1.0)
# shift from [-1,1] to [0,1] with 0.5 mean
pixels = (pixels + 1.0) / 2.0
# confirm it had the desired effect
mean, std = pixels.mean(), pixels.std()
print('Mean: %.3f, Standard Deviation: %.3f' % (mean, std))
print('Min: %.3f, Max: %.3f' % (pixels.min(), pixels.max()))
OUTPUT
Mean: 184.501, Standard Deviation: 73.418
[[[ 0.4971365 0.52437776 0.5652396 0.9602377 ]
[ 0.34730968 0.3745509 0.41541278 0.9602377 ]
[ 0.08851784 0.10213846 0.14300032 0.9602377 ]
...
[ 0.08851784 0.10213846 0.14300032 0.9602377 ]
[ 0.34730968 0.3745509 0.41541278 0.9602377 ]
[ 0.4971365 0.52437776 0.5652396 0.9602377 ]]
[[ 0.38817152 0.41541278 0.442654 0.9602377 ]
[ 0.07489721 0.10213846 0.1293797 0.9602377 ]
[ 0.29282716 0.3064478 0.32006842 0.9602377 ]
...
[ 0.29282716 0.3064478 0.32006842 0.9602377 ]
[ 0.07489721 0.10213846 0.1293797 0.9602377 ]
[ 0.38817152 0.41541278 0.442654 0.9602377 ]]
[[ 0.19748281 0.22472405 0.26558593 0.9602377 ]
[ 0.15662095 0.1838622 0.19748281 0.9602377 ]
[ 0.7014459 0.6742046 0.7014459 0.9602377 ]
...
[ 0.7014459 0.6742046 0.7014459 0.9602377 ]
[ 0.15662095 0.1838622 0.19748281 0.9602377 ]
[ 0.19748281 0.22472405 0.26558593 0.9602377 ]]
...
[[ 0.11575908 0.11575908 0.11575908 0.9602377 ]
[-0.06130901 -0.06130901 -0.06130901 0.9602377 ]
[-0.45630705 -0.44268644 -0.44268644 0.9602377 ]
...
[-0.4154452 -0.4154452 -0.40182456 0.9602377 ]
[-0.06130901 -0.06130901 -0.06130901 0.9602377 ]
[ 0.11575908 0.11575908 0.11575908 0.9602377 ]]
[[ 0.17024156 0.17024156 0.17024156 0.9602377 ]
[ 0.10213846 0.10213846 0.10213846 0.9602377 ]
[-0.07492963 -0.07492963 -0.07492963 0.9602377 ]
...
[-0.07492963 -0.07492963 -0.07492963 0.9602377 ]
[ 0.10213846 0.10213846 0.10213846 0.9602377 ]
[ 0.17024156 0.17024156 0.17024156 0.9602377 ]]
[[ 0.1838622 0.1838622 0.1838622 0.9602377 ]
[ 0.15662095 0.15662095 0.15662095 0.9602377 ]
[ 0.10213846 0.10213846 0.10213846 0.9602377 ]
...
[ 0.10213846 0.10213846 0.10213846 0.9602377 ]
[ 0.15662095 0.15662095 0.15662095 0.9602377 ]
[ 0.1838622 0.1838622 0.1838622 0.9602377 ]]]
Mean: 0.563, Standard Deviation: 0.396
Min: 0.000, Max: 0.980
SUPPLEMENT
import numpy as np
clip(np.array([1,2,3,4,5]),2,4)
OUTPUT
array([2, 2, 3, 4, 4])
Local Standardization
# example of per-channel pixel standardization
from numpy import asarray
from PIL import Image
# load image
image = Image.open('boat.png')
pixels = asarray(image)
# convert from integers to floats
pixels = pixels.astype('float32')
# calculate per-channel means and standard deviations
means = pixels.mean(axis=(0,1), dtype='float64')
stds = pixels.std(axis=(0,1), dtype='float64')
print('Means: %s, Stds: %s' % (means, stds))
# per-channel standardization of pixels
pixels = (pixels - means) / stds
# confirm it had the desired effect
means = pixels.mean(axis=(0,1), dtype='float64')
stds = pixels.std(axis=(0,1), dtype='float64')
print('Means: %s, Stds: %s' % (means, stds))
OUTPUT
Means: [158.43480487 159.58662109 164.9829202 255. ], Stds: [70.63586854 70.73750037 70.1171148 0. ]
Means: [-3.98300453e-13 -1.93157989e-13 3.25967320e-13 nan], Stds: [ 1. 1. 1. nan]
keras
MNIST Handwritten Image Classification Dataset
# example of loading the MNIST dataset
from keras.datasets import mnist
# load dataset
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
SUPPLEMENT 1
# summarize dataset type and shape
print(type(train_images), train_images.dtype, train_images.shape)
print(type(train_labels), train_labels.dtype, train_labels.shape)
print(type(test_images), test_images.dtype, test_images.shape)
print(type(test_labels), test_labels.dtype, test_labels.shape)
# summarize pixel values
print('Train', train_images.min(), train_images.max(), train_images.mean(), train_images.std())
print('Test', test_images.min(), test_images.max(), test_images.mean(), test_images.std())
<class 'numpy.ndarray'> uint8 (60000, 28, 28)
<class 'numpy.ndarray'> uint8 (60000,)
<class 'numpy.ndarray'> uint8 (10000, 28, 28)
<class 'numpy.ndarray'> uint8 (10000,)
Train 0 255 33.318421449829934 78.56748998339798
Test 0 255 33.791224489795916 79.17246322228644
SUPPLEMENT 2
print(train_images[0].shape)
io.imshow(train_images[0])
(28, 28)
<matplotlib.image.AxesImage at 0x23244de4fd0>
ImageDataGenerator Class for Pixel Scaling
from tensorflow.keras.preprocessing.image import ImageDataGenerator
datagen = ImageDataGenerator(rescale=1.0/255.0)
# create data generator
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
from sklearn.model_selection import train_test_split
"""data preprocessing"""
# load dataset
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images, valX, train_labels, valy = train_test_split(train_images, train_labels, test_size=0.2,random_state=2018)
# reshape to rank 4
train_images = train_images.reshape(48000,28,28,1)
valX = valX.reshape(12000,28,28,1)
test_images = test_images.reshape(10000,28,28,1)
# get batch iterator
datagen = ImageDataGenerator()
train_iterator = datagen.flow(train_images, train_labels, batch_size=32)
val_iterator = datagen.flow(valX, valy, batch_size=32)
test_iterator = datagen.flow(test_images, test_labels, batch_size=32)
"""model design"""
model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape = (28, 28, 1), activation = 'relu'))
model.add(MaxPooling2D(pool_size = (2, 2)))
model.add(Conv2D(32, (3, 3), activation = 'relu'))
model.add(MaxPooling2D(pool_size = (2, 2)))
model.add(Flatten())
model.add(Dense(units = 128, activation = 'relu'))
model.add(Dense(units = 1, activation = 'sigmoid'))
model.compile(optimizer = 'adam',
loss = 'binary_crossentropy',
metrics = ['accuracy'])
model.fit_generator(train_iterator, validation_data=val_iterator, epochs=10, steps_per_epoch=10, validation_steps=10)
"""evaluation"""
# evaluate model loss on test dataset
result = model.evaluate_generator(test_iterator, steps=10)
for i in range(len(model.metrics_names)):
print("Metric ",model.metrics_names[i],":",str(round(result[i],2)))
model.predict_generator(test_iterator)
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
# summarize dataset shape, pixel values for train
print('Train', train_images.shape, train_labels.shape)
print('Train', train_images.min(), train_images.max(), train_images.mean(), train_images.std())
# summarize dataset shape, pixel values for test
print('Test', (test_images.shape, test_labels.shape))
print('Test', test_images.min(), test_images.max(), test_images.mean(), test_images.std())
Train (60000, 28, 28) (60000,)
Train 0 255 33.318421449829934 78.56748998339798
Test ((10000, 28, 28), (10000,))
Test 0 255 33.791224489795916 79.17246322228644
train_images, valX, train_labels, valy = train_test_split(train_images, train_labels, test_size=0.2,random_state=2018)
# summarize dataset shape, pixel values for train
print('Train', train_images.shape, train_labels.shape)
print('Train', train_images.min(), train_images.max(), train_images.mean(), train_images.std())
# summarize dataset shape, pixel values for val
print('Val', valX.shape, valy.shape)
print('Val', valX.min(), valX.max(), valX.mean(), valX.std())
# summarize dataset shape, pixel values for test
print('Test', (test_images.shape, test_labels.shape))
print('Test', test_images.min(), test_images.max(), test_images.mean(), test_images.std())
Train (48000, 28, 28) (48000,)
Train 0 255 33.29773514562075 78.54482970203107
Val (12000, 28, 28) (12000,)
Val 0 255 33.40116666666667 78.65801142483167
Test ((10000, 28, 28), (10000,))
Test 0 255 33.791224489795916 79.17246322228644
train_iterator, val_iterator, test_iterator
train_batchX, train_batchy = train_iterator.next()
val_batchX, val_batchy = val_iterator.next()
test_batchX, test_batchy = test_iterator.next()
print('train batch shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (train_batchX.shape, train_batchX.min(), train_batchX.max(), train_batchX.mean(), train_batchX.std()))
print('val batch shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (val_batchX.shape, val_batchX.min(), val_batchX.max(), val_batchX.mean(), val_batchX.std()))
print('test batch shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (test_batchX.shape, test_batchX.min(), test_batchX.max(), test_batchX.mean(), test_batchX.std()))
train batch shape=(32, 28, 28, 1), min=0.000, max=255.000, mean=30.790, std=75.816
val batch shape=(32, 28, 28, 1), min=0.000, max=255.000, mean=34.835, std=80.186
test batch shape=(32, 28, 28, 1), min=0.000, max=255.000, mean=36.032, std=81.371
How to Normalize Images With ImageDataGenerator
from tensorflow.keras.preprocessing.image import ImageDataGenerator
datagen = ImageDataGenerator(rescale=1.0/255.0)
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.datasets import mnist
from sklearn.model_selection import train_test_split
"""data preprocessing"""
# load dataset
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images, valX, train_labels, valy = train_test_split(train_images, train_labels, test_size=0.2,random_state=2018)
# reshape to rank 4
train_images = train_images.reshape(48000,28,28,1)
valX = valX.reshape(12000,28,28,1)
test_images = test_images.reshape(10000,28,28,1)
# get batch iterator
datagen = ImageDataGenerator(rescale=1.0/255.0)
datagen.fit(train_images)
datagen.fit(valX)
datagen.fit(test_images)
# batch : 32
train_iterator = datagen.flow(train_images, train_labels, batch_size=32)
val_iterator = datagen.flow(valX, valy, batch_size=32)
test_iterator = datagen.flow(test_images, test_labels, batch_size=32)
SUPPLEMENT
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.datasets import mnist
from sklearn.model_selection import train_test_split
"""data preprocessing"""
# load dataset
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images, valX, train_labels, valy = train_test_split(train_images, train_labels, test_size=0.2,random_state=2018)
# reshape to rank 4
train_images = train_images.reshape(48000,28,28,1)
valX = valX.reshape(12000,28,28,1)
test_images = test_images.reshape(10000,28,28,1)
print('train shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (train_images.shape, train_images.min(), train_images.max(), train_images.mean(), train_images.std()))
print('val shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (valX.shape, valX.min(), valX.max(), valX.mean(), valX.std()))
print('test shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (test_images.shape, test_images.min(), test_images.max(), test_images.mean(), test_images.std()))
print('--------'*10)
# get batch iterator
datagen = ImageDataGenerator(rescale=1.0/255.0)
datagen.fit(train_images)
print(datagen.mean, datagen.std)
datagen.fit(valX)
print(datagen.mean, datagen.std)
datagen.fit(test_images)
print(datagen.mean, datagen.std)
print('--------'*10)
# batch : 32
train_iterator = datagen.flow(train_images, train_labels, batch_size=32)
val_iterator = datagen.flow(valX, valy, batch_size=32)
test_iterator = datagen.flow(test_images, test_labels, batch_size=32)
train_batchX, train_batchy = train_iterator.next()
val_batchX, val_batchy = val_iterator.next()
test_batchX, test_batchy = test_iterator.next()
print('train batch(32) shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (train_batchX.shape, train_batchX.min(), train_batchX.max(), train_batchX.mean(), train_batchX.std()))
print('val batch(32) shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (val_batchX.shape, val_batchX.min(), val_batchX.max(), val_batchX.mean(), val_batchX.std()))
print('test batch(32) shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (test_batchX.shape, test_batchX.min(), test_batchX.max(), test_batchX.mean(), test_batchX.std()))
print('--------'*10)
# batch : all
train_iterator = datagen.flow(train_images, train_labels, batch_size=len(train_images))
val_iterator = datagen.flow(valX, valy, batch_size=len(valX))
test_iterator = datagen.flow(test_images, test_labels, batch_size=len(test_images))
train_batchX, train_batchy = train_iterator.next()
val_batchX, val_batchy = val_iterator.next()
test_batchX, test_batchy = test_iterator.next()
print('train batch(all) shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (train_batchX.shape, train_batchX.min(), train_batchX.max(), train_batchX.mean(), train_batchX.std()))
print('val batch(all) shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (val_batchX.shape, val_batchX.min(), val_batchX.max(), val_batchX.mean(), val_batchX.std()))
print('test batch(all) shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (test_batchX.shape, test_batchX.min(), test_batchX.max(), test_batchX.mean(), test_batchX.std()))
train shape=(48000, 28, 28, 1), min=0.000, max=255.000, mean=33.298, std=78.545
val shape=(12000, 28, 28, 1), min=0.000, max=255.000, mean=33.401, std=78.658
test shape=(10000, 28, 28, 1), min=0.000, max=255.000, mean=33.791, std=79.172
--------------------------------------------------------------------------------
None None
None None
None None
--------------------------------------------------------------------------------
train batch(32) shape=(32, 28, 28, 1), min=0.000, max=1.000, mean=0.130, std=0.307
val batch(32) shape=(32, 28, 28, 1), min=0.000, max=1.000, mean=0.126, std=0.302
test batch(32) shape=(32, 28, 28, 1), min=0.000, max=1.000, mean=0.123, std=0.302
--------------------------------------------------------------------------------
train batch(all) shape=(48000, 28, 28, 1), min=0.000, max=1.000, mean=0.131, std=0.308
val batch(all) shape=(12000, 28, 28, 1), min=0.000, max=1.000, mean=0.131, std=0.308
test batch(all) shape=(10000, 28, 28, 1), min=0.000, max=1.000, mean=0.133, std=0.310
How to Center Images With ImageDataGenerator
feature-wise centering
from tensorflow.keras.preprocessing.image import ImageDataGenerator
datagen = ImageDataGenerator(featurewise_center=True)
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.datasets import mnist
from sklearn.model_selection import train_test_split
"""data preprocessing"""
# load dataset
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images, valX, train_labels, valy = train_test_split(train_images, train_labels, test_size=0.2,random_state=2018)
# reshape to rank 4
train_images = train_images.reshape(48000,28,28,1)
valX = valX.reshape(12000,28,28,1)
test_images = test_images.reshape(10000,28,28,1)
# get batch iterator
datagen = ImageDataGenerator(featurewise_center=True)
datagen.fit(train_images)
datagen.fit(valX)
datagen.fit(test_images)
# batch : 32
train_iterator = datagen.flow(train_images, train_labels, batch_size=32)
val_iterator = datagen.flow(valX, valy, batch_size=32)
test_iterator = datagen.flow(test_images, test_labels, batch_size=32)
SUPPLEMENT
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.datasets import mnist
from sklearn.model_selection import train_test_split
"""data preprocessing"""
# load dataset
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images, valX, train_labels, valy = train_test_split(train_images, train_labels, test_size=0.2,random_state=2018)
# reshape to rank 4
train_images = train_images.reshape(48000,28,28,1)
valX = valX.reshape(12000,28,28,1)
test_images = test_images.reshape(10000,28,28,1)
print('train shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (train_images.shape, train_images.min(), train_images.max(), train_images.mean(), train_images.std()))
print('val shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (valX.shape, valX.min(), valX.max(), valX.mean(), valX.std()))
print('test shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (test_images.shape, test_images.min(), test_images.max(), test_images.mean(), test_images.std()))
print('--------'*10)
# get batch iterator
datagen = ImageDataGenerator(featurewise_center=True)
datagen.fit(train_images)
print(datagen.mean, datagen.std)
datagen.fit(valX)
print(datagen.mean, datagen.std)
datagen.fit(test_images)
print(datagen.mean, datagen.std)
print('--------'*10)
# batch : 32
train_iterator = datagen.flow(train_images, train_labels, batch_size=32)
val_iterator = datagen.flow(valX, valy, batch_size=32)
test_iterator = datagen.flow(test_images, test_labels, batch_size=32)
train_batchX, train_batchy = train_iterator.next()
val_batchX, val_batchy = val_iterator.next()
test_batchX, test_batchy = test_iterator.next()
print('train batch(32) shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (train_batchX.shape, train_batchX.min(), train_batchX.max(), train_batchX.mean(), train_batchX.std()))
print('val batch(32) shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (val_batchX.shape, val_batchX.min(), val_batchX.max(), val_batchX.mean(), val_batchX.std()))
print('test batch(32) shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (test_batchX.shape, test_batchX.min(), test_batchX.max(), test_batchX.mean(), test_batchX.std()))
print('--------'*10)
# batch : all
train_iterator = datagen.flow(train_images, train_labels, batch_size=len(train_images))
val_iterator = datagen.flow(valX, valy, batch_size=len(valX))
test_iterator = datagen.flow(test_images, test_labels, batch_size=len(test_images))
train_batchX, train_batchy = train_iterator.next()
val_batchX, val_batchy = val_iterator.next()
test_batchX, test_batchy = test_iterator.next()
print('train batch(all) shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (train_batchX.shape, train_batchX.min(), train_batchX.max(), train_batchX.mean(), train_batchX.std()))
print('val batch(all) shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (val_batchX.shape, val_batchX.min(), val_batchX.max(), val_batchX.mean(), val_batchX.std()))
print('test batch(all) shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (test_batchX.shape, test_batchX.min(), test_batchX.max(), test_batchX.mean(), test_batchX.std()))
train shape=(48000, 28, 28, 1), min=0.000, max=255.000, mean=33.298, std=78.545
val shape=(12000, 28, 28, 1), min=0.000, max=255.000, mean=33.401, std=78.658
test shape=(10000, 28, 28, 1), min=0.000, max=255.000, mean=33.791, std=79.172
--------------------------------------------------------------------------------
[[[33.29781]]] None
[[[33.40119]]] None
[[[33.79124]]] None
--------------------------------------------------------------------------------
train batch(32) shape=(32, 28, 28, 1), min=-33.791, max=221.209, mean=-1.533, std=77.921
val batch(32) shape=(32, 28, 28, 1), min=-33.791, max=221.209, mean=-2.625, std=76.458
test batch(32) shape=(32, 28, 28, 1), min=-33.791, max=221.209, mean=-3.413, std=75.195
--------------------------------------------------------------------------------
train batch(all) shape=(48000, 28, 28, 1), min=-33.791, max=221.209, mean=-0.494, std=78.545
val batch(all) shape=(12000, 28, 28, 1), min=-33.791, max=221.209, mean=-0.390, std=78.658
test batch(all) shape=(10000, 28, 28, 1), min=-33.791, max=221.209, mean=-0.000, std=79.172
sample-wise centering
from tensorflow.keras.preprocessing.image import ImageDataGenerator
datagen = ImageDataGenerator(samplewise_center=True)
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.datasets import mnist
from sklearn.model_selection import train_test_split
"""data preprocessing"""
# load dataset
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images, valX, train_labels, valy = train_test_split(train_images, train_labels, test_size=0.2,random_state=2018)
# reshape to rank 4
train_images = train_images.reshape(48000,28,28,1)
valX = valX.reshape(12000,28,28,1)
test_images = test_images.reshape(10000,28,28,1)
# get batch iterator
datagen = ImageDataGenerator(samplewise_center=True)
datagen.fit(train_images)
datagen.fit(valX)
datagen.fit(test_images)
# batch : 32
train_iterator = datagen.flow(train_images, train_labels, batch_size=32)
val_iterator = datagen.flow(valX, valy, batch_size=32)
test_iterator = datagen.flow(test_images, test_labels, batch_size=32)
SUPPLEMENT
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.datasets import mnist
from sklearn.model_selection import train_test_split
"""data preprocessing"""
# load dataset
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images, valX, train_labels, valy = train_test_split(train_images, train_labels, test_size=0.2,random_state=2018)
# reshape to rank 4
train_images = train_images.reshape(48000,28,28,1)
valX = valX.reshape(12000,28,28,1)
test_images = test_images.reshape(10000,28,28,1)
print('train shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (train_images.shape, train_images.min(), train_images.max(), train_images.mean(), train_images.std()))
print('val shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (valX.shape, valX.min(), valX.max(), valX.mean(), valX.std()))
print('test shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (test_images.shape, test_images.min(), test_images.max(), test_images.mean(), test_images.std()))
print('--------'*10)
# get batch iterator
datagen = ImageDataGenerator(samplewise_center=True)
datagen.fit(train_images)
print(datagen.mean, datagen.std)
datagen.fit(valX)
print(datagen.mean, datagen.std)
datagen.fit(test_images)
print(datagen.mean, datagen.std)
print('--------'*10)
# batch : 32
train_iterator = datagen.flow(train_images, train_labels, batch_size=32)
val_iterator = datagen.flow(valX, valy, batch_size=32)
test_iterator = datagen.flow(test_images, test_labels, batch_size=32)
train_batchX, train_batchy = train_iterator.next()
val_batchX, val_batchy = val_iterator.next()
test_batchX, test_batchy = test_iterator.next()
print('train batch(32) shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (train_batchX.shape, train_batchX.min(), train_batchX.max(), train_batchX.mean(), train_batchX.std()))
print('val batch(32) shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (val_batchX.shape, val_batchX.min(), val_batchX.max(), val_batchX.mean(), val_batchX.std()))
print('test batch(32) shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (test_batchX.shape, test_batchX.min(), test_batchX.max(), test_batchX.mean(), test_batchX.std()))
print('--------'*10)
# batch : all
train_iterator = datagen.flow(train_images, train_labels, batch_size=len(train_images))
val_iterator = datagen.flow(valX, valy, batch_size=len(valX))
test_iterator = datagen.flow(test_images, test_labels, batch_size=len(test_images))
train_batchX, train_batchy = train_iterator.next()
val_batchX, val_batchy = val_iterator.next()
test_batchX, test_batchy = test_iterator.next()
print('train batch(all) shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (train_batchX.shape, train_batchX.min(), train_batchX.max(), train_batchX.mean(), train_batchX.std()))
print('val batch(all) shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (val_batchX.shape, val_batchX.min(), val_batchX.max(), val_batchX.mean(), val_batchX.std()))
print('test batch(all) shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (test_batchX.shape, test_batchX.min(), test_batchX.max(), test_batchX.mean(), test_batchX.std()))
train shape=(48000, 28, 28, 1), min=0.000, max=255.000, mean=33.298, std=78.545
val shape=(12000, 28, 28, 1), min=0.000, max=255.000, mean=33.401, std=78.658
test shape=(10000, 28, 28, 1), min=0.000, max=255.000, mean=33.791, std=79.172
--------------------------------------------------------------------------------
None None
None None
None None
--------------------------------------------------------------------------------
train batch(32) shape=(32, 28, 28, 1), min=-54.675, max=236.723, mean=0.000, std=79.433
val batch(32) shape=(32, 28, 28, 1), min=-60.829, max=238.736, mean=0.000, std=79.335
test batch(32) shape=(32, 28, 28, 1), min=-62.398, max=242.120, mean=-0.000, std=77.976
--------------------------------------------------------------------------------
train batch(all) shape=(48000, 28, 28, 1), min=-90.477, max=248.513, mean=-0.000, std=77.764
val batch(all) shape=(12000, 28, 28, 1), min=-101.381, max=247.806, mean=-0.000, std=77.882
test batch(all) shape=(10000, 28, 28, 1), min=-83.435, max=247.832, mean=-0.000, std=78.383
How to Standardize Images With ImageDataGenerator
feature-wise Standardization
from tensorflow.keras.preprocessing.image import ImageDataGenerator
datagen = ImageDataGenerator(featurewise_center=True, featurewise_std_normalization=True)
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.datasets import mnist
from sklearn.model_selection import train_test_split
"""data preprocessing"""
# load dataset
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images, valX, train_labels, valy = train_test_split(train_images, train_labels, test_size=0.2,random_state=2018)
# reshape to rank 4
train_images = train_images.reshape(48000,28,28,1)
valX = valX.reshape(12000,28,28,1)
test_images = test_images.reshape(10000,28,28,1)
# get batch iterator
datagen = ImageDataGenerator(featurewise_center=True, featurewise_std_normalization=True)
datagen.fit(train_images)
datagen.fit(valX)
datagen.fit(test_images)
# batch : 32
train_iterator = datagen.flow(train_images, train_labels, batch_size=32)
val_iterator = datagen.flow(valX, valy, batch_size=32)
test_iterator = datagen.flow(test_images, test_labels, batch_size=32)
SUPPLEMENT
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.datasets import mnist
from sklearn.model_selection import train_test_split
"""data preprocessing"""
# load dataset
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images, valX, train_labels, valy = train_test_split(train_images, train_labels, test_size=0.2,random_state=2018)
# reshape to rank 4
train_images = train_images.reshape(48000,28,28,1)
valX = valX.reshape(12000,28,28,1)
test_images = test_images.reshape(10000,28,28,1)
print('train shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (train_images.shape, train_images.min(), train_images.max(), train_images.mean(), train_images.std()))
print('val shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (valX.shape, valX.min(), valX.max(), valX.mean(), valX.std()))
print('test shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (test_images.shape, test_images.min(), test_images.max(), test_images.mean(), test_images.std()))
print('--------'*10)
# get batch iterator
datagen = ImageDataGenerator(featurewise_center=True, featurewise_std_normalization=True)
datagen.fit(train_images)
print(datagen.mean, datagen.std)
datagen.fit(valX)
print(datagen.mean, datagen.std)
datagen.fit(test_images)
print(datagen.mean, datagen.std)
print('--------'*10)
# batch : 32
train_iterator = datagen.flow(train_images, train_labels, batch_size=32)
val_iterator = datagen.flow(valX, valy, batch_size=32)
test_iterator = datagen.flow(test_images, test_labels, batch_size=32)
train_batchX, train_batchy = train_iterator.next()
val_batchX, val_batchy = val_iterator.next()
test_batchX, test_batchy = test_iterator.next()
print('train batch(32) shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (train_batchX.shape, train_batchX.min(), train_batchX.max(), train_batchX.mean(), train_batchX.std()))
print('val batch(32) shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (val_batchX.shape, val_batchX.min(), val_batchX.max(), val_batchX.mean(), val_batchX.std()))
print('test batch(32) shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (test_batchX.shape, test_batchX.min(), test_batchX.max(), test_batchX.mean(), test_batchX.std()))
print('--------'*10)
# batch : all
train_iterator = datagen.flow(train_images, train_labels, batch_size=len(train_images))
val_iterator = datagen.flow(valX, valy, batch_size=len(valX))
test_iterator = datagen.flow(test_images, test_labels, batch_size=len(test_images))
train_batchX, train_batchy = train_iterator.next()
val_batchX, val_batchy = val_iterator.next()
test_batchX, test_batchy = test_iterator.next()
print('train batch(all) shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (train_batchX.shape, train_batchX.min(), train_batchX.max(), train_batchX.mean(), train_batchX.std()))
print('val batch(all) shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (val_batchX.shape, val_batchX.min(), val_batchX.max(), val_batchX.mean(), val_batchX.std()))
print('test batch(all) shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (test_batchX.shape, test_batchX.min(), test_batchX.max(), test_batchX.mean(), test_batchX.std()))
train shape=(48000, 28, 28, 1), min=0.000, max=255.000, mean=33.298, std=78.545
val shape=(12000, 28, 28, 1), min=0.000, max=255.000, mean=33.401, std=78.658
test shape=(10000, 28, 28, 1), min=0.000, max=255.000, mean=33.791, std=79.172
--------------------------------------------------------------------------------
[[[33.29781]]] [[[78.54484]]]
[[[33.40119]]] [[[78.65801]]]
[[[33.79124]]] [[[79.172455]]]
--------------------------------------------------------------------------------
train batch(32) shape=(32, 28, 28, 1), min=-0.427, max=2.794, mean=0.004, std=1.006
val batch(32) shape=(32, 28, 28, 1), min=-0.427, max=2.794, mean=0.029, std=1.034
test batch(32) shape=(32, 28, 28, 1), min=-0.427, max=2.794, mean=-0.026, std=0.968
--------------------------------------------------------------------------------
train batch(all) shape=(48000, 28, 28, 1), min=-0.427, max=2.794, mean=-0.006, std=0.992
val batch(all) shape=(12000, 28, 28, 1), min=-0.427, max=2.794, mean=-0.005, std=0.994
test batch(all) shape=(10000, 28, 28, 1), min=-0.427, max=2.794, mean=-0.000, std=1.000
sample-wise Standardization
from tensorflow.keras.preprocessing.image import ImageDataGenerator
datagen = ImageDataGenerator(samplewise_center=True, samplewise_std_normalization=True)
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.datasets import mnist
from sklearn.model_selection import train_test_split
"""data preprocessing"""
# load dataset
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images, valX, train_labels, valy = train_test_split(train_images, train_labels, test_size=0.2,random_state=2018)
# reshape to rank 4
train_images = train_images.reshape(48000,28,28,1)
valX = valX.reshape(12000,28,28,1)
test_images = test_images.reshape(10000,28,28,1)
# get batch iterator
datagen = ImageDataGenerator(samplewise_center=True, samplewise_std_normalization=True)
datagen.fit(train_images)
datagen.fit(valX)
datagen.fit(test_images)
# batch : 32
train_iterator = datagen.flow(train_images, train_labels, batch_size=32)
val_iterator = datagen.flow(valX, valy, batch_size=32)
test_iterator = datagen.flow(test_images, test_labels, batch_size=32)
SUPPLEMENT
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.datasets import mnist
from sklearn.model_selection import train_test_split
"""data preprocessing"""
# load dataset
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images, valX, train_labels, valy = train_test_split(train_images, train_labels, test_size=0.2,random_state=2018)
# reshape to rank 4
train_images = train_images.reshape(48000,28,28,1)
valX = valX.reshape(12000,28,28,1)
test_images = test_images.reshape(10000,28,28,1)
print('train shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (train_images.shape, train_images.min(), train_images.max(), train_images.mean(), train_images.std()))
print('val shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (valX.shape, valX.min(), valX.max(), valX.mean(), valX.std()))
print('test shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (test_images.shape, test_images.min(), test_images.max(), test_images.mean(), test_images.std()))
print('--------'*10)
# get batch iterator
datagen = ImageDataGenerator(samplewise_center=True, samplewise_std_normalization=True)
datagen.fit(train_images)
print(datagen.mean, datagen.std)
datagen.fit(valX)
print(datagen.mean, datagen.std)
datagen.fit(test_images)
print(datagen.mean, datagen.std)
print('--------'*10)
# batch : 32
train_iterator = datagen.flow(train_images, train_labels, batch_size=32)
val_iterator = datagen.flow(valX, valy, batch_size=32)
test_iterator = datagen.flow(test_images, test_labels, batch_size=32)
train_batchX, train_batchy = train_iterator.next()
val_batchX, val_batchy = val_iterator.next()
test_batchX, test_batchy = test_iterator.next()
print('train batch(32) shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (train_batchX.shape, train_batchX.min(), train_batchX.max(), train_batchX.mean(), train_batchX.std()))
print('val batch(32) shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (val_batchX.shape, val_batchX.min(), val_batchX.max(), val_batchX.mean(), val_batchX.std()))
print('test batch(32) shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (test_batchX.shape, test_batchX.min(), test_batchX.max(), test_batchX.mean(), test_batchX.std()))
print('--------'*10)
# batch : all
train_iterator = datagen.flow(train_images, train_labels, batch_size=len(train_images))
val_iterator = datagen.flow(valX, valy, batch_size=len(valX))
test_iterator = datagen.flow(test_images, test_labels, batch_size=len(test_images))
train_batchX, train_batchy = train_iterator.next()
val_batchX, val_batchy = val_iterator.next()
test_batchX, test_batchy = test_iterator.next()
print('train batch(all) shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (train_batchX.shape, train_batchX.min(), train_batchX.max(), train_batchX.mean(), train_batchX.std()))
print('val batch(all) shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (val_batchX.shape, val_batchX.min(), val_batchX.max(), val_batchX.mean(), val_batchX.std()))
print('test batch(all) shape=%s, min=%.3f, max=%.3f, mean=%.3f, std=%.3f' % (test_batchX.shape, test_batchX.min(), test_batchX.max(), test_batchX.mean(), test_batchX.std()))
train shape=(48000, 28, 28, 1), min=0.000, max=255.000, mean=33.298, std=78.545
val shape=(12000, 28, 28, 1), min=0.000, max=255.000, mean=33.401, std=78.658
test shape=(10000, 28, 28, 1), min=0.000, max=255.000, mean=33.791, std=79.172
--------------------------------------------------------------------------------
None None
None None
None None
--------------------------------------------------------------------------------
train batch(32) shape=(32, 28, 28, 1), min=-0.600, max=4.298, mean=0.000, std=1.000
val batch(32) shape=(32, 28, 28, 1), min=-0.554, max=4.273, mean=-0.000, std=1.000
test batch(32) shape=(32, 28, 28, 1), min=-0.585, max=4.394, mean=0.000, std=1.000
--------------------------------------------------------------------------------
train batch(all) shape=(48000, 28, 28, 1), min=-0.777, max=7.770, mean=-0.000, std=1.000
val batch(all) shape=(12000, 28, 28, 1), min=-0.851, max=7.249, mean=0.000, std=1.000
test batch(all) shape=(10000, 28, 28, 1), min=-0.732, max=7.578, mean=0.000, std=1.000
pytorch
List of posts followed by this article
Reference