def get_batch(self, x, t, batch_size, time_size): batch_x = np.empty((batch_size, time_size), dtype='i') batch_t = np.empty((batch_size, time_size), dtype='i') data_size = len(x) jump = data_size // batch_size offsets = [i * jump for i in range(batch_size)] # バッチの各サンプルの読み込み開始位置 for time in range(time_size): for i, offset in enumerate(offsets): batch_x[i, time] = x[(offset + self.time_idx) % data_size] batch_t[i, time] = t[(offset + self.time_idx) % data_size] self.time_idx += 1 return batch_x, batch_t
def backward(self, dout=1): _, T = self.xs_shape dxs = np.empty(self.xs_shape, dtype='f') dout *= 1 / T for t in range(T): layer = self.layers[t] dxs[:, t] = layer.backward(dout) return dxs
def backward(self, dout=1): layers, xs = self.cache _, T, _ = xs.shape dxs = np.empty(xs.shape, dtype='f') dout *= 1 / T for t in range(T): layer = layers[t] dxs[:, t, :] = layer.backward(dout) return dxs
def forward(self, xs): N, T, _ = xs.shape _, M = self.W.shape self.layers = [] out = np.empty((N, T, M), dtype='f') for t in range(T): layer = Affine(self.W, self.b) out[:, t, :] = layer.forward(xs[:, t, :]) self.layers.append(layer) return out
def forward(self, xs): N, T = xs.shape V, D = self.W.shape out = np.empty((N, T, D), dtype='f') self.layers = [] for t in range(T): layer = Embedding(self.W) out[:, t, :] = layer.forward(xs[:, t]) self.layers.append(layer) return out
def forward(self, xs): N, T = xs.shape # バッチサイズ、T個の時系列データ _, D = self.W.shape # vocab_size, wordvec_size out = np.empty((N, T, D), dtype='f') self.layers = [] for t in range(T): layer = Embedding(self.W) out[:, t, :] = layer.forward(xs[:, t]) self.layers.append(layer) return out
def backward(self, dout): N, T, _ = dout.shape D, _ = self.W.shape dxs = np.empty((N, T, D), dtype='f') self.dW, self.db = 0, 0 for t in range(T): layer = self.layers[t] dxs[:, t, :] = layer.backward(dout[:, t, :]) self.dW += layer.dW self.db += layer.db return dxs
def forward(self, xs): N, T, _ = xs.shape H, _ = self.Wh.shape self.layers = [] hs = np.empty((N, T, H), dtype='f') if not self.stateful or self.h is None: self.h = np.zeros((N, H), dtype='f') for t in range(T): layer = GRU(self.Wx, self.Wh) self.h = layer.forward(xs[:, t, :], self.h) hs[:, t, :] = self.h self.layers.append(layer) return hs
def forward(self, xs): Wx, Wh, b = self.params N, T, D = xs.shape D, H = Wx.shape self.layers = [] hs = np.empty((N, T, H), dtype='f') if not self.stateful or self.h is None: self.h = np.zeros((N, H), dtype='f') for t in range(T): layer = RNN(*self.params) self.h = layer.forward(xs[:, t, :], self.h) hs[:, t, :] = self.h self.layers.append(layer) return hs
def backward(self, dhs): N, T, _ = dhs.shape D = self.Wx.shape[0] dxs = np.empty((N, T, D), dtype='f') self.dWx, self.dWh = 0, 0 dh = 0 for t in reversed(range(T)): layer = self.layers[t] dx, dh = layer.backward(dhs[:, t, :] + dh) dxs[:, t, :] = dx self.dWx += layer.dWx self.dWh += layer.dWh self.dh = dh return dxs
def backward(self, dhs): Wx, Wh, b = self.params N, T, H = dhs.shape D = Wx.shape[0] dxs = np.empty((N, T, D), dtype='f') dh, dc = 0, 0 grads = [0, 0, 0] for t in reversed(range(T)): layer = self.layers[t] dx, dh, dc = layer.backward(dhs[:, t,:] + dh, dc) dxs[:, t, :] = dx for i, grad in enumerate(layer.grads): grads[i] += grad for i, grad in enumerate(grads): self.grads[i][...] = grad self.dh = dh return dxs
def forward(self, xs): _, Wh, _ = self.params N, T, _ = xs.shape H = Wh.shape[0] self.layers = [] hs = np.empty((N, T, H), dtype='f') if not self.stateful or self.h is None: self.h = np.zeros((N, H), dtype='f') if not self.stateful or self.c is None: self.c = np.zeros((N, H), dtype='f') for t in range(T): layer = LSTM(*self.params) self.h, self.c = layer.forward(xs[:, t, :], self.h, self.c) hs[:, t, :] = self.h self.layers.append(layer) return hs