加速佈局純電動車市場,Panasonic收購歐系廠商

為加快在純電動車市場的布局,根據 《日本經濟新聞》 的報導指出,日本家電及科技大廠松下(Panasonic)已決定收購奧地利汽車照明廠商ZKW 集團,以跨入此項業務領域。兩家企業目前已啟動最終談判,預估收購金額最多將達到1,000 億日圓的規模。

報導中指出,目前IT 和大型電子企業為了贏得隨著自動駕駛和純電動汽車 (EV) 普及而産生的商機,正在展開積極的收購,使得跨行業的汽車零組件產業的重組效應正在擴大。目前松下和ZKW 集團正在磋商收購協議的詳細內容,有可能在12 月內達成協議。ZKW 的主要産品是節能、能照射較遠和亮度高的汽車發光二極體(LED)前燈。在歐美、中國和印度擁有生産和研究基地。

ZKW 集團成立於1938 年,主要客戶包括美國通用汽車(GM)等歐美傳統大型車廠。2016 年的銷售額預計達到約9 億歐元,全球員工人數約為7,500 人。而在此產業領域,排在首位的日本小糸製作所和法國法雷奧集團)Valeo),兩家公司合計掌握近5 成市佔率。至於,ZKW 集團的市佔率為5% 上下。

報導進一步分析指出,在自動駕駛時代,車燈將成為左右安全性的重要關鍵零組件。因為車輛在行進時,必須預測前進的方向而改變照射方向,並且調整亮度的技術開發正在不斷進化中。由於,松下在傳感器等領域擁有豐富經驗,收購了ZKW 集團之後,將有助於開發辨識度提高的新型車燈,以追趕上產業中的領先企業。

目前,松下的汽車相關業務以車載導航系統和車用電池做為主力。尤其,在車用電池發展上,目前正在與美國電動汽車龍頭特斯拉(TESLA)汽車進行量産計畫,在車用電池領域的投資總額高達5,000 億日圓。

而為了達到2018 會計年度(截至2019 年3 月止),汽車相關業務合併收達到2 兆日圓,較2015 會計年度成長5 成的目標,松下正在積極收購在此領域聚酯性與技術的零組件廠商。2015 年,松下曾經向西班牙汽車零組件廠商法可賽集團(Ficosa International, S.A.)投資持股49%,兩家公司合作在電子後視鏡上的共同開發。

目前在汽車產業中,跨產業的零組件企業重組正在積極進行中。包括韓國三星電子11月決定以80 億美元收購在車載終端領域具有優勢的美國哈曼國際 (Harman International),德國西門子與法雷奧集團成立了生産電動汽車驅動器零組件的合資企業,而美國Google 則收購了有助於開發自動駕駛的相關企業。

(本文內容由授權提供。首圖來源: CC BY 2.0)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※回頭車貨運收費標準

聚甘新

樂視電動車CES亮相,宣戰特斯拉、法拉利與賓利

2017年首個國際大型電子展覽CES即將於1月3日在美國賭城開鑼。由中國樂視控股所投資成立的電動車新創公司「法拉第未來」(Faraday Future)宣布將在展會上正式推出第一款樂視電動車。

樂視控股創辦人兼董事長賈躍亭在12月11日於北京舉辦的「2016中國企業領袖年會」上揭露樂視電動車的首支概念影片,並表示法拉第未來的第一款電動車很快就會在CES 2017與世人見面。

賈躍亭強調,樂視電動車將是世界上最先進的汽車產品,結合了互聯網、AI(人工智慧)技術;加上樂視本身的IT、電視、手機產品,樂視電動車將成為智慧終端機。他進一步指出,樂視的超級汽車已經在中國浙江末干山取得設廠所需土地,未來將建設中國首個互聯網生態超級汽車工廠,且全程開放使用者參與。

外媒指出,樂視所公開的影片顯然把特斯拉(Tesla)、法拉利(Ferrari)以及賓利(Bentley)等超跑與電動車龍頭視為假想敵;但無論影片或者賈躍亭的演說,都未透露關於這款即將面世的電動車的其他細節,包括具體的名稱、價格區間、充電所需時間等等問題。這些問題都需等待CES 2017才能獲得答案。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

※教你寫出一流的銷售文案?

聚甘新

第七屆中國國際新能源汽車論壇2017之驅動創新

每當提起新能源汽車核心零部件,我們首先想到的是電池,而對電機電控等方面的探討和認知卻很少,究其原因,電控電機這兩大核心零部件在平日裡少有熱點和創新,尤其是在電控領域,國內供應商還處於一個相對初級的階段,所研發的產品還無法達到國際領先水準,因此極大的限制了廣大消費者們對電機電控技術的關心。然而,未來的5年時間內電機電控將會進入發展最關鍵的時期,並且熱度持續飆升。相關機構資料統計,預計到2020年,驅動電控及電機的累積市場規模將達到1600億元。

現階段,電控電機的產業已經形成了多重勢力競相爭奪的局面,除了國內本土的電控電機供應商外,整車廠、國內外汽車零部件供應商及外資新能源汽車生產商都相繼加入戰局。同時,隨著市場的熱度提升,電控電機技術領域也面臨著更大的挑戰。為了縮小國內外電控電機的技術差距,國內企業也在除了沿用傳統的製造工藝同時,在技術及工藝上也在進行不斷地研發及創新。

新能源汽車對於電控電機的品質要求相比于傳統汽車要更高,並且總體而言,電控電機產品的可靠性,一體化與新能源汽車的使用要求還存在一定差距,中國國際新能源汽車論壇—致力於打造全球規模最大,最國際化的新能源汽車論壇,第七屆大會攜手上海市嘉定區人民政府將會專門設立電控電機板塊,進行一天8小時的技術探討及分享,屆時國內外知名的整車商,電控電機供應商及零部件企業高層領導等將前來分享各自對於目前電控電機市場的發展前景看法及介紹最前沿的技術,同時,也會側重于目前應用最普遍的永磁電機從磁性材料和技術方面進行更深層次的交流。

本屆大會將於2017年5月17-19日在上海舉辦,大會涉及共七個論壇,頒獎典禮,研討會及晚宴。屆時將會有全球範圍內的整車製造商、電網電力公司、電池廠商、零部件供應商、核心技術提供商和政府官員600多位行業人士一起,對新能源汽車產業面臨的挑戰,機遇與對策各方面進行為期三天更深層次並具有建設和戰略性的探討,期待您的參與。

若您對峰會有更多要求,請撥打021-6045 1760與我們聯繫,謝謝理解和支持!
我們期待與貴單位一起出席於5月17-19日在上海舉辦的第七屆中國國際新能源汽車論壇2017,以利決策!
想瞭解詳細內容,請登陸官方網站:
連絡人:Hill Zeng(曾先生)
電話:+86-21-6045 1760
傳真:+86-21-6047 5887
郵箱:

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

※超省錢租車方案

聚甘新

特斯拉 Q4 出貨量下降

特斯拉發佈第四季報告,第四季出貨數據因自動駕駛硬體關係,比前一季低9.4%。

特斯拉在2016 年第三季賣出24,500 臺,但到了第四季減少到22,200 臺車子。除了季銷售下跌,整年的銷售數據比先前預期低,先前預測出貨80,000~90,000 臺,實際上是76,230 臺。

在第四季賣出的22,200 臺車子中,有12,700 臺是Model S,而9,500 臺是Model X。

生產數字方面,第四季特斯拉生產24,882 臺,比起去年同一季增加64%。

特斯拉表示,由於要引進自動駕駛設備,雖然生產時程能在第四季前完成,但就會壓縮到銷售和把車子送到客戶手上的時間,像是在比較遠的市場如亞洲和歐洲,需要較長的運輸時間,導致銷售數據不佳。即便客戶已經下訂,但由於運輸延遲車子沒送到手上,導致2,750 臺車子不被計入Q4 的銷售量。

而在第四季末時有6,450 臺車子在運送途中,將被算入2017 年Q1 的數據。

(內容由授權。)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※想知道最厲害的網頁設計公司“嚨底家”!

※別再煩惱如何寫文案,掌握八大原則!

※產品缺大量曝光嗎?你需要的是一流包裝設計!

聚甘新

不只搶衛生紙!紐約民眾瘋「認養寵物」…收容所全沒毛孩了

摘錄自2020年3月26日ETtoday報導

新型肺炎疫情近日在美大爆發,紐約州長古莫(Andrew Cuomo)要求居民盡可能待在家,結果因民眾在家防疫需要寵物陪伴紓壓,導致出現收容所的狗全被認養走的情況。

紐約市動物福利組織「Muddy Paws Rescue」、「Best Friends Animal Society」近日即指出,在這兩星期內,申請認領犬貓的數量比平常多出10倍,紐約民眾顯然是將飼養貓狗視為防疫紓解壓力的方法。

「Muddy Paws Rescue」總監安娜(Anna Lai)表示,現在我們機構完全沒有狗可供認領,這是個大問題。「Best Friends Animal Society」執行官朱莉(Julie Castle)說,民眾成群結隊的來認養寵物,我沒看過美國人民這麼團結。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※回頭車貨運收費標準

北海道降雪量不到往年一半 札幌積雪僅9厘米

摘錄自2020年1月9日星島日報報導

日本北海道今個冬天降雪異常,上月降雪量不到往年一半,創1961年統計以來新低紀錄,札幌雪祭月底就要開幕,主辦單位正緊急到30公里外的鄉鎮俱知安町及京極町等地「調雪」到札幌市大通公園,讓參加者製作冰雕。

札幌市中央區的積雪量到周四上午9時止只有9厘米,較往年同期的44厘米大幅減少,雪祭通常需要3000輛10噸重大卡車的雪量。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

※教你寫出一流的銷售文案?

關於 JOIN 耐心總結,學不會你打我系列

現在隨着各種數據庫框架的盛行,在提高效率的同時也讓我們忽略了很多底層的連接過程,這篇文章是對 SQL 連接過程梳理,並涉及到了現在常用的 SQL 標準。

其實標準就是在不同的時間,制定的一些寫法或規範。

從 SQL 標準說起

在編寫 SQL 語句前,需要先了解在不同版本的規範,因為隨着版本的變化,在具體編寫 SQL 時會有所不同。對於 SQL 來說,SQL92 和 SQL99 是最常見的兩個 SQL 標準,92 和 99 對應其提出的年份。除此之外,還存在 SQL86、SQL89、SQL2003、SQL2008、SQL2011,SQL2016等等。

但對我們來說,SQL92 和 SQL99 是最常用的兩個標準,主要學習這兩個就可以了。

為了演示方便,現在數據庫中加入如下三張表:

每個學生屬於一個班級,通過班級的人數來對應班級的類型。

-- ----------------------------
DROP TABLE IF EXISTS `Student`;
CREATE TABLE `Student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL DEFAULT '',
  `birth` varchar(20) NOT NULL DEFAULT '',
  `sex` varchar(10) NOT NULL DEFAULT '',
  `class_id` int(11) NOT NULL COMMENT '班級ID',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of Student
-- ----------------------------
INSERT INTO `Student` VALUES ('1', '胡一', '1994.1.1', '男', '1');
INSERT INTO `Student` VALUES ('3', '王阿', '1992.1.1', '女', '1');
INSERT INTO `Student` VALUES ('5', '王琦', '1993.1.2', '男', '1');
INSERT INTO `Student` VALUES ('7', '劉偉', '1998.2.2', '女', '1');
INSERT INTO `Student` VALUES ('11', '張使', '1994.1.1', '男', '3');
INSERT INTO `Student` VALUES ('13', '王阿', '1992.1.1', '女', '3');
INSERT INTO `Student` VALUES ('15', '夏琪', '1993.1.2', '男', '3');
INSERT INTO `Student` VALUES ('17', '劉表', '1998.2.2', '女', '3');
INSERT INTO `Student` VALUES ('19', '諸葛', '1994.1.1', '男', '3');
INSERT INTO `Student` VALUES ('21', '王前', '1992.1.1', '女', '3');
INSERT INTO `Student` VALUES ('23', '王意識', '1993.1.2', '男', '3');
INSERT INTO `Student` VALUES ('25', '劉等待', '1998.2.2', '女', '3');
INSERT INTO `Student` VALUES ('27', '胡是一', '1994.1.1', '男', '5');
INSERT INTO `Student` VALUES ('29', '王阿請', '1992.1.1', '女', '5');
INSERT INTO `Student` VALUES ('31', '王消息', '1993.1.2', '男', '5');
INSERT INTO `Student` VALUES ('33', '劉全', '1998.2.2', '女', '5');
INSERT INTO `Student` VALUES ('35', '胡愛', '1994.1.1', '男', '5');
INSERT INTO `Student` VALUES ('37', '王表', '1992.1.1', '女', '5');
INSERT INTO `Student` VALUES ('39', '王華', '1993.1.2', '男', '5');
INSERT INTO `Student` VALUES ('41', '劉偉以', '1998.2.2', '女', '5');
INSERT INTO `Student` VALUES ('43', '胡一彪', '1994.1.1', '男', '5');
INSERT INTO `Student` VALUES ('45', '王阿符', '1992.1.1', '女', '5');
INSERT INTO `Student` VALUES ('47', '王琦刪', '1993.1.2', '男', '5');
INSERT INTO `Student` VALUES ('49', '劉達達', '1998.2.2', '女', '5');

-- ----------------------------
-- Table structure for `Class`
-- ----------------------------
DROP TABLE IF EXISTS `Class`;
CREATE TABLE `Class` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL DEFAULT '',
  `number` int(11) NOT NULL DEFAULT '',
  `class_type_id` int(11) NOT NULL COMMENT '班級類型ID',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of Class
-- ----------------------------
INSERT INTO `Class` VALUES ('1', '1年1班', 4, '1');
INSERT INTO `Class` VALUES ('3', '1年2班', 8, '3');
INSERT INTO `Class` VALUES ('5', '1年3班', 12, '5');

CREATE TABLE `ClassType`(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(20) NOT NULL DEFAULT '',
  `minimum_number` int(11) NOT NULL DEFAULT '' COMMENT '最少的班級人數',
  `maximum_number` int(11) NOT NULL DEFAULT '' COMMENT '最多的班級人數',
  PRIMARY KEY(`id`)
);
INSERT INTO `ClassType` VALUES ('1', '小班', '1', '4');
INSERT INTO `ClassType` VALUES ('3', '中班', '5', '8');
INSERT INTO `ClassType` VALUES ('5', '大班', '9', '12');

SQL92

笛卡爾積(交叉連接)

笛卡爾積是一個數學上的概念,表示如果存在 X,Y 兩個集合,則 X,Y 的笛卡爾積記為 X * Y. 表示由 X,Y 組成有序對的所有情況。

對應在 SQL 中,就是將兩張表中的每一行進行組合。而且在連接時,可以沒有任何限制,可將沒有關聯關係的任意表進行連接。

這裏拿學生表和班級表舉例,在學生表中我們插入了20名學生的數據,課程表中插入三個班級。則學生和班級的笛卡爾結果就是將兩表的每行數據一一組合,最後就是有 24 * 3 = 72 行的結果,如下圖所示。

並且需要知道的是,下面學習的外連接,自連接,等值連接等都是在笛卡爾積的基礎上篩選得到的。

對應的 SQL92 寫法為:

select * from Student, Class;

等值連接(內連接)

等值連接就是將兩張表中都存在的列進行連接,具體來說就是 where 後面通過 = 進行篩選。

比如查詢 Student 和其所屬 Class 信息的關係:

SELECT * FROM Student as s, Class as c where s.class_id = c.id;

非等值連接

非等值連接就是將等值連接中的等號換成其他的過濾條件。

比如這裏查詢每個班級的信息以及所屬的班級類別。

SELECT * FROM Class as c, ClassType t where c.number between t.minimum_number and maximum_number;

外連接

對於 SQL92 的外連接來說,在連接時會將兩張表分為主表和從表,主表显示所有的數據,從表显示匹配到的數據,沒有匹配到的則显示 None. 用 + 表示從表的位置。

左外連接:左表是主表,右表時從表。

SELECT * FROM Student as s , Class as c where s.class_id = c.id(+);

右外連接:左表是從表,右表時主表。

SELECT * FROM Class as c, Student as s  where c.id = s.class_id(+);

注意 SQL92 中並沒有全外連接。

自連接

自連接一般用於連接本身這張表,由於常見的 DBMS 都會對自連接做一些優化,所以一般在子查詢和自連接的情況下都使用自連接。

比如想要查詢比1年1班人數多的班級:

子查詢:

SELECT * FROM Class WHERE number > (SELECT number FROM Class WHERE name="1年1班"); 

自連接:

SELECT c2.* FROM Class c1, Class c2 WHERE c1.number < c2.number and c1.name = "1年1班"; 

SQL99

交叉連接

SELECT * FROM Student CROSS JOIN Class;

還可以對多張表進行交叉連接,比如連接 Student,Class,ClassType 三張表,結果為 24 * 3 * 3 = 216 條。

相當於嵌套了三層 for 循環。

自然連接

其實就是 SQL92 中的等值連接,只不過連接的對象是具有相同列名,並且值也相同的內容。

SELECT * FROM Student NATURAL JOIN CLASS;
SELECT * FROM Student as s, Class as c where s.id = c.id;

如果想用 NATURAL JOIN 時,建議為兩表設置相同的列名,比如 Student 表中的班級列為 class_id, 則在 Class 表中,id 也應改為 class_id. 這樣連接更合理一些。

如果大家嘗試,自然連接的話,會發現查出來的結果集為空,不要奇怪,下面說一下原因:

這是因為,NATURAL JOIN 會自動連接兩張表中相同的列名,而對於 Student 和 Class 兩張表來說,id 和 name 在這兩張表都是相同的,所以既滿足 id 又滿足 name 的行是不存在的。

相當於 SQL 變成了這樣

SELECT * FROM Student as s, Class as c where s.id = c.id and s.name = c.name;

ON 連接

ON 連接其實對了 SQL92 中的等值連接和非等值連接:

等值連接:

SELECT * FROM Student as s JOIN Class as c ON s.class_id = c.id;

or

SELECT * FROM Student as s INNER JOIN Class as c ON s.class_id = c.id;

非等值連接:

SELECT * FROM Class as c JOIN ClassType t ON c.number between t.minimum_number and maximum_number;

USING 連接

和 NATURAL JOIN 很像,可以手動指定具有相同列名的列進行連接:

SELECT * FROM Student JOIN Class USING(id);

這時就解決了之前列存在重名,無法連接的情況。

外連接

左外連接: 左表是主表,右表時從表。

SELECT * FROM Student as s LEFT JOIN Class as c on s.class_id = c.id;
OR
SELECT * FROM Student as s LEFT OUTER JOIN Class as c on s.class_id = c.id;

右外連接:左表是從表,右表時主表。

SELECT * FROM Student as s RIGHT JOIN Class as c on s.class_id = c.id;
OR
SELECT * FROM Student as s RIGHT OUTER JOIN Class as c on s.class_id = c.id;

全外連接: 左外連接 + 右外的連接的合集

SELECT * FROM Student as s FULL JOIN Class as c ON s.class_id = c.id; 

MySQL 中沒有全外連接的概念。

自連接:

SELECT c2.* FROM Class c1 JOIN Class c2 ON c1.number < c2.number and c1.name = "1年1班"; 

SQL92 和 SQL99 的對比

  1. SQL92 中的等值連接(內連接),非等值連接,自連接對應了 SQL99 的 ON 連接,用於篩選滿足連接條件的數據行。

  2. SQL92 的笛卡爾積連接,對應了 SQL99 的交叉連接。

  3. SQL92 中的外連接並不包含全外連接,而 SQL99 支持,並且將 SQL92 中 WHERE 換為 SQL99 的 ON. 這樣的好處可以更清晰的表達連接表的過程,更直觀。

    SELECT ...
    FROM table1
        JOIN table2 ON filter_condition
            JOIN table3 ON filter_condition
    
  4. SQL99 多了自然連接和 USING 連接的過程,兩者的區別是是否需要顯式的指定列名。

總結

我們知道,在 SQL 中,按照年份劃分了不同的標準,其中最為常用的是 SQL-92 和 SQL-99 兩個標準。

接着,對比了 92 和 99 兩者的不同,發現 99 的標準在連接時,更加符合邏輯並且更加直觀。

最後,上一張各種連接的示意圖, 方便梳理複習:

參考

各種連接的不同

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※回頭車貨運收費標準

從 0 開始機器學習 – 神經網絡反向 BP 算法!

最近一個月項目好忙,終於擠出時間把這篇 BP 算法基本思想寫完了,公式的推導放到下一篇講吧。

一、神經網絡的代價函數

神經網絡可以看做是複雜邏輯回歸的組合,因此與其類似,我們訓練神經網絡也要定義代價函數,之後再使用梯度下降法來最小化代價函數,以此來訓練最優的權重矩陣。

1.1 從邏輯回歸出發

我們從經典的邏輯回歸代價函數引出,先來複習下:

\[J(\theta) = \frac{1}{m}\sum\limits_{i = 1}^{m}{[-{y^{(i)}}\log ({h_\theta}({x^{(i)}}))-( 1-{y^{(i)}})\log ( 1 – h_\theta({x^{(i)}}))]} + \frac{\lambda}{2m} \sum\limits_{j=1}^{n}{\theta_j^2} \]

邏輯回歸代價函數計算每個樣本的輸入與輸出的誤差,然後累加起來除以樣本數,再加上正則化項,這個我之前的博客已經寫過了:

  • 從 0 開始機器學習 – 邏輯回歸原理與實戰!
  • 從 0 開始機器學習 – 正則化技術原理與編程!

這裏補充一點對單變量邏輯回歸代價函數的理解,雖然這一行代價公式很長:

\[cost(i) = -{y^{(i)}}\log ({h_\theta}({x^{(i)}}))-( 1-{y^{(i)}})\log ( 1 – h_\theta({x^{(i)}})) \]

但是其實可以把它簡單的理解為輸出與輸入的方差,雖然形式上差別很大,但是可以幫助我們理解上面這個公式到底在計算什麼,就是計算輸出與輸入的方差,這樣理解就可以:

\[cost(i) = h_{\theta}(x^{(i)} – y^{(i)})^2 \]

1.2 一步步寫出神經網絡代價函數

前面講的簡單邏輯回歸的只有一個輸出變量,但是在神經網絡中輸出層可以有多個神經元,所以可以有很多種的輸出,比如 K 分類問題,神經元的輸出是一個 K 維的向量:

因此我們需要對每個維度計算預測輸出與真實標籤值的誤差,即對 K 個維度的誤差做一次求和:

\[\sum\limits_{i = 1}^{k}{[-{y_k^{(i)}}\log ({h_\theta}({x^{(i)}}))_k-( 1-{y_k^{(i)}})\log ( 1 – h_\theta({x^{(i)}})_k)]} \]

然後累加訓練集的 m 個樣本:

\[-\frac{1}{m}[\sum\limits_{i = 1}^{m}\sum\limits_{k = 1}^{k}{[-{y_k^{(i)}}\log ({h_\theta}({x^{(i)}}))_k-( 1-{y_k^{(i)}})\log ( 1 – h_\theta({x^{(i)}})_k)]}] \]

再加上所有權重矩陣元素的正則化項,注意 \(i, j\) 都是從 1 開始的,因為每一層的 \(\theta_0\) 是偏置單元,不需要對其進行正則化:

\[\frac{\lambda}{2m}\sum\limits_{i = l}^{L – 1}\sum\limits_{i = 1}^{S_l}\sum\limits_{j = 1}^{S_l + 1}(\theta_{ji}^{(l)})^2 \]

  • 最內層求和:循環一個權重矩陣所有的行,行數是 \(S_l + 1\) 層激活單元數
  • 中間層求和:循環一個權重矩陣所有的列,列數是 \(S_l\) 層激活單元數
  • 最外層求和:循環所有的權重矩陣

這就得到了輸出層為 K 個單元神經網絡最終的代價函數:

\[J(\theta) = -\frac{1}{m}[\sum\limits_{i = 1}^{m}\sum\limits_{k = 1}^{k}{[-{y_k^{(i)}}\log ({h_\theta}({x^{(i)}}))_k-( 1-{y_k^{(i)}})\log ( 1 – h_\theta({x^{(i)}})_k)]}] + \frac{\lambda}{2m}\sum\limits_{i = l}^{L – 1}\sum\limits_{i = 1}^{S_l}\sum\limits_{j = 1}^{S_l + 1}(\theta_{ji}^{(l)})^2 \]

有了代價函數后,就可以通過反向傳播算法來訓練一個神經網絡啦!

二、神經網絡反向 BP(Back Propagation) 算法

2.1 BP 算法簡介

之前寫神經網絡基礎的時候,跟大家分享了如何用訓練好的神經網絡來預測手寫字符:從 0 開始機器學習 – 神經網絡識別手寫字符!,只不過當時我們沒有訓練網絡,而是使用已經訓練好的神經網絡的權重矩陣來進行前饋預測,那麼我們如何自己訓練神經網絡呢?

這就需要學習反向 BP 算法,這個算法可以幫助我們求出神經網絡權重矩陣中每個元素的偏導數,進而利用梯度下降法來最小化上面的代價函數,你可以聯想簡單的線性回歸算法:從 0 開始機器學習 – 一文入門多維特徵梯度下降法!,也是先求每個參數的偏導數,然後在梯度下降算法中使用求出的偏導數來迭代下降。

因此訓練神經網絡的關鍵就是:如何求出每個權重係數的偏導數?,反向 BP 就可以解決這個問題!這裏強烈建議你學習的時候完全搞懂 BP 算法的原理,最好自己獨立推導一遍公式,因為你以後學習深度學習那些複雜的網絡,不管是哪種,最終都要使用反向 BP 來訓練,這個 BP 算法是最核心的東西,面試也逃不過的,所以既然要學,就要學懂,不然就是在浪費時間。

2.2 BP 算法基本原理

我先用個例子簡單介紹下 BP 算法的基本原理和步驟,公式的推導放到下一節,反向 BP 算法顧名思義,與前饋預測方向相反:

  • 計算最後一層輸出與實際標籤值的誤差,反向傳播到倒數第二層
  • 計算倒數第二層的傳播誤差,反向傳播到倒數第三層
  • 以此類推,一層一層地求出各層的誤差
  • 直到第二層結束,因為第一層是輸入特徵,不是我們計算的,所以不需要求誤差

以下面這個 4 層的神經網絡為例:

假如我們的訓練集只有 1 個樣本 \((x^{(1)}, y^{(1)})\),每層所有激活單元的輸出用 \(a^{(i)}\) 向量表示,每層所有激活單元的誤差用 \(\delta^{(i)}\) 向量表示,來看下反向傳播的計算步驟(公式的原理下一節講):

  1. 輸出層的誤差為預測值減去真實值:\(\delta^{(4)} = a^{(4)} – y^{(1)}\)
  2. 倒數第二層的誤差為:\(\delta^{(3)} = (W^{(3)})^T \delta^{(4)} * g'(z^{(3)})\)
  3. 倒數第三層的誤差為:\(\delta^{(2)} = (W^{(2)})^T \delta^{(3)} * g'(z^{(2)})\)
  4. 第一層是輸入變量,不需要計算誤差

有了每層所有激活單元的誤差后,就可以計算代價函數對每個權重參數的偏導數,即每個激活單元的輸出乘以對應的誤差,這裏不考慮正則化:

\[\frac {\partial}{\partial W_{ij}^{(l)}} J (W) = a_{j}^{(l)} \delta_{i}^{(l+1)} \]

解釋下這個偏導數的計算:

  • \(l\) 表示目前計算的是第幾層
  • \(j\) 表示當前層中正在計算的激活單元下標(\(j\) 作為列)
  • \(i\) 表示下一層誤差單元的下標(\(i\) 作為行)

這個計算過程是對一個樣本進行的,網絡的輸入是一個特徵向量,所以每層計算的誤差也是向量,但是我們的網絡輸入是特徵矩陣的話,就不能用一個個向量來表示誤差了,而是應該也將誤差向量組成誤差矩陣,因為特徵矩陣就是多個樣本,每個樣本都做一個反向傳播,就會計算誤差,所以我們每次都把一個樣本計算的誤差累加到誤差矩陣中:

\[\Delta_{ij}^{(l)} = \Delta_{ij}^{(l)} + a_{j}^{(l)} \delta_{i}^{(l+1)} \]

然後,我們需要除以樣本總數 \(m\),因為上面的誤差是累加了所有 \(m\) 個訓練樣本得到的,並且我們還需要考慮加上正則化防止過擬合,注意對偏置單元不需要正則化,這點已經提過好多次了:

  • 非偏置單元正則化后的偏導數 \(j \neq 0\)

\[D_{ij}^{(l)} = \frac {1}{m}\Delta_{ij}^{(l)}+\lambda W_{ij}^{(l)} \]

  • 偏置單元正則化后的偏導數 \(j = 0\)

\[D_{ij}^{(l)} = \frac{1}{m}\Delta_{ij}^{(l)} \]

最後計算的所有偏導數就放在誤差矩陣中:

\[\frac {\partial}{\partial W_{ij}^{(l)}} J (W) = D_{ij}^{(l)} \]

這樣我們就求出了每個權重參數的偏導數,再回想之前的梯度下降法,我們有了偏導數計算方法后,直接送到梯度下降法中進行迭代就可以最小化代價函數了,比如我在 Python 中把上面的邏輯寫成一個正則化梯度計算的函數 regularized_gradient,然後再用 scipy.optimize 等優化庫直接最小化文章開頭提出的神經網絡代價函數,以此來使用反向 BP 算法訓練一個神經網絡:

import scipy.optimize as opt

res = opt.minimize(fun = 神經網絡代價函數,
                       x0 = init_theta,
                       args = (X, y, 1),
                       method = 'TNC',
                       jac = regularized_gradient,
                       options = {'maxiter': 400})

所以神經網絡反向 BP 算法關鍵就是理解每個權重參數偏導數的計算步驟和方法!關於偏導數計算公式的詳細推導過程,我打算在下一篇文章中單獨分享,本次就不帶大家一步步推導了,否則內容太多,先把基本步驟搞清楚,後面推導公式就容易理解。

2.3 反向 BP 算法的直觀理解

之前學習前饋預測時,我們知道一個激活單元是輸入是上一層所有激活單元的輸出與權重的加權和(包含偏置),計算方向從左到右,計算的是每個激活單元的輸出,看圖:

其實反向 BP 算法也是做類似的計算,一個激活單元誤差的輸入是后一層所有誤差與權重的加權和(可能不包含偏置),只不過這裏計算的反向是從右向左,計算的是每個激活單元的誤差,對比看圖:

你只需要把單個神經元的前饋預測和反向 BP 的計算步驟搞清楚就可以基本理解反向 BP 的基本過程,因為所有的參數都是這樣做的。

三、神經網絡編程細節

3.1 隨機初始化

每種優化算法都需要初始化參數,之前的線性回歸初始化參數為 0 是沒問題的,但是如果把神經網絡的初始參數都設置為 0,就會有問題,因為第二層的輸入是要用到權重與激活單元輸出的乘積:

  • 如果權重都是 0,則每層網絡的輸出都是 0
  • 如果權重都是相同的常數 \(a\),則每層網絡的輸出也都相同,只是不為 0

所以為了在神經網絡中避免以上的問題,我們採用隨機初始化,把所有的參數初始化為 \([-\epsilon, \epsilon]\) 之間的隨機值,比如初始化一個 10 X 11 的權重參數矩陣:

\[initheta = rand(10, 11) * (2 * \epsilon) – \epsilon \]

3.2 矩陣 <-> 向量

注意上面優化庫的輸入 X0 = init_theta 是一個向量,而我們的神經網絡每 2 層之間就有一個權重矩陣,所以為了把權重矩陣作為優化庫的輸入,我們必須要把所有的權重參數都組合到一個向量中,也就是實現一個把矩陣組合到向量的功能,但是優化庫的輸出也是一個包含所有權重參數的向量,我們拿到向量后還需要把它轉換為每 2 層之間的權重矩陣,這樣才能進行前饋預測:

  • 訓練前:初始多個權重矩陣 -> 一個初始向量
  • 訓練后:一個最優向量 -> 多個最優權重矩陣

3.3 梯度校驗

梯度校驗是用來檢驗我們的 BP 算法計算的偏導數是否和真實的偏導數存在較大誤差,計算以下 2 個偏導數向量的誤差:

  • 反向 BP 算法計算的偏導數
  • 利用導數定義計算的偏導數

對於單個參數,在一點 \(\theta\) 處的導數可由 \([\theta – \epsilon, \theta + \epsilon]\) 表示,這也是導數定義的一種:

\[grad = \frac{J(\theta + \epsilon) – J(\theta – \epsilon)}{2 \epsilon} \]

如圖:

但是我們的神經網絡代價函數有很多參數,當我們把參數矩陣轉為向量后,可以對向量里的每個參數進行梯度檢驗,只需要分別用定義求偏導數即可,比如檢驗 \(\theta_1\)

\[\frac {\partial J}{\partial \theta_1} = \frac {J (\theta_1 + \varepsilon_1, \theta_2, \theta_3 … \theta_n ) – J(\theta_1 – \varepsilon_1, \theta_2, \theta_3 … \theta_n)}{2 \varepsilon} \]

以此類推,檢驗 \(\theta_n\)

\[\frac {\partial J}{\partial \theta_n} = \frac {J (\theta_1, \theta_2, \theta_3 … \theta_n + \varepsilon_n) – J(\theta_1, \theta_2, \theta_3 … \theta_n – \varepsilon_n)}{2 \varepsilon} \]

求出導數定義的偏導數后,與 BP 算法計算的偏導數計算誤差,在誤差範圍內認為 BP 算法計算的偏導數(D_vec)是正確的,梯度檢驗的偽代碼如下:

for i = 1 : n
  theta_plus = theta
  theta_plus[i] = theta_plus + epsilon
  
  theta_minu = theta
  theta_minu[i] = theta_minu - epsilon
  
  grad = (J(theta_plus) - J(theta_minu)) / (2 * epsilon)
end

check 誤差: grad 是否約等於 D_vec

注意一點:梯度檢驗通常速度很慢,在訓練神經網絡前先別進行檢驗!

今天就到這,溜了溜了,下篇文章見:)

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※回頭車貨運收費標準

容器技術之Docker-machine

  前文我們聊了下docker容器的資源限制,回顧請參考https://www.cnblogs.com/qiuhom-1874/p/13138725.html;今天我們來聊一聊docker machine;docker machine是docker 官方提供的工具,這個工具可以在不同主機/不同系統上快速安裝、管理docker環境;docker machine 的實現原理就是通過不同的驅動來連接不同類型節點,來實現docker machine管理不同平台上的docker環境;

  docker machine 安裝

  1、下載二進製程序文件到本地

[root@node1 ~]# base=https://github.com/docker/machine/releases/download/v0.16.0 &&
>   curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine &&
>   sudo mv /tmp/docker-machine /usr/local/bin/docker-machine &&
>   chmod +x /usr/local/bin/docker-machine
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   638  100   638    0     0    590      0  0:00:01  0:00:01 --:--:--   590
100 26.8M  100 26.8M    0     0  11911      0  0:39:24  0:39:24 --:--:-- 16907
[root@node1 ~]# ll /usr/local/bin/docker-machine 
-rwxr-xr-x 1 root root 28164576 Jun 18 11:28 /usr/local/bin/docker-machine
[root@node1 ~]# docker-machine version
docker-machine version 0.16.0, build 702c267f
[root@node1 ~]# 

  提示:以上命令主要就做了三件事,下載對應系統的對應系統架構的docker-machine到本地/tmp/下,並保存為docker-machine;然後把/tmp/docker-machine移動至/usr/local/bin/下,然後給/usr/local/bin/docker-machine添加執行權限;如果下載完我們可以在終端運行docker-machine version 能夠看到對應的版本信息,就表示docker-machine安裝好了;docker-machine程序是安裝好了,現在我們還不能直接使用;我們上面說過docker-machine本質就是通過不同的驅動去連接節點,連接節點實際上就是通過ssh鏈到節點服務器上,然後執行安裝docker;所以為了能夠很好的使用docker-machine 我們需要對管理的節點做免密登錄;

  2、管理節點對work節點做免密登錄

[root@node1 ~]# ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
/root/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:4HrdVnoO+W/+J/ewP4A1m8HnneKWAKMKo3Ad2uExJ1k root@node1
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|      E          |
|     o.     .    |
|    B... o   = . |
|   = B. S o + B o|
|. oo+. o . * = o.|
|... + o . * + =  |
| .   o   . = +o+o|
|            +++=B|
+----[SHA256]-----+
[root@node1 ~]# ssh-copy-id root@192.168.0.42
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.0.42 (192.168.0.42)' can't be established.
ECDSA key fingerprint is SHA256:EG9nua4JJuUeofheXlgQeL9hX5H53JynOqf2vf53mII.
ECDSA key fingerprint is MD5:57:83:e6:46:2c:4b:bb:33:13:56:17:f7:fd:76:71:cc.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.0.42's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@192.168.0.42'"
and check to make sure that only the key(s) you wanted were added.

[root@node1 ~]# ssh-copy-id root@192.168.0.43
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.0.43 (192.168.0.43)' can't be established.
ECDSA key fingerprint is SHA256:EG9nua4JJuUeofheXlgQeL9hX5H53JynOqf2vf53mII.
ECDSA key fingerprint is MD5:57:83:e6:46:2c:4b:bb:33:13:56:17:f7:fd:76:71:cc.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.0.43's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@192.168.0.43'"
and check to make sure that only the key(s) you wanted were added.

[root@node1 ~]

  提示:有關免密登錄的詳細說明可以參考本人博客https://www.cnblogs.com/qiuhom-1874/p/11783371.html;接下來我們就可以使用docker-machine來對節點主機進行操作了;

  對節點主機安裝docker環境

  提示:以上命令表示創建一個docker-machine主機,使用generic驅動,generic表示對linux主機,如果是windows需要用到–virtualbox;–generic-ip-address表示指定節點主機的ip地址;然後在給上一名稱;從上面的信息可以看到,docker-node01這台machine已經啟動,它告訴我們要查看怎麼連接docker-node01這台虛擬主機,請運行docker-machine env docker-node01 查看;

  查看怎麼連接docker-node01這台虛擬主機

  提示:它告訴我們運行下面的命令可以配置我們的shell

  提示:從上面的信息可以看到我們運行 eval $(docker-machine env docker-node01)這條命令就表示把環境切換到docker-node01上;接下來的操作都會發送到docker node01上;

 

  提示:從上面的信息可以看到,當我們使用eval $(docker-machine env docker-node01)把當前環境切換到docker-node01后,在當前終端運行的容器和下載的鏡像,在退出當前終端重新登錄后,本地的是沒有nginx鏡像的;這意味着我們切換環境后,運行容器的操作上發送給docker-node01上執行了;

  測試:我們登錄到docker-node01看看是否有nginx鏡像和n1容器?

  提示:用docker-machine創建虛擬主機來對節點主機管理時,我們給定虛擬主機的名稱docker-machine會把該名稱當作主機名,把節點主機的主機名更改為我們指定的名稱;從上面的信息可以看到docker-node01這台主機上有nginx鏡像和n1容器;這說明我們剛才的操作都是發送給docker-node01上了;從上面的演示可以看到,我們在docker-machine上切換環境,當前shell並不能反映我們是否切換到對應的環境了;這樣一來在主機特別多的情況,很容易出錯;接下來我們配置當前shell的PS1的環境變量;

  下載docker-machine-wrapper.bash、docker-machine-prompt.bash和docker-machine.bash

[root@node01 ~]# cat /etc/bash_completion.d/down.bash
base=https://raw.githubusercontent.com/docker/machine/v0.16.0
for i in docker-machine-prompt.bash docker-machine-wrapper.bash docker-machine.bash
do
  sudo wget "$base/contrib/completion/bash/${i}" -P /etc/bash_completion.d
done
[root@node01 ~]# 

  提示:以上腳本主要是循環下載上面說的三個腳本;執行該腳本直接有source命令即可;

  提示:我們用source命令來執行上面的腳本,提示我們連接拒絕;這是因為沒有解析到raw.githubusercontent.com的地址造成的;解決辦法在/etc/hosts文件中介入raw.githubusercontent.com的解析地址即可;https://site.ip138.com/raw.githubusercontent.com/;這個網站可以查詢到raw.githubusercontent.com的地址;

  提示:更改/etc/hosts文件后,接下在用source命令執行上面的腳本就不會提示我們鏈接拒絕了;

  提示:可以看到/etc/bash_completion.d/目錄下有我們要的腳本了;接下來我們就需要配置當前用戶的PS1環境的值;

  提示:以上信息表示導入上面的三個腳本到當前登錄用戶的終端;配置好以上.bashrc后,我們在來切換環境,當前shell就不一樣了;

  提示:導入了docker-machine-wrapper.bash、docker-machine-prompt.bash和docker-machine.bash這三個腳本配合現在新定義的PS1變量,我們切換環境就很容易的辨識,我們操作的node節點主機是那一台;退出當前環境,直接使用exit即可;

  到此docker-machine的環境就搭建好了;接下我們再來說說docker-machine的常用命令使用和說明

  docker-machine active:查看當前激活狀態的docker主機

[root@node01 ~]# docker-machine active
docker-node01
[root@node01 ~]#

  提示:所謂激活狀態的docker主機就是指的當前的DOCKER_HOST環境變量所指向的主機;

  docker-machine ls:列出所有管理的主機

[root@node01 ~]# docker-machine ls
NAME            ACTIVE   DRIVER    STATE     URL                       SWARM   DOCKER      ERRORS
docker-node01   *        generic   Running   tcp://192.168.0.42:2376           v19.03.11   
docker-node02   -        generic   Running   tcp://192.168.0.43:2376           v19.03.11   
[root@node01 ~]# 

  docker-machine config:查看激活的docker主機的連接信息;

[root@node01 ~]# docker-machine config docker-node01
--tlsverify
--tlscacert="/root/.docker/machine/machines/docker-node01/ca.pem"
--tlscert="/root/.docker/machine/machines/docker-node01/cert.pem"
--tlskey="/root/.docker/machine/machines/docker-node01/key.pem"
-H=tcp://192.168.0.42:2376
[root@node01 ~]# 

  docker-machine inspect :以json格式輸出指定docker主機的詳細信息

[root@node01 ~]# docker-machine inspect docker-node01
{
    "ConfigVersion": 3,
    "Driver": {
        "IPAddress": "192.168.0.42",
        "MachineName": "docker-node01",
        "SSHUser": "root",
        "SSHPort": 22,
        "SSHKeyPath": "",
        "StorePath": "/root/.docker/machine",
        "SwarmMaster": false,
        "SwarmHost": "",
        "SwarmDiscovery": "",
        "EnginePort": 2376,
        "SSHKey": ""
    },
    "DriverName": "generic",
    "HostOptions": {
        "Driver": "",
        "Memory": 0,
        "Disk": 0,
        "EngineOptions": {
            "ArbitraryFlags": [],
            "Dns": null,
            "GraphDir": "",
            "Env": [],
            "Ipv6": false,
            "InsecureRegistry": [],
            "Labels": [],
            "LogLevel": "",
            "StorageDriver": "",
            "SelinuxEnabled": false,
            "TlsVerify": true,
            "RegistryMirror": [],
            "InstallURL": "https://get.docker.com"
        },
        "SwarmOptions": {
            "IsSwarm": false,
            "Address": "",
            "Discovery": "",
            "Agent": false,
            "Master": false,
            "Host": "tcp://0.0.0.0:3376",
            "Image": "swarm:latest",
            "Strategy": "spread",
            "Heartbeat": 0,
            "Overcommit": 0,
            "ArbitraryFlags": [],
            "ArbitraryJoinFlags": [],
            "Env": null,
            "IsExperimental": false
        },
        "AuthOptions": {
            "CertDir": "/root/.docker/machine/certs",
            "CaCertPath": "/root/.docker/machine/certs/ca.pem",
            "CaPrivateKeyPath": "/root/.docker/machine/certs/ca-key.pem",
            "CaCertRemotePath": "",
            "ServerCertPath": "/root/.docker/machine/machines/docker-node01/server.pem",
            "ServerKeyPath": "/root/.docker/machine/machines/docker-node01/server-key.pem",
            "ClientKeyPath": "/root/.docker/machine/certs/key.pem",
            "ServerCertRemotePath": "",
            "ServerKeyRemotePath": "",
            "ClientCertPath": "/root/.docker/machine/certs/cert.pem",
            "ServerCertSANs": [],
            "StorePath": "/root/.docker/machine/machines/docker-node01"
        }
    },
    "Name": "docker-node01"
}
[root@node01 ~]# 

  提示:以上命令也支持-f選項來指定格式,用法同docker image/container inspect 類似;

[root@node01 ~]# docker-machine inspect -f {{.HostOptions.AuthOptions.StorePath}} docker-node01
/root/.docker/machine/machines/docker-node01
[root@node01 ~]# docker-machine inspect -f {{.DriverName}} docker-node01                                      
generic
[root@node01 ~]# 

  docker-machine ip :獲取指定docker主機的ip地址

[root@node01 ~]# docker-machine ip docker-node01
192.168.0.42
[root@node01 ~]# docker-machine ip docker-node02
192.168.0.43
[root@node01 ~]# 

  docker-machine ssh :連接指定docker執行命令

[root@node01 ~]# docker-machine ssh docker-node01 "ip a"
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:91:99:30 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.42/24 brd 192.168.0.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe91:9930/64 scope link 
       valid_lft forever preferred_lft forever
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:0f:e1:e0:f7 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:fff:fee1:e0f7/64 scope link 
       valid_lft forever preferred_lft forever
[root@node01 ~]# 

  docker-machine scp:在docker主機間以及docker主機和本地之間通過scp命令來遠程複製文件

[root@node01 ~]# echo "this is test file" > /tmp/test.txt
[root@node01 ~]# cat /tmp/test.txt
this is test file
[root@node01 ~]# docker-machine scp /tmp/test.txt docker-node01:/root/
test.txt                                                                                                                                 100%   18     5.4KB/s   00:00    
[root@node01 ~]# docker-machine ssh docker-node01 "ls -l /root/"
total 4
-rw-r--r-- 1 root root 18 Jun 19 11:26 test.txt
[root@node01 ~]# docker-machine ssh docker-node01 "cat /root/test.txt"
this is test file
[root@node01 ~]# 

  提示:同scp命令用法類似;

  docker-machine rm:刪除指定名稱的docker主機對應的虛擬主機;

[root@node01 ~]# docker-machine ls
NAME            ACTIVE   DRIVER    STATE     URL                       SWARM   DOCKER      ERRORS
docker-node01   *        generic   Running   tcp://192.168.0.42:2376           v19.03.11   
docker-node02   -        generic   Running   tcp://192.168.0.43:2376           v19.03.11   
[root@node01 ~]# docker-machine rm docker-node02
About to remove docker-node02
WARNING: This action will delete both local reference and remote instance.
Are you sure? (y/n): y
Successfully removed docker-node02
[root@node01 ~]# docker-machine ls
NAME            ACTIVE   DRIVER    STATE     URL                       SWARM   DOCKER      ERRORS
docker-node01   *        generic   Running   tcp://192.168.0.42:2376           v19.03.11   
[root@node01 ~]# 

  提示:docker-machine rm 只是刪除docker-machine上的虛擬主機,對於真正的物理節點上的docker環境並沒有刪除;實際上就切斷對指定docker主機的管控;

  docker-machine upgrade:將指定主機的docker版本更新為最新

[root@node01 ~]# docker-machine upgrade docker-node01
Waiting for SSH to be available...
Detecting the provisioner...
Upgrading docker...
Restarting docker...
[root@node01 ~]# docker-machine ls
NAME            ACTIVE   DRIVER    STATE     URL                       SWARM   DOCKER      ERRORS
docker-node01   *        generic   Running   tcp://192.168.0.42:2376           v19.03.11   
[root@node01 ~]# 

  提示:如果指定docker主機的版本已經是最新的版本,那麼它將不會再更新;

  docker-machine url:獲取指定主機監聽URL

[root@node01 ~]# docker-machine url docker-node01
tcp://192.168.0.42:2376
[root@node01 ~]# 

  提示:通過docker-machine安裝的docker環境,實際上就是把yum安裝的docker環境,客戶端和服務端分離了,各個節點就是各個服務端,而docker-machine就是同一的客戶端,因為客戶端和服務端不再同一主機,所以它會把docker監聽在一個TCP端口上,方便客戶端的來連接管理;

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

※教你寫出一流的銷售文案?

一文讀懂:防止過擬合的所有方法

什麼是過擬合

過擬合就是在訓練集上表現得非常好,在測試集上表現得不好。也就是我們俗稱的泛化能力弱

過擬合無法避免,只能緩解,那麼如何緩解呢?方法太多了。這篇文章一一介紹。

數據集增強Augmentation

圖像上,翻轉,平移,縮放,旋轉,鏡像,增強對比度,增強亮度等諸多方式。
我在下面的內容中介紹了圖像處理的圖像增強的方法:
【預處理庫函數】albumentations庫的簡單了解和使用

Early Stopping

訓練模型的時候,訓練誤差往往是不斷下降的,但是驗證數據集的誤差,是先下降後上升。 兩個數據集的誤差出現分歧的時候,說明模型開始過擬合了。所以Early Stopping就是當驗證數據集的誤差不在下降的時候,結束訓練,保存模型參數。

正則化regularization

L1正則:模型中只有少部分特徵對模型的泛化能力有貢獻,所以L1就是限制模型中非零參數的數量。讓大部分的模型參數都是0,只有真正對泛化能力其作用的參數才是非零的。

L2正則:我們希望模型找到的極小值是平坦的,為什麼呢?

圖中表示的意思,就是平坦的極小值,可以有更多的容忍,容忍什麼呢?容忍訓練數據集和測試數據集之前的分佈偏差。現在,如果模型的某些參數特別大,那麼就算輸入的樣本只有很小的區別,但是經過特別大的參數之後,模型給出的結果很可能是非常不同的。這就是太陡峭。所以L2正則就是限制模型參數的大小。參數的平方的和作為損失的一部分,當參數數值越大,那麼梯度下降的損失越大,就會強迫參數變小。

這裡有兩幅圖:

這一幅圖體現的是假設只有兩個參數的情況下,增加L1正則的情況。圓圈圈體現的是損失等值線,方框是L1正則的損失。假設沒有L1正則,那麼參數應該收斂到最小的那個圓圈中的。但是因為增加了L1正則,所以需要權衡兩個部分的損失,然後找到接觸的交點位置。因為圓形和矩形在矩形的頂點相交的可能性大,而矩形的頂點就是某一個參數為0的情況。所以L1正則會讓模型參數有更大的可能性為0.
【在更多參數的模型中,會有更多的頂點。不過二維圖像就畫不出來了】

這個是L2正則的示意圖。L2正則式一個原型因為是參數的平方和。相比L1的(0,1)這樣的交點,L2更希望每一個參數都普遍較小,不希望某一個參數特別大。

Dropout

這個就是神經網絡中,在全連接網絡中經常用到的。

在每一個Batch數據訓練的時候,Dropout層按照概率P隨機讓一些神經元失活,然後保留下來的神經元的參數被更新。dropout是只有在訓練的時候才使用的,在測試的時候並不適用。

我個人理解的dropout其實就相當於一個多模型融合的過程。因為每一次都會失活一部分的神經元,所以每一次的模型都是不那麼一樣的,相當於不同的模型吧。

增加噪音

輸入中增加噪音

輸入中有噪音\(\epsilon\),那麼輸出中就會有一個類似於\(\epsilon \omega\),這樣的損失項。 從而限制權值的大小。

當然這樣也可以增加模型對輸入的容忍度,我覺得也可以理解為一種數據增強。 去噪自編碼器DAE就是利用這樣的方法的。

權值中加噪音

這個用的不多,在初始化網絡的時候,用0均值的高斯分佈作為參數的初始化。

集成

集成主要是bagging,boosting,之前說的dropout我覺得也可以算作集成的方法

bagging

將數據集抽取一部分,比如抽取70%的樣本,然後用這些樣本去訓練一個模型。然後再從數據集中抽取70%的樣本,再訓練一個新的。典型的就是隨機森林。
【神經網絡因為訓練速度的問題,所以一般不用這樣的方法。決策樹lgb啥的可以用】

boosting

訓練複雜神經網絡比較慢,所以可以通過訓練多個簡單的分類器,然後加權平均每一個分類器的輸出。這就是Boost的思想。【這句話給我背下來!】

之後整理一下Adaboost和XGBoost的這些算法。

其他

  • 限制網絡的層數和複雜度

**END**

喜歡的話請關注我們的微信公眾號~《你好世界煉丹師》或者知乎【你好世界煉丹師】。

  • 公眾號主要講統計學,數據科學,機器學習,深度學習,以及一些參加Kaggle競賽的經驗。
  • 公眾號內容建議作為課後的一些相關知識的補充,飯後甜點。
  • 此外,為了不過多打擾,公眾號每周推送一次,每次4~6篇精選文章。

微信搜索公眾號:你好世界煉丹師。期待您的關注。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※回頭車貨運收費標準