Pytorch 自定義激活函數前向與反向傳播 ReLu系列 含優點與缺點

文章目錄

    • ReLu
      • 公式
      • 求導過程
      • 優點:
      • 缺點:
      • 自定義ReLu
      • 與Torch定義的比較
      • 可視化
    • Leaky ReLu PReLu
      • 公式
      • 求導過程
      • 優點:
      • 缺點:
      • 自定義LeakyReLu
      • 與Torch定義的比較
      • 可視化
      • 自定義PReLu
    • ELU
      • 公式
      • 求導過程
      • 優點
      • 缺點
      • 自定義LeakyReLu
      • 與Torch定義的比較
      • 可視化

import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as F%matplotlib inlineplt.rcParams['figure.figsize'] = (7, 3.5)
plt.rcParams['figure.dpi'] = 150
plt.rcParams['axes.unicode_minus'] = False  #解決坐標軸負數的鉛顯示問題

ReLu

線性整流函數 (rectified linear unit)

公式

relu=max?(0,x)={x,x>00,x≤0\text{relu} = \max(0, x) = \begin{cases} x, &x>0 \\ 0, &x\leq 0 \end{cases}relu=max(0,x)={x,0,?x>0x0?

求導過程

f(x)是連續的f(x)是連續的f(x)

f′(x)=lim?h→0f(0)=f(0+h)?f(0)h=max?(0,h)?0hf'(x)=\lim_{h\to 0}f(0) = \frac{f(0 + h)-f(0)}{h}=\frac{\max(0, h) - 0}{h}f(x)=limh0?f(0)=hf(0+h)?f(0)?=hmax(0,h)?0?
lim?h→0?=0h=0\lim_{h\to0^-}=\frac{0}{h} = 0limh0??=h0?=0
lim?h→0+=hh=1\lim_{h\to0^+}=\frac{h}{h} = 1limh0+?=hh?=1
所以f′(0)f'(0)f(0)處不可導

所以f′(x)={1,x>00,x<0f'(x) = \begin{cases} 1, & x > 0 \\ 0, & x < 0 \end{cases}f(x)={1,0,?x>0x<0?

優點:

ReLU激活函數是一個簡單的計算,如果輸入大于0,直接返回作為輸入提供的值;如果輸入是0或更小,返回值0。

  • 相較于sigmoid函數以及Tanh函數來看,在輸入為正時,Relu函數不存在飽和問題,即解決了gradient vanishing問題,使得深層網絡可訓練
  • Relu輸出會使一部分神經元為0值,在帶來網絡稀疏性的同時,也減少了參數之間的關聯性,一定程度上緩解了過擬合的問題
  • 計算速度非常快
  • 收斂速度遠快于sigmoid以及Tanh函數

缺點:

  • 輸出不是zero-centered
  • 存在Dead Relu Problem,即某些神經元可能永遠不會被激活,進而導致相應參數一直得不到更新,產生該問題主要原因包括參數初始化問題以及學習率設置過大問題
  • ReLU不會對數據做幅度壓縮,所以數據的幅度會隨著模型層數的增加不斷擴張,當輸入為正值,導數為1,在“鏈式反應”中,不會出現梯度消失,但梯度下降的強度則完全取決于權值的乘積,如此可能會導致梯度爆炸問題

自定義ReLu

class SelfDefinedRelu(torch.autograd.Function):@staticmethoddef forward(ctx, inp):ctx.save_for_backward(inp)return torch.where(inp < 0., torch.zeros_like(inp), inp)@staticmethoddef backward(ctx, grad_output):inp, = ctx.saved_tensorsreturn grad_output * torch.where(inp < 0., torch.zeros_like(inp),torch.ones_like(inp))class Relu(nn.Module):def __init__(self):super().__init__()def forward(self, x):out = SelfDefinedRelu.apply(x)return out

與Torch定義的比較

# self defined
torch.manual_seed(0)relu = Relu()  # SelfDefinedRelu
inp = torch.randn(5, requires_grad=True)
out = relu((inp).pow(3))print(f'Out is\n{out}')out.backward(torch.ones_like(inp), retain_graph=True)
print(f"\nFirst call\n{inp.grad}")out.backward(torch.ones_like(inp), retain_graph=True)
print(f"\nSecond call\n{inp.grad}")inp.grad.zero_()
out.backward(torch.ones_like(inp), retain_graph=True)
print(f"\nCall after zeroing gradients\n{inp.grad}")
Out is
tensor([3.6594, 0.0000, 0.0000, 0.1837, 0.0000],grad_fn=<SelfDefinedReluBackward>)First call
tensor([7.1240, 0.0000, 0.0000, 0.9693, 0.0000])Second call
tensor([14.2480,  0.0000,  0.0000,  1.9387,  0.0000])Call after zeroing gradients
tensor([7.1240, 0.0000, 0.0000, 0.9693, 0.0000])
# torch defined
torch.manual_seed(0)
inp = torch.randn(5, requires_grad=True)
out = torch.relu((inp).pow(3))print(f'Out is\n{out}')out.backward(torch.ones_like(inp), retain_graph=True)
print(f"\nFirst call\n{inp.grad}")out.backward(torch.ones_like(inp), retain_graph=True)
print(f"\nSecond call\n{inp.grad}")inp.grad.zero_()
out.backward(torch.ones_like(inp), retain_graph=True)
print(f"\nCall after zeroing gradients\n{inp.grad}")
Out is
tensor([3.6594, 0.0000, 0.0000, 0.1837, 0.0000], grad_fn=<ReluBackward0>)First call
tensor([7.1240, 0.0000, 0.0000, 0.9693, 0.0000])Second call
tensor([14.2480,  0.0000,  0.0000,  1.9387,  0.0000])Call after zeroing gradients
tensor([7.1240, 0.0000, 0.0000, 0.9693, 0.0000])

可視化

# visualization
inp = torch.arange(-8, 8, 0.05, requires_grad=True)
out = relu(inp)
out.sum().backward()inp_grad = inp.gradplt.plot(inp.detach().numpy(),out.detach().numpy(),label=r"$relu(x)$",alpha=0.7)
plt.plot(inp.detach().numpy(),inp_grad.numpy(),label=r"$relu'(x)$",alpha=0.5)
plt.scatter(0, 0, color='None', marker='o', edgecolors='r', s=50)
plt.grid()
plt.legend()
plt.show()

請添加圖片描述

Leaky ReLu PReLu

公式

leaky_relu=max?(αx,x)={x,x≥0α,x<0,α∈[0,+∞)\text{leaky\_relu} = \max(\alpha x, x) = \begin{cases} x, & x \ge 0 \\ \alpha, & x < 0 \end{cases} \quad, \alpha \in [0, + \infty)leaky_relu=max(αx,x)={x,α,?x0x<0?,α[0,+)

whileα=0,leaky_relu=relu\text{while} \quad \alpha = 0, \text{leaky\_relu} = \text{relu}whileα=0,leaky_relu=relu

求導過程

所以f′(x)={1,x≥0α,x<0f'(x) = \begin{cases} 1, & x \ge 0 \\ \alpha, & x < 0 \end{cases}f(x)={1,α,?x0x<0?

優點:

  • 避免梯度消失的問題
  • 計算簡單
  • 針對Relu函數中存在的Dead Relu Problem,Leaky Relu函數在輸入為負值時,給予輸入值一個很小的斜率,在解決了負輸入情況下的0梯度問題的基礎上,也很好的緩解了Dead Relu問題

缺點:

  • 輸出不是zero-centered
  • ReLU不會對數據做幅度壓縮,所以數據的幅度會隨著模型層數的增加不斷擴張
  • 理論上來說,該函數具有比Relu函數更好的效果,但是大量的實踐證明,其效果不穩定,故實際中該函數的應用并不多。
  • 由于在不同區間應用的不同的函數所帶來的不一致結果,將導致無法為正負輸入值提供一致的關系預測。

超參數 α\alphaα 的取值也已經被很多實驗研究過,有一種取值方法是對 α\alphaα 隨機取值, α\alphaα 的分布滿足均值為0,標準差為1的正態分布,該方法叫做隨機LeakyReLU(Randomized LeakyReLU)。原論文指出隨機LeakyReLU相比LeakyReLU能得更好的結果,且給出了參數 α\alphaα 的經驗值1/5.5(好于0.01)。至于為什么隨機LeakyReLU能取得更好的結果,解釋之一就是隨機LeakyReLU小于0部分的隨機梯度,為優化方法引入了隨機性,這些隨機噪聲可以幫助參數取值跳出局部最優和鞍點,這部分內容可能需要一整篇文章來闡述。正是由于 α\alphaα 的取值至關重要,人們不滿足與隨機取樣 α\alphaα ,有論文將 α\alphaα 作為了需要學習的參數,該激活函數為 PReLU(Parametrized ReLU)

自定義LeakyReLu

class SelfDefinedLeakyRelu(torch.autograd.Function):@staticmethoddef forward(ctx, inp, alpha):ctx.constant = alphactx.save_for_backward(inp)return torch.where(inp < 0., alpha * inp, inp)@staticmethoddef backward(ctx, grad_output):inp, = ctx.saved_tensorsones_like_inp = torch.ones_like(inp)return torch.where(inp < 0., ones_like_inp * ctx.constant,ones_like_inp), Noneclass LeakyRelu(nn.Module):def __init__(self, alpha=1):super().__init__()self.alpha = alphadef forward(self, x):out = SelfDefinedLeakyRelu.apply(x, self.alpha)return out

與Torch定義的比較

# self defined
torch.manual_seed(0)alpha = 0.1  # greater so could have bettrer visualization
leaky_relu = LeakyRelu(alpha=alpha)  # SelfDefinedLeakyRelu
inp = torch.randn(5, requires_grad=True)
out = leaky_relu((inp).pow(3))print(f'Out is\n{out}')out.backward(torch.ones_like(inp), retain_graph=True)
print(f"\nFirst call\n{inp.grad}")out.backward(torch.ones_like(inp), retain_graph=True)
print(f"\nSecond call\n{inp.grad}")inp.grad.zero_()
out.backward(torch.ones_like(inp), retain_graph=True)
print(f"\nCall after zeroing gradients\n{inp.grad}")
Out is
tensor([ 3.6594e+00, -2.5264e-03, -1.0343e+00,  1.8367e-01, -1.2756e-01],grad_fn=<SelfDefinedLeakyReluBackward>)First call
tensor([7.1240, 0.0258, 1.4241, 0.9693, 0.3529])Second call
tensor([14.2480,  0.0517,  2.8483,  1.9387,  0.7057])Call after zeroing gradients
tensor([7.1240, 0.0258, 1.4241, 0.9693, 0.3529])
# torch defined
torch.manual_seed(0)
inp = torch.randn(5, requires_grad=True)
out = F.leaky_relu((inp).pow(3), negative_slope=alpha)print(f'Out is\n{out}')out.backward(torch.ones_like(inp), retain_graph=True)
print(f"\nFirst call\n{inp.grad}")out.backward(torch.ones_like(inp), retain_graph=True)
print(f"\nSecond call\n{inp.grad}")inp.grad.zero_()
out.backward(torch.ones_like(inp), retain_graph=True)
print(f"\nCall after zeroing gradients\n{inp.grad}")
Out is
tensor([ 3.6594e+00, -2.5264e-03, -1.0343e+00,  1.8367e-01, -1.2756e-01],grad_fn=<LeakyReluBackward0>)First call
tensor([7.1240, 0.0258, 1.4241, 0.9693, 0.3529])Second call
tensor([14.2480,  0.0517,  2.8483,  1.9387,  0.7057])Call after zeroing gradients
tensor([7.1240, 0.0258, 1.4241, 0.9693, 0.3529])

可視化

# visualization
inp = torch.arange(-8, 8, 0.05, requires_grad=True)
out = leaky_relu(inp)
out.sum().backward()inp_grad = inp.gradplt.plot(inp.detach().numpy(),out.detach().numpy(),label=r"$leakyrelu(x)$",alpha=0.7)
plt.plot(inp.detach().numpy(),inp_grad.numpy(),label=r"$leakyrelu'(x)$",alpha=0.5)
plt.scatter(0, 0, color='None', marker='o', edgecolors='r', s=50)
plt.grid()
plt.legend()
plt.show()

請添加圖片描述

自定義PReLu

class SelfDefinedPRelu(torch.autograd.Function):@staticmethoddef forward(ctx, inp, alpha):ctx.constant = alphactx.save_for_backward(inp)return torch.where(inp < 0., alpha * inp, inp)@staticmethoddef backward(ctx, grad_output):inp, = ctx.saved_tensorsones_like_inp = torch.ones_like(inp)return torch.where(inp < 0., ones_like_inp * ctx.constant,ones_like_inp), Noneclass PRelu(nn.Module):def __init__(self):super().__init__()self.alpha = torch.randn(1, dtype=torch.float32, requires_grad=True)def forward(self, x):out = SelfDefinedLeakyRelu.apply(x, self.alpha)return out

ELU

指數線性單元 (Exponential Linear Unit)

公式

elu(x)={x,x≥0α(ex?1),x<0\text{elu}(x) = \begin{cases} x, & x \ge 0 \\ \alpha(e^x - 1), & x < 0 \end{cases}elu(x)={x,α(ex?1),?x0x<0?

求導過程

f′(x)=lim?h→0f(0)=f(0+h)?f(0)hf'(x)=\lim_{h\to 0}f(0) = \frac{f(0+h)-f(0)}{h}f(x)=limh0?f(0)=hf(0+h)?f(0)?
lim?h→0?=α(eh?1)?0h=0\lim_{h\to0^-}=\frac{\alpha (e^h - 1) - 0}{h} = 0limh0??=hα(eh?1)?0?=0
lim?h→0+=hh=1\lim_{h\to0^+}=\frac{h}{h} = 1limh0+?=hh?=1
所以f′(0)f'(0)f(0)處不可導
所以f′(x)={1,x≥0αex,x<0f'(x) = \begin{cases} 1, & x \ge 0 \\ \alpha e^x, & x < 0 \end{cases}f(x)={1,αex,?x0x<0?

理想的激活函數應滿足兩個條件:

  1. 輸出的分布是零均值的,可以加快訓練速度。
  2. 激活函數是單側飽和的,可以更好的收斂。

LeakyReLU和PReLU滿足第1個條件,不滿足第2個條件;而ReLU滿足第2個條件,不滿足第1個條件。兩個條件都滿足的激活函數為ELU(Exponential Linear Unit)。ELU雖然也不是零均值的,但在以0為中心一個較小的范圍內,均值是趨向于0,當然也與α\alphaα的取值也是相關的。

優點

  1. ELU具有Relu的大多數優點,不存在Dead Relu問題,輸出的均值也接近為0值;
  2. 該函數通過減少偏置偏移的影響,使正常梯度更接近于單位自然梯度,從而使均值向0加速學習;
  3. 該函數在負數域存在飽和區域,從而對噪聲具有一定的魯棒性;

缺點

  1. 計算強度較高,含有冪運算;
  2. 在實踐中同樣沒有較Relu更突出的效果,故應用不多;

自定義LeakyReLu

class SelfDefinedElu(torch.autograd.Function):@staticmethoddef forward(ctx, inp, alpha):ctx.constant = alpha * inp.exp()ctx.save_for_backward(inp)return torch.where(inp < 0., ctx.constant - alpha, inp)@staticmethoddef backward(ctx, grad_output):inp, = ctx.saved_tensorsones_like_inp = torch.ones_like(inp)return torch.where(inp < 0., ones_like_inp * ctx.constant,ones_like_inp), Noneclass Elu(nn.Module):def __init__(self, alpha=1):super().__init__()self.alpha = alphadef forward(self, x):out = SelfDefinedElu.apply(x, self.alpha)return out

與Torch定義的比較

# self defined
torch.manual_seed(0)alpha = 0.5  # greater so could have bettrer visualization
elu = Elu(alpha=alpha)  # SelfDefinedLeakyRelu
inp = torch.randn(5, requires_grad=True)
out = elu((inp + 1).pow(3))print(f'Out is\n{out}')out.backward(torch.ones_like(inp), retain_graph=True)
print(f"\nFirst call\n{inp.grad}")out.backward(torch.ones_like(inp), retain_graph=True)
print(f"\nSecond call\n{inp.grad}")inp.grad.zero_()
out.backward(torch.ones_like(inp), retain_graph=True)
print(f"\nCall after zeroing gradients\n{inp.grad}")
Out is
tensor([ 1.6406e+01,  3.5275e-01, -4.0281e-01,  3.8583e+00, -3.0184e-04],grad_fn=<SelfDefinedEluBackward>)First call
tensor([1.9370e+01, 1.4977e+00, 4.0513e-01, 7.3799e+00, 1.0710e-02])Second call
tensor([3.8740e+01, 2.9955e+00, 8.1027e-01, 1.4760e+01, 2.1419e-02])Call after zeroing gradients
tensor([1.9370e+01, 1.4977e+00, 4.0513e-01, 7.3799e+00, 1.0710e-02])
# torch defined
torch.manual_seed(0)
inp = torch.randn(5, requires_grad=True)
out = F.elu((inp + 1).pow(3), alpha=alpha)print(f'Out is\n{out}')out.backward(torch.ones_like(inp), retain_graph=True)
print(f"\nFirst call\n{inp.grad}")out.backward(torch.ones_like(inp), retain_graph=True)
print(f"\nSecond call\n{inp.grad}")inp.grad.zero_()
out.backward(torch.ones_like(inp), retain_graph=True)
print(f"\nCall after zeroing gradients\n{inp.grad}")
Out is
tensor([ 1.6406e+01,  3.5275e-01, -4.0281e-01,  3.8583e+00, -3.0184e-04],grad_fn=<EluBackward>)First call
tensor([1.9370e+01, 1.4977e+00, 4.0513e-01, 7.3799e+00, 1.0710e-02])Second call
tensor([3.8740e+01, 2.9955e+00, 8.1027e-01, 1.4760e+01, 2.1419e-02])Call after zeroing gradients
tensor([1.9370e+01, 1.4977e+00, 4.0513e-01, 7.3799e+00, 1.0710e-02])

可視化

inp = torch.arange(-1, 1, 0.05, requires_grad=True)
out = F.elu(inp, alpha=1.2)
# out = F.relu(inp)
out.mean(), out.std()
(tensor(0.0074, grad_fn=<MeanBackward0>),tensor(0.5384, grad_fn=<StdBackward0>))
inp = torch.arange(-1, 1, 0.05, requires_grad=True)
# out = F.elu(inp, alpha=1)
out = F.relu(inp)
out.mean(), out.std()
(tensor(0.2375, grad_fn=<MeanBackward0>),tensor(0.3170, grad_fn=<StdBackward0>))
# visualization
inp = torch.arange(-8, 8, 0.05, requires_grad=True)
out = elu(inp)
out.sum().backward()inp_grad = inp.gradplt.plot(inp.detach().numpy(),out.detach().numpy(),label=r"$elu(x)$",alpha=0.7)
plt.plot(inp.detach().numpy(),inp_grad.numpy(),label=r"$elu'(x)$",alpha=0.5)
plt.scatter(0, 0, color='None', marker='o', edgecolors='r', s=50)
plt.grid()
plt.legend()
plt.show()

請添加圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260469.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260469.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260469.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

手勢處理

在ios開發中&#xff0c;需用到對于手指的不同操作&#xff0c;以手指點擊為例&#xff1a;分為單指單擊、單指多擊、多指單擊、多指多擊。對于這些事件進行不同的操作處理&#xff0c;由于使用系統自帶的方法通過判斷touches不太容易處理&#xff0c;而且會有事件之間的沖突。…

mybatis select count(*) 一直返回0 mysql_Mybatis教程1:MyBatis快速入門

點擊上方“Java技術前線”&#xff0c;選擇“置頂或者星標”與你一起成長一、Mybatis介紹MyBatis是一個支持普通*SQL*查詢&#xff0c;存儲過程和高級映射的優秀持久層框架。MyBatis消除了幾乎所有的JDBC代碼和參數的手工設置以及對結果集的檢索封裝。MyBatis可以使用簡單的XML…

css預處理器sass使用教程(多圖預警)

css預處理器賦予了css動態語言的特性&#xff0c;如變量、函數、運算、繼承、嵌套等&#xff0c;有助于更好地組織管理樣式文件&#xff0c;以及更高效地開發項目。css預處理器可以更方便的維護和管理css代碼&#xff0c;讓整個網頁變得更加靈活可變。對于預處理器&#xff0c;…

mysql 主從優點_MySql主從配置實踐及其優勢淺談

1、增加兩個MySQL,我將C:\xampp\mysql下的MYSQL復制了一份&#xff0c;放到D:\Mysql2\Mysql5.1修改my.ini(linux下應該是my.cnf)&#xff1a;[client]port 3307[mysqld]port 3307basedirD:/Mysql2/Mysql5.1/mysqldatadirD:/Mysql2/Mysql5.1/mysql/data/之后&#xff0c;再增加…

python 多線程并發編程(生產者、消費者模式),邊讀圖像,邊處理圖像,處理完后保存圖像實現提高處理效率

文章目錄需求實現先導入本次需要用到的包一些輔助函數如下函數是得到指定后綴的文件如下的函數一個是讀圖像&#xff0c;一個是把RGB轉成BGR下面是主要的幾個處理函數在上面幾個函數構建對應的處理函數main函數按順序執行結果需求 本次的需求是邊讀圖像&#xff0c;邊處理圖像…

Sharepoint學習筆記—Site Definition系列-- 2、創建Content Type

Sharepoint本身就是一個豐富的大容器&#xff0c;里面存儲的所有信息我們可以稱其為“內容(Content)”&#xff0c;為了便于管理這些Conent&#xff0c;按照人類的正常邏輯就必然想到的是對此進行“分類”。分類所涉及到的層面又必然包括: 1、分類的標準或特征描述{即&#xf…

arduino byte轉string_Java數組轉List集合的三駕馬車

點擊上方 藍字關注我們來源&#xff1a;blog.csdn.net/x541211190/article/details/79597236前言本文中的代碼命名有的可能不太規范&#xff0c;是因為沒法排版的問題&#xff0c;小仙已經很努力去解決了&#xff0c;希望各位能多多點贊、分享。好了&#xff0c;不多bb了(不要讓…

ES6筆記(4)-- Symbol類型

系列文章 -- ES6筆記系列 Symbol是什么&#xff1f;中文意思是標志、記號&#xff0c;顧名思義&#xff0c;它可以用了做記號。 是的&#xff0c;它是一種標記的方法&#xff0c;被ES6引入作為一種新的數據類型&#xff0c;表示獨一無二的值。 由此&#xff0c;JS的數據類型多了…

mysql類型說明_MYSQL 數據類型說明

MySQL支持大量的列類型&#xff0c;它可以被分為3類&#xff1a;數字類型、日期和時間類型以及字符串(字符)類型。本節首先給出可用類型的一個概述&#xff0c;并且總結每個列類型的存儲需求&#xff0c;然后提供每個類中的類型性質的更詳細的描述。概述有意簡化&#xff0c;更…

LeetCode OJ - Convert Sorted List to Binary Search Tree

題目&#xff1a; Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. 解題思路&#xff1a; 注意是讓構造平衡二叉搜索樹。 每次將鏈表從中間斷開&#xff0c;分成左右兩部分。左邊部分用來構造左子樹&#xff…

手把手教你如下在Linux下如何寫一個C語言代碼,編譯并運行

文章目錄手把手教你如下在Linux下如何寫一個C語言代碼&#xff0c;編譯并運行打開Ubuntu終端創建 helloworld.c編譯C文件手把手教你如下在Linux下如何寫一個C語言代碼&#xff0c;編譯并運行 打開Ubuntu終端 我這里的終端是Windows下的WSL&#xff0c;如果有疑問&#xff0c;…

郵件群發工具的編寫(二)數據的保存

數據的保存與讀取 人類是在不斷探索與改進中進步的 上一篇&#xff0c;郵件群發工具的編寫&#xff08;一&#xff09;郵件地址提取&#xff0c;我們講到了郵箱的提取。 那么這一篇&#xff0c;講一下提取完的郵箱信息的保存和讀取。 首先&#xff0c;我希望對上一篇郵箱提取類…

mysql 文件描述符_MySQL沒有發布臨時文件描述符

幾天前,我們遇到了MySQL安裝的一些嚴重問題&#xff1a;MySQL不斷打開臨時文件(正常行為)但這些文件從未發布過.結果是,最終磁盤空間耗盡,我們必須重新啟動服務并手動清理/ tmp.使用lsof,我們看到這樣的事情&#xff1a;mysqld 16866 mysql 5u REG 8,3 0 692 /tmp/ibyWJylQ (de…

c++ lambda函數_C++11 之 lambda函數的詳細使用

1. lambda 函數概述lambda 表達式是一種匿名函數&#xff0c;即沒有函數名的函數&#xff1b;該匿名函數是由數學中的λ演算而來的。通常情況下&#xff0c;lambda函數的語法定義為&#xff1a;[capture] (parameters) mutable ->return-type {statement}其中&#xff1a;[c…

zabbix監控 openstack 的實例的資源使用情況

領導提出的需求&#xff1a;在不給云主機安裝客戶端的情況下&#xff0c;監控云主機的 cpui 內存 網絡 io&#xff0c;并且能出圖。想了幾個方案&#xff1a;1、ceilometer取數據&#xff0c;存入mangodb&#xff0c;用zabbix來讀mangodb數據繪圖2 ceilometer 取數據 &#xff…

pytorch 正向與反向傳播的過程 獲取模型的梯度(gradient),并繪制梯度的直方圖

記錄一下怎樣pytorch框架下怎樣獲得模型的梯度 文章目錄引入所需要的庫一個簡單的函數模型梯度獲取先定義一個model如下定義兩個獲取梯度的函數定義一些過程與調用上述函數的方法可視化一下梯度的histogram引入所需要的庫 import os import torch import torch.nn as nn impor…

2012-9

響應式設計的典范 http://www.bostonglobe.com/ 網站測試頁面 http://www.webpagetest.org/ 編程算法 http://blog.sina.com.cn/s/articlelist_1647038822_1_1.html C Programmers Cookbook http://www.cppblog.com/mzty/category/7609.html Blade 是一個現代構建系統&#xff…

PV操作 (轉載)

PV操作與信號量的處理相關&#xff0c;P表示通過的意思&#xff0c;V表示釋放的意思。信號量是最早出現的用來解決進程同步與互斥問題的機制&#xff0c;包括一個稱為信號量的變量及對它進行的兩個原語操作。 信號量&#xff08;semaphore&#xff09;的數據結構為一個值和一個…

ubuntu升級python_Ubuntu 升級python3為更高版本【已實測】

2020-04-13 更新安裝步驟&#xff1a; 1. 先update一下 sudo apt update 2. 安裝依賴庫 sudo apt-get install zlib1g-dev libbz2-dev libssl-dev libncurses5-dev libsqlite3-dev libreadline-dev tk-dev libgdbm-dev libdb-dev libpcap-dev xz-utils libexpat1-dev liblzma-d…

mysql5.0 java連接_Java連接mysql5.0

網上的資料真爛&#xff0c;千篇一律的拷貝的&#xff0c;根本不能用&#xff0c;鄙視&#xff01; 正題&#xff1a; 到MYSQL網站下載mysql-connector-java-5.0.4.zip文件&#xff0c;解壓&#xff1b; 解壓后有一個文件&#xff1a;mysql-connector-java-5.0.4-bin.jar 把這個…