深度学习:tensorflow 的整体实现,numpy实现深度学习(三)
生活随笔
收集整理的這篇文章主要介紹了
深度学习:tensorflow 的整体实现,numpy实现深度学习(三)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- tensorflow 的整體實現需要的變量:
- 添加層的處理:
- 優化器的處理:
- 前向傳播的處理:
- 更新權重:
- 訓練:
- 預測:
tensorflow 的整體實現需要的變量:
首先我們需要記錄所有層,已經所有的權重信息,需要兩個優化器,添加層時當前層的神經元個數
class NaiveNN:def __init__(self):# 記錄所有的layerself._layers = []# 記錄所有的權值矩陣,偏置量self._weights = []self._bias = []# 記錄著所有權值矩陣的和偏置量的優化器self._w_optimizer = self._b_optimizer = None# 記錄著當前最后一個Layer所含的神經元個數self._current_dimension = 0添加層的處理:
def add(self, layer):if not self._layers:# 如果是第一次加入layer、則初始化相應的屬性self._layers = [layer]self._current_dimension = layer.shape[1]# 調用初始化權值矩陣和偏置量的方法self._add_params(layer.shape)else:_next = layer.shape[0]layer.shape = (self._current_dimension, _next)# 調用進一步處理Layer的方法self._add_layer(layer, self._current_dimension, _next)def _add_params(self, shape):self._weights.append(np.random.randn(*shape))self._bias.append(np.zeros((1, shape[1])))def _add_layer(self, layer, *args):_current, _next = argsself._add_params((_current, _next))self._current_dimension = _nextself._layers.append(layer)優化器的處理:
訓練時需要初始化優化器,選擇哪個優化器以及初始參數。
def _init_optimizers(self, optimizer, lr, epoch):# 利用定義好的優化器工廠來初始化優化器# 注意由于最后一層是CostLayer對應的占位符、所以無需把它輸進優化器_opt_fac = OptFactory()self._w_optimizer = _opt_fac.get_optimizer_by_name(optimizer, self._weights[:-1], lr, epoch)self._b_optimizer = _opt_fac.get_optimizer_by_name(optimizer, self._bias[:-1], lr, epoch)前向傳播的處理:
遍歷每一層前向傳播計算結果。
# 前向傳播求各層的結果 def _get_activations(self, x):_activations = [self._layers[0].activate(x, self._weights[0], self._bias[0])]for i, layer in enumerate(self._layers[1:]):_activations.append(layer.activate(_activations[-1], self._weights[i+1], self._bias[i+1]))return _activations更新權重:
根據梯度更新每一層的權重
# 求對應層優化后的權重矩陣def _opt(self, i, _activation, _delta):self._weights[i] += self._w_optimizer.run(i, _activation.T.dot(_delta))self._bias[i] += self._b_optimizer.run(i, np.sum(_delta, axis=0, keepdims=True))訓練:
訓練過程:準備好優化器,計算每一層前向傳播結果,反向傳播計算每一層梯度,根據梯度更新每一層權重,重復epoch。
# 訓練def fit(self, x, y, lr=0.001, optimizer="Adam", epoch=10):# 初始化優化器self._init_optimizers(optimizer, lr, epoch)layer_width = len(self._layers)for counter in range(epoch):# 更新學習率self._w_optimizer.update()self._b_optimizer.update()# 前向傳播計算每一層的結果_activations = self._get_activations(x)# costlayer單獨計算梯度,delta_deltas = [self._layers[-1].bp_first(y, _activations[-1])]# 計算其它層的梯度,deltafor i in range(-1, -len(_activations), -1):_deltas.append(self._layers[i-1].bp(_activations[i-1], self._weights[i], _deltas[-1]))# 根據梯度更新權重for i in range(layer_width -1, 0, -1):self._opt(i, _activations[i-1], _deltas[layer_width -i -1])self._opt(0, x, _deltas[-1])預測:
根據得到的權重直接預測結果
def predict(self, x, get_raw_results=False):y_pred = self._get_prediction(np.atleast_2d(x))if get_raw_results:return y_predreturn np.argmax(y_pred, axis=1)def _get_prediction(self, x):# 直接取前向傳導算法得到的最后一個激活值即可return self._get_activations(x)[-1]總結
以上是生活随笔為你收集整理的深度学习:tensorflow 的整体实现,numpy实现深度学习(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度学习:tensorflow Laye
- 下一篇: Python学习:装饰器使用,timei