[手把手系列之二]實(shí)現(xiàn)多層神經(jīng)網(wǎng)絡(luò)

完整代碼:>>點(diǎn)我 歡迎star,fork,一起學(xué)習(xí)

網(wǎng)絡(luò)用途

或者說(shuō)應(yīng)用場(chǎng)景:使用單層神經(jīng)網(wǎng)絡(luò)來(lái)識(shí)別一張圖片是否是貓咪的圖片昆雀。

數(shù)學(xué)表示

給定一張圖片$X$ 送到網(wǎng)絡(luò)中,判斷這張圖片是否是貓咪的照片加矛?

網(wǎng)絡(luò)架構(gòu)

多層神經(jīng)網(wǎng)絡(luò)處理過(guò)程:

  • X --> $[linear + relu]^{(L-1)}$ --->[linear + sigmoid] ---> $\hat{y}$

數(shù)學(xué)表示

訓(xùn)練集: $X = [x{(1)},x{(2)},...,x{(i)},....,x{(m)}]$ ;對(duì)應(yīng)標(biāo)簽:$Y=[y{(1)},y{(2)},...,y{(i)},...,y{(m)}]$ ;

對(duì)于訓(xùn)練集中的每張照片$x^{(i)}$ 的處理過(guò)程:

repeat:

? $z^{(i)} = wTx{(i)}+b$

? $\hat{y}^{(i)} = a^{(i)} = g(z^{(i)})$

$L(a{(i)},y{(i)}) = -y{(i)}log(a{(i)})-(1-y{(i)})log(1-a{(i)})$

成本函數(shù):

$J = \frac{1}{m} \sum_{i=1}^{m} L(a{(i)},y{(i)})$

最后通過(guò)反向傳播算法荚板,計(jì)算參數(shù)$W$ 和 $b$ 欠啤。

模型定義

模型定義步驟

  1. 定義模型結(jié)構(gòu)(如輸入向量的特征數(shù)目)
  2. 初始化模型參數(shù)哗咆;
  3. 循環(huán):
    • 前向傳播,計(jì)算loss猾担;
    • 反向傳播袭灯,計(jì)算梯度;
    • 梯度下降绑嘹,更新參數(shù)稽荧;

代碼實(shí)現(xiàn)

激活函數(shù)

  1. sigmoid 激活函數(shù)及其反向傳播過(guò)程
def sigmoid(Z):
    """
    sigmoid激活函數(shù);
    :param Z:
    :return:
    - A: 激活函數(shù)值sigmoid(z),
    - cache: (存儲(chǔ)Z值,方便反向傳播時(shí)直接使用)
    """
    A = 1.0/(1+np.exp(-Z))
    cache = Z
    return A, cache

def sigmoid_backward(dA,cache):
    """
    激活函數(shù)的反向傳播
    :param dA: loss對(duì)A的導(dǎo)數(shù)
    :param cache:前向傳播中緩存的sigmoid輸入Z工腋;
    :return:dZ
    """
    Z = cache
    s = 1.0/(1 + np.exp(-Z))
    dZ = dA * s * (1-s)
    return dZ
  1. relu激活函數(shù)及其反向傳播過(guò)程
def relu(Z):
    """
    relu激活函數(shù)姨丈;
    :param Z:
    :return:
    - A:
    - cache:
    """
    A = np.maximum(0,Z)# max適合單個(gè)數(shù)值間的比較
    cache = Z
    return A, cache

def relu_backward(dA,cache):
    """
    relu 反向傳播計(jì)算方法;relu = np.maximum(0,A)擅腰;導(dǎo)數(shù)值:1 or 0.----> dZ= dA or 0
    :param dA:
    :param cache:
    :return: dZ
    """
    Z = cache
    dZ = np.array(dA, copy=True)

    #當(dāng)Z<=0時(shí)蟋恬,dZ=0
    dZ[Z <= 0] = 0
    assert(dZ.shape == Z.shape) #確保維度相同
    return dZ

參數(shù)初始化

權(quán)重系數(shù)$W$和$b$ 全都初始化為0.

def initialize_parameters_deep(layer_dims,type='he'):
    """
    深度神經(jīng)網(wǎng)絡(luò)系數(shù)初始化函數(shù)
    :param layer_dims: 神經(jīng)網(wǎng)絡(luò)各層神經(jīng)元列表, eg:[12288,100,10,1]
    :param type: 系數(shù)初始化方法:zeros,random,he;
    :return: parameters:系數(shù)字典
    """
    np.random.seed(10)

    parameters = {}
    L = len(layer_dims)

    if type == "zeros":
        for i in range(1, L):
            parameters['W'+str(i)] = np.zeros((layer_dims[i], layer_dims[i-1]))
            parameters['b'+str(i)] = np.zeros((layer_dims[i], 1))

            assert (parameters['W' + str(i)].shape == (layer_dims[i], layer_dims[i - 1]))
            assert (parameters['b' + str(i)].shape == (layer_dims[i], 1))
    elif type == "random":
        for i in range(1, L):
            parameters['W'+str(i)] = np.random.randn(layer_dims[i],layer_dims[i-1]) * 0.01
            parameters['b'+str(i)] = np.zeros((layer_dims[i], 1))

            assert (parameters['W' + str(i)].shape == (layer_dims[i], layer_dims[i - 1]))
            assert (parameters['b' + str(i)].shape == (layer_dims[i], 1))
    elif type == "he":
        for i in range(1, L):
            parameters['W'+str(i)] = np.random.randn(layer_dims[i], layer_dims[i-1]) / np.sqrt(layer_dims[i-1])
            parameters['b'+str(i)] = np.zeros((layer_dims[i], 1))

            assert (parameters['W' + str(i)].shape == (layer_dims[i], layer_dims[i - 1]))
            assert (parameters['b' + str(i)].shape == (layer_dims[i], 1))

    return parameters

前向傳播

前向傳播過(guò)程

訓(xùn)練集: $$X = [x{(1)},x{(2)},...,x{(i)},....,x{(m)}]$$ ;對(duì)應(yīng)標(biāo)簽:$$Y=[y{(1)},y{(2)},...,y{(i)},...,y{(m)}] $$;

對(duì)于訓(xùn)練集中的每張照片$x^{(i)}$ 的處理過(guò)程:

$z^{(i)} = wTx{(i)}+b$

$\hat{y}^{(i)} = a^{(i)} = sigmoid(z^{(i)})$

$L(a{(i)},y{(i)}) = -y{(i)}log(a{(i)})-(1-y{(i)})log(1-a{(i)})$

成本函數(shù):$J = \frac{1}{m} \sum_{i=1}^{m} L(a{(i)},y{(i)})$

image
代碼實(shí)現(xiàn)
  1. 線性部分的前向傳播過(guò)程
def linear_forward(A_pre,W,b):
    """
    前向傳播-線性部分
    :param A_pre:前一層的輸出值-激活值
    :param W:系數(shù)矩陣
    :param b:偏置矩陣
    :return:線性部分Z,cache(A,W,b)
    """
    Z = np.dot(W, A_pre) + b
    assert(Z.shape == (W.shape[0], A_pre.shape[1])) #可能有多個(gè)樣本A_pre.shape[1]樣本容量
    cache = (A_pre, W, b)
    return Z, cache
  1. 單層網(wǎng)絡(luò)的前向傳播過(guò)程[線性部分 + 激活函數(shù)]
def linear_activation_forward(A_pre, W, b, activation):
    """
    單層網(wǎng)絡(luò)(構(gòu)成:線性部分+激活函數(shù)) 的輸出結(jié)果;
    :param A_pre: 上一層的輸出激活值趁冈;
    :param W: 本層網(wǎng)絡(luò)的系數(shù)矩陣
    :param b: 偏置
    :param activation: 本層網(wǎng)絡(luò)的激活函數(shù)類(lèi)型:sigmoid, relu歼争;
    :return:
    - A:激活函數(shù)值;
    - cache:linear_cache, activation_cache渗勘;加快反向傳播計(jì)算速度矾飞;
    """
    if activation == 'sigmoid':
        Z, linear_cache = linear_forward(A_pre, W, b)
        A, activation_cache = sigmoid(Z)
    elif activation == 'relu':
        Z, linear_cache = linear_forward(A_pre, W, b)
        A, activation_cache = relu(Z)

    assert(A.shape == (W.shape[0], A_pre.shape[1]))
    cache = (linear_cache, activation_cache)

    return A, cache
  1. 神經(jīng)網(wǎng)絡(luò)的前向傳播過(guò)程
def L_model_forward(X, parameters):
    """
    L層深度神經(jīng)網(wǎng)絡(luò)的前向傳播過(guò)程;
    網(wǎng)絡(luò)架構(gòu):X-->(linear-relu)[L-1]-->(linear-sigmoid)-->AL呀邢;
    :param X: 輸入
    :param parameters: 各層網(wǎng)絡(luò)系數(shù)字典;
    :return:
    - AL:最終的輸出值豹绪;水平排列
    - caches:各層網(wǎng)絡(luò)的cache列表价淌;
    """
    caches = []
    A = X
    L = len(parameters) // 2 #確保是一個(gè)整數(shù)值;

    #前(L-1)層都是相同的架構(gòu)申眼,可以用for循環(huán)計(jì)算;最后一層單獨(dú)計(jì)算;
    for i in range(1, L):
        A_pre = A
        A, cache = linear_activation_forward(A_pre,parameters['W'+str(i)],parameters['b'+str(i)],\
                                             activation='relu')
        caches.append(cache)
    AL, cache = linear_activation_forward(A, parameters['W'+str(L)], parameters['b'+str(L)],\
                                          activation='sigmoid')
    caches.append(cache)

    assert (AL.shape == (1, X.shape[1]))

    return AL, caches

由于網(wǎng)絡(luò)為單層神經(jīng)網(wǎng)絡(luò)蝉衣,前向傳播過(guò)程和反向傳播過(guò)程比較簡(jiǎn)單括尸,所以整合到一起。直接計(jì)算出相應(yīng)的成本函數(shù)和相應(yīng)的系數(shù)梯度病毡。

反向傳播

反向傳播過(guò)程
image
編碼實(shí)現(xiàn)
  1. 線性部分的反向傳播
def linear_backward(dZ, cache):
    """
    反向傳播的線性部分
    :param dZ:
    :param cache: 前向傳播中的緩存值(A_pre, W, b)
    :return:
    - dA_pre:關(guān)于前一層A的導(dǎo)數(shù)值濒翻;
    - dW:關(guān)于權(quán)重的偏導(dǎo)數(shù);
    - db:關(guān)于偏置的偏導(dǎo)數(shù)啦膜;
    """
    A_pre, W, b = cache
    m = A_pre.shape[1]

    dA_pre = np.dot(W.T, dZ)
    dW = 1./m * np.dot(dZ, A_pre.T)
    db = 1./m * np.sum(dZ, axis=1, keepdims=True)

    assert (dA_pre.shape == A_pre.shape)
    assert (dW.shape == W.shape)
    assert (db.shape == b.shape)

    return dA_pre, dW, db
  1. 單層網(wǎng)絡(luò)的反向傳播過(guò)程[線性部分+激活函數(shù)]
def linear_activation_backward(dA,cache,activation):
    """
    反向傳播-單層網(wǎng)絡(luò)有送;一個(gè)網(wǎng)絡(luò)層的反向傳播計(jì)算方法
    :param dA: 對(duì)本層網(wǎng)絡(luò)輸出的偏導(dǎo)數(shù)
    :param cache:前向傳播過(guò)程中緩存的元組(linear_cache,activation_cache)
    :param activation:激活函數(shù)類(lèi)型:sigmoid,relu
    :return:
    - dA_pre:
    - dW:
    - db:
    """
    linear_cache, activation_cache = cache
    if activation == 'relu':
        dZ = relu_backward(dA,activation_cache)
        dA_pre, dW, db = linear_backward(dZ, linear_cache)
    elif activation == 'sigmoid':
        dZ = sigmoid_backward(dA, activation_cache)
        dA_pre, dW, db = linear_backward(dZ, linear_cache)

    return dA_pre, dW, db
  1. 神經(jīng)網(wǎng)絡(luò)的反向傳播過(guò)程
def L_model_backward(AL, Y, caches):
    """
    反向傳播-L層深度NN;整合到一塊
    網(wǎng)絡(luò)架構(gòu):X-->(linear+relu)[L-1]-->(linear+sigmoid)-->AL
    :param AL: 最終輸出值僧家;
    :param Y: 標(biāo)簽雀摘;
    :param caches: 各層網(wǎng)絡(luò)的系數(shù)
    :return: grads 各層網(wǎng)絡(luò)系數(shù)變量的梯度計(jì)算值;
    """
    grads = {}
    L = len(caches)
    m = AL.shape[1]
    Y = Y.reshape(AL.shape) # 確保AL和Y shape相同八拱;

    #cost:交叉熵函數(shù)
    dAL = -(np.divide(Y, AL) - np.divide(1-Y, 1-AL))
    #最后一層單獨(dú)計(jì)算阵赠,之后for loop循環(huán);
    current_cache = caches[L-1]
    grads['dA'+str(L)], grads['dW'+str(L)], grads['db'+str(L)] = linear_activation_backward(dAL, current_cache,\
                                                                                            activation='sigmoid')
    # 從倒數(shù)第二層開(kāi)始 for-loop:linear+relu
    for i in reversed(range(L-1)):
        #backward: relu->linear
        current_cache = caches[i]
        dA_pre_temp, dW_temp, db_temp = linear_activation_backward(grads['dA'+str(i+2)],current_cache,activation='relu')
        grads['dA'+str(i+1)] = dA_pre_temp
        grads["dW"+str(i+1)] = dW_temp
        grads["db"+str(i+1)] = db_temp

    return grads

參數(shù)優(yōu)化

參數(shù)更新過(guò)程--使用梯度下降算法;

def update_parameters_with_gd(parameters,grads,learning_rate):
    """
    系數(shù)更新
    :param parameters: 系數(shù)肌稻;
    :param grads: 關(guān)于系數(shù)的梯度值清蚀;
    :param learning_rate: 學(xué)習(xí)率更新速度
    :return: parameters更新后的系數(shù)
    """
    L = len(parameters) // 2
    for i in range(L):
        parameters['W'+str(i+1)] = parameters['W'+str(i+1)] - learning_rate * grads["dW"+str(i+1)]
        parameters['b'+str(i+1)] = parameters['b'+str(i+1)] - learning_rate * grads["db"+str(i+1)]

    return parameters

模型評(píng)測(cè)

用帶標(biāo)簽的數(shù)據(jù)集評(píng)測(cè)模型訓(xùn)練效果如何。

def score(params, X, y):
    """
    由測(cè)試集判斷訓(xùn)練模型的好壞
    :param params: 訓(xùn)練得到的參數(shù)
    :param X: 測(cè)試集 [n_px*n_px*3, m]
    :param y: 測(cè)試集標(biāo)簽 [1, m]
    :return: accuracy 準(zhǔn)確率
    """
    m = X.shape[1]
    result = np.zeros((1, m))

    probs, _ = L_model_forward(X, params)
   

    for i in range(probs.shape[1]):
        if probs[0, i] >= 0.5:
            result[0, i] = 1

    accuracy = np.mean(result == y)

    return accuracy

模型預(yù)測(cè)

輸入測(cè)試集爹谭,輸出測(cè)試標(biāo)簽.

運(yùn)算過(guò)程:做一次前向傳播枷邪,得到輸出;再對(duì)輸出和threshold閾值作比較旦棉,得出類(lèi)別標(biāo)簽齿风。

def predict(params, X):
    """
    給定圖片進(jìn)行測(cè)試,輸出預(yù)測(cè)標(biāo)簽
    :param params: 訓(xùn)練的參數(shù)
    :param X: 待預(yù)測(cè)數(shù)據(jù)
    :return: 預(yù)測(cè)結(jié)果
    """
    preds = np.zeros((1,X.shape[1]))
    probs, _ = self.__model_forward(X,params)

    for i in range(X.shape[1]):
        if probs[0, i] >= 0.5:
            preds[0, i] = 1

    preds = np.squeeze(preds)

    return preds

函數(shù)整合

def L_layer_model(X, Y, layer_dims, learning_rate=0.0052, num_iters=5000, print_cost=True):
    """
    L層網(wǎng)絡(luò)模型:包括初始化绑洛、訓(xùn)練救斑;
    :param X: 訓(xùn)練數(shù)據(jù)
    :param Y: 數(shù)據(jù)標(biāo)簽
    :param layer_dims: 各網(wǎng)絡(luò)層神經(jīng)元數(shù)目
    :param learning_rate: 學(xué)習(xí)率
    :param num_iters: 迭代次數(shù)
    :param print_cost: 輸出cost變化
    :return: paramters 訓(xùn)練后的系數(shù)
    """
    np.random.seed(12)
    costs = []
    parameters = initialize_parameters_deep(layer_dims,type='he')

    for i in range(0, num_iters):
        AL, caches = L_model_forward(X, parameters)
        cost = compute_cost(AL, Y)
        grads = L_model_backward(AL,Y,caches)
        parameters = update_parameters_with_gd(parameters,grads,learning_rate)

        if print_cost and i % 100==0:
            print("Cost after iteration %i:%f" %(i, cost))
            costs.append(cost)

    return parameters

測(cè)試:1000次迭代、學(xué)習(xí)率為0.001真屯;

layers_dims = [12288, 100, 20, 1]
params = model(X_train,y_train,layers_dims,num_iters=1000,learning_rate=0.001)
results = score(parameters,test_X,test_Y)
print(results)

輸出結(jié)果變化:

Cost after iteration 0:0.697
Cost after iteration 100:0.620
Cost after iteration 200:0.599
Cost after iteration 300:0.581
Cost after iteration 400:0.564
Cost after iteration 500:0.549
Cost after iteration 600:0.534
Cost after iteration 700:0.520
Cost after iteration 800:0.506
Cost after iteration 900:0.492
Accuracy on test set: 52%

比隨機(jī)猜測(cè)效果好一點(diǎn)點(diǎn)脸候。網(wǎng)絡(luò)層更深,優(yōu)化梯度算法绑蔫,超參數(shù)優(yōu)化---提高準(zhǔn)確率运沦!

重點(diǎn)是我們自己實(shí)現(xiàn)了一個(gè)神經(jīng)網(wǎng)絡(luò)

小結(jié)

  1. 理解網(wǎng)絡(luò)運(yùn)算過(guò)程時(shí),畫(huà)一個(gè)運(yùn)算圖很很大程度上幫助理解配深;
  2. 編碼實(shí)現(xiàn)時(shí)携添,注意變量的shape變化是否正確!
  3. 優(yōu)化算法:Momentum篓叶、RMSprop烈掠、Adam
  4. 批量梯度更新算法
  5. 網(wǎng)絡(luò)模型越大羞秤,參數(shù)越多,訓(xùn)練時(shí)間越長(zhǎng)

完整代碼:>>點(diǎn)我

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末左敌,一起剝皮案震驚了整個(gè)濱河市瘾蛋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌矫限,老刑警劉巖哺哼,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異叼风,居然都是意外死亡取董,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)咬扇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)甲葬,“玉大人,你說(shuō)我怎么就攤上這事懈贺【眩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵梭灿,是天一觀的道長(zhǎng)画侣。 經(jīng)常有香客問(wèn)我,道長(zhǎng)堡妒,這世上最難降的妖魔是什么配乱? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮皮迟,結(jié)果婚禮上搬泥,老公的妹妹穿的比我還像新娘。我一直安慰自己伏尼,他們只是感情好忿檩,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著爆阶,像睡著了一般燥透。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辨图,一...
    開(kāi)封第一講書(shū)人閱讀 50,096評(píng)論 1 291
  • 那天班套,我揣著相機(jī)與錄音,去河邊找鬼故河。 笑死吱韭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鱼的。 我是一名探鬼主播理盆,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼瞻讽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了熏挎?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤晌砾,失蹤者是張志新(化名)和其女友劉穎坎拐,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體养匈,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哼勇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了呕乎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片积担。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖猬仁,靈堂內(nèi)的尸體忽然破棺而出帝璧,到底是詐尸還是另有隱情,我是刑警寧澤湿刽,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布的烁,位于F島的核電站,受9級(jí)特大地震影響诈闺,放射性物質(zhì)發(fā)生泄漏渴庆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一雅镊、第九天 我趴在偏房一處隱蔽的房頂上張望襟雷。 院中可真熱鬧,春花似錦仁烹、人聲如沸耸弄。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)叙赚。三九已至,卻和暖如春僚饭,著一層夾襖步出監(jiān)牢的瞬間震叮,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工鳍鸵, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留苇瓣,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓偿乖,卻偏偏與公主長(zhǎng)得像击罪,于是被迫代替她去往敵國(guó)和親哲嘲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • 不求與天同比壽媳禁, 只望兒女度平安眠副。 若能見(jiàn)得你歡樂(lè), 何惜病痛我身?yè)?dān)竣稽。
    弘慧閱讀 171評(píng)論 0 0
  • 今天逛慶山的微博囱怕,看到一句話:“每個(gè)人都有自己的故事。每個(gè)人都很珍貴毫别⊥薰” 忽然覺(jué)得很感動(dòng)。 慶山叫做“安妮寶貝”的...
    安桐2016閱讀 364評(píng)論 2 2
  • 題記——2017年8月18岛宦,二十年師范同學(xué)聚會(huì) 我們上師范學(xué)校的畢業(yè)大都做了老師台丛。平日里肯給定都是忙。一到...
    妖嬈郎閱讀 619評(píng)論 6 10
  • 能明顯感覺(jué)到女兒最近壓力很大砾肺,額頭上一下子冒出來(lái)很多青春痘挽霉,她也很少跟我們說(shuō)說(shuō)笑笑,回到家鉆進(jìn)房間就學(xué)習(xí)债沮,晚上很晚...
    無(wú)憂_水閱讀 2,623評(píng)論 1 0
  • 走了的別去追炼吴,留下的別傷害 上帝給你關(guān)了一扇門(mén)的時(shí)候也有可能順便給你關(guān)了窗,讓你充滿了別扭疫衩。有時(shí)候你覺(jué)得得到了救贖...
    寧城嘲風(fēng)閱讀 341評(píng)論 0 1