Source code for pygan.noisesampler.sine_wave_noise_sampler
# -*- coding: utf-8 -*-
import numpy as np
from pygan.noise_sampler import NoiseSampler
[docs]class SineWaveNoiseSampler(NoiseSampler):
'''
Generate samples based on the noise prior by sine wave distribution.
'''
def __init__(
self,
batch_size,
seq_len,
dim=1,
amp=0.5,
sampling_freq=8000,
freq=440,
sec=5,
mu=0.0,
sigma=1.0,
norm_mode="z_score"
):
'''
Init.
Args:
batch_size: Batch size.
seq_len: The length of sequences.
dim: The number of dimension of observed data points.
amp: Amp.
sample_freq: Sample frequency.
freq: Frequency.
sec: Second.
mu: Mean of Gauss noise.
sigma: STD of Gauss noise.
norm_mode: How to normalize pixel values of images.
- `z_score`: Z-Score normalization.
- `min_max`: Min-max normalization.
- `tanh`: Normalization by tanh function.
'''
self.__batch_size = batch_size
self.__seq_len = seq_len
if dim <= 1:
raise ValueError("`dim` must be more than `2`.")
self.__dim = dim
self.__amp = amp
self.__sampling_freq = sampling_freq
self.__freq = freq
self.__sec = sec
self.__mu = mu
self.__sigma = sigma
self.__norm_mode = norm_mode
[docs] def generate(self):
'''
Generate noise samples.
Returns:
`np.ndarray` of samples.
'''
observed_arr = None
for row in range(self.__batch_size):
arr = None
for d in range(self.__dim):
_arr = self.__generate_sin(
amp=self.__amp,
sampling_freq=self.__sampling_freq,
freq=self.__freq,
sec=self.__sec,
seq_len=self.__seq_len
)
_arr = np.expand_dims(_arr, axis=0)
if arr is None:
arr = _arr
else:
arr = np.r_[arr, _arr]
arr = np.expand_dims(arr, axis=0)
if observed_arr is None:
observed_arr = arr
else:
observed_arr = np.r_[observed_arr, arr]
observed_arr = observed_arr.transpose((0, 2, 1))
gauss_noise = np.random.normal(loc=self.__mu, scale=self.__sigma, size=observed_arr.shape)
observed_arr = observed_arr + gauss_noise
if self.noise_sampler is not None:
self.noise_sampler.output_shape = observed_arr.shape
observed_arr += self.noise_sampler.generate()
if self.__norm_mode == "z_score":
if observed_arr.std() != 0:
observed_arr = (observed_arr - observed_arr.mean()) / observed_arr.std()
elif self.__norm_mode == "min_max":
if (observed_arr.max() - observed_arr.min()) != 0:
observed_arr = (observed_arr - observed_arr.min()) / (observed_arr.max() - observed_arr.min())
elif self.__norm_mode == "tanh":
observed_arr = np.tanh(observed_arr)
return observed_arr
def __generate_sin(self, amp=0.5, sampling_freq=8000, freq=440, sec=5, seq_len=100):
sin_list = []
for n in np.arange(sampling_freq * sec):
sin = amp * np.sin(2.0 * np.pi * freq * n / sampling_freq)
sin_list.append(sin)
if len(sin_list) > seq_len:
break
return np.array(sin_list[:seq_len])