自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何用深度學習將前端設計模型自動轉換為代碼?

人工智能 深度學習 前端
目前,自動化前端開發(fā)的最大障礙是計算能力。不過,我們可以使用當前的深度學習算法和人造的訓練數據來探索人工前端自動化。在這篇文章中,我們將教會一個神經網絡如何基于一張設計原型圖片來編寫基本的 HTML 和 CSS 代碼。

[[223504]]

目前,自動化前端開發(fā)的最大障礙是計算能力。不過,我們可以使用當前的深度學習算法和人造的訓練數據來探索人工前端自動化。

在這篇文章中,我們將教會一個神經網絡如何基于一張設計原型圖片來編寫基本的 HTML 和 CSS 代碼。以下是該過程的簡要概述:

1)為神經網絡提供的設計圖

2)神經網絡將圖片轉化成 HTML 代碼

3)渲染輸出

我們將通過三次迭代來構建神經網絡。

第一次迭代得到的是最基礎的版本,先了解圖樣中的活動部件。第二次迭代得到的是 HTML 代碼,將著重于自動化所有步驟,并解釋神經網絡層。最后一次迭代得到的是 bootstrap 版本,我們將創(chuàng)建一個模型可用于泛化和探索 LSTM 層。

所有的代碼都放在了 Github 和 FloydHub 上。

這些模型是基于 Beltramelli 的 pix2code 論文和 Jason Brownlee 的圖像自然語言描述教程而構建的,代碼使用 Python 和 Keras(一個基于 Tensorflow 的框架)編寫。

如果你是剛接觸深度學習的新手,建議你先大概了解下 Python,反向傳播和卷積神經網絡。

 

核心邏輯   

 

 

讓我們再簡明扼要地復述下我們的目標。我們想構建一個神經網絡,生成與屏幕截圖對應的 HTML/CSS 代碼。

在訓練神經網絡時,你可以給它幾個截圖和與之對應的 HTML 代碼。

在學習過程中,它會逐一預測所有匹配的 HTML 標簽。在預測下一個標簽時,它會接收到屏幕截圖以及在那一個點上所有匹配的標簽。

這個 Google Sheet 包含了一個簡單的訓練數據樣本。

創(chuàng)建一個能夠逐字預測的模型是現在最常見的方式,也是我們在這個教程中將會使用的方式,雖然還有其他的方式。

請注意,對于每次預測,神經網絡得到的都是相同的截圖。也就是說,如果要預測 20 個單詞的話,它將會收到相同的圖樣 20 次。在現在這個階段,請不要擔心神經網絡的工作原理,而是著重關注神經網絡的輸入輸出。

讓我們看下之前的標簽。假設我們要訓練網絡來預測“I can code”這句話。當它收到“I”的時候,它能預測到“can”。下一次,它將收到“I can”,并且預測到“code”。每次它會收到之前所有的單詞,并且只需預測接下來的一個單詞。

A

神經網絡從數據中創(chuàng)建出不同的特征,用于連接輸入和輸出數據,創(chuàng)建模型,以便理解每張截圖中所包含的內容和 HTML 語法,這就得到了預測下一個標簽所需要的知識。

在將訓練過的模型用在現實當中時,情況跟訓練模型時差不多。每次使用相同的屏幕截圖逐一生成文本。不同的是,現在它不會直接收到正確的 HTML 標簽,而是會收到它迄今為止已經生成的標簽,然后去預測下一個標簽。整個預測的過程會從“起始標簽”開始,在預測到“結束標簽”或達到最大限度時終止。

 

 

Hello World

 

 

讓我們開始構建一個 Hello World 的版本。我們將為神經網絡提供一個顯示有“Hello World!”的網頁截圖,并且訓練它生成對應的標簽。

首先,神經網絡將圖樣映射成一組像素值列表。每個像素點有 RGB 三個通道,每個通道的值都在 0-255 之間。

為了讓神經網絡理解這些標記,我使用了獨熱編碼(one hot encoding)。因此“I can code”這一句就可以映射成:

上圖中包含了開始和結束標簽。這些標簽控制著神經網絡預測的開始和結束時間。

對于輸入數據,我們將用不同的句子,從第一個單詞開始,然后逐步添加每個單詞。輸出的數據總是一個單詞。

句子遵循與單詞相同的邏輯。它們也需要相同的輸入長度,但是在這里我們限制的是句子最大的長度,而不是單詞的數量。如果句子比最大長度短,則用空詞填充它,空詞完全由零組成。

正如所看到的,單詞都是從右向左打印出來的。這樣的話,每次訓練都會迫使每個單詞改變自己的位置,這樣模型就可以記住單詞順序而不是每個單詞的位置。

在下圖中有四次預測,每一行表示一次預測。從左邊起,是以 RGB 通道表示的圖像:紅色、綠色和藍色,還有之前提到過的單詞。括號之外,是一個接一個的預測,最后以紅色方塊結束。

在 Hello World 版本中,我們用了三個記號:“start”、“Hello World!”和“end”。記號可以是任何東西,它可以是一個字符、單詞或句子。雖然使用字符記號需要更少的詞匯量,但會限制神經網絡。單詞記號往往有最好的表現。

這里我們做出了預測:

 

 

輸出

 

 

 

  • 10 epochs:start start start

  • 100 epochs: start <HTML><center><H1>Hello World!</H1></center></HTML> <HTML><center><H1>Hello World!</H1></center></HTML>

  • 300 epochs: start <HTML><center><H1>Hello World!</H1></center></HTML> end

 

 

我掉過的坑:

 

 

  • 在收集數據之前構建了第一個版本。 在這個項目的早期,我想辦法從 Geocities 網站獲得了一個舊的存檔副本,其中包含 3800 萬多個網站。不過,當時我被數據沖昏了頭腦,卻忽視了縮減 100K 詞匯所需要的巨大工作量。

  • 處理 TB 級的數據需要很好的硬件或者極大的耐心。 在用我的 Mac 電腦運行出現了幾次問題以后,最后選擇了功能強大的遠程服務器。為了保持工作的順暢,預計我將會租用包含 8 核 CPU 和一個 1GPS 網絡連接的遠程測試機組。

  • 在我明白輸入和輸出之前,很多東西都說不通。 輸入 X 是屏幕截圖和之前已經預測的標簽,輸出 Y 是下一個要預測標簽。當我明白這個以后,理解它們之間的關系就更容易了,而且構建不同的構架也更容易了。

  • 小心兔子洞陷阱。 因為這個項目跟深度學習的很多領域都有交叉,在研究的過程中我好多次都陷入對其他領域的研究中。我花了一周的時間從頭開始編寫 RNN,過度著迷于向量空間,又被其他的實現所迷惑。

  • 圖片到編碼網絡其實就是 Image Caption 模型。 但即使我已經意識到了這點,我仍然忽略了很多有關 Image Caption 的論文,只是因為覺得它們沒有那么酷。當我發(fā)現到這點后,我加快了對問題的了解。

 

在 Floydhub 平臺上運行代碼 

 

Floydhub 是一個深度學習訓練平臺。在我剛開始接觸深度學習時,才知道有這個平臺。從那以后,我都在用它來訓練和管理深度學習試驗。你可以在 10 分鐘內安裝它并且運行你的第一個模型。這是在云端 GPU 上訓練模型的最佳選擇。

如果你是剛接觸 Floydhub,推薦你去看下他們的 2 分鐘安裝教程和我的 5 分鐘概覽教程。

復制倉庫: 

登錄并啟動 FloydHub 命令行工具: 

在 FloydHub 的云 GPU 機器上運行 Jupyter notebook: 

所有的 notebook 都在 FloydHub 目錄中準備好了。運行起來之后,你可以在這里找到第一個 notebook:floydhub/Helloworld/helloworld.ipynb。

如果想要更多詳細的指導和標記說明,請參閱我早期寫的文章。

 

HTML 版本

 

 

在這個版本中,我們將會自動化 Hello world 中的很多步驟。這一章節(jié)將主要關注如何創(chuàng)建一個可伸縮的實現和神經網絡中的動態(tài)部分。

雖然這個版本還無法基于隨機網站來預測 HTML,但它仍然很適合用于對問題的動態(tài)部分進行探索。

 

 

 

 

概覽

 

 

下圖所示的是構架組件展開后的樣子。

主要有兩個部分,編碼器和解碼器。編碼器用于創(chuàng)建圖像特征和標簽特征。特征是由網絡創(chuàng)建用來連接圖樣和標簽的基本構建塊。在編碼的最后階段,我們將圖像特征和前一個標簽中的單詞關聯起來。

然后解碼器通過圖樣和標簽特征的組合來創(chuàng)建下一個標簽特征,而這個特征則會通過全連接神經網絡來預測下一個標簽。

 

 

 圖樣的特征

 

 

因為我們需要為每一個單詞插入一個截圖,這就成了我們訓練網絡時的一個瓶頸(例子)。因此,我們沒有直接使用圖片,而是將生成標簽所需要的信息提取出來。

之后,我們用一個預先在 ImageNet 上預先訓練的卷積神經網絡,將這些提取出來的信息編碼到圖片特征中。

在最終分類之前,我們將特征從層中提取出來。

最終,我們得到了 1536 張 8×8 像素的圖像作為特征圖。盡管這些特征很難被人理解,但是神經網絡可以從這些特征中抽取出對象和元素的位置。

 

 

 標簽特征

 

在 Hello World 的版本中,我們使用了獨熱編碼來代表標簽。而在這個版本中,我們將在輸入中使用詞向量(word embedding),并繼續(xù)使用獨熱編碼表示輸出。

在保持每個句子的構造方式不變的情況下,改變映射記號的方法。獨熱編碼將每個單詞視為一個獨立的單元。但在這里,我們將輸入數據中的每個單詞轉換為數值列表。這些數值代表了不同標簽之間的關系。

 

詞向量的維度是 8,但受詞匯量大小的影響,維度經常會在 50 到 500 之間變化。

每個單詞的 8 個數字類似于一般神經網絡中的權重,用于映射不同單詞之間的關系。

神經網絡可以用這些特征來連接輸入數據與輸出數據?,F在,先不要關心它們是什么,我們將在下一節(jié)深入探討這個問題。

 

 

編碼器

 

我們把詞向量送到 LSTM 中運行,之后會返回一系列的標簽特征。這些標簽特征然后會被送到 TimeDistributed 密集層運行。

在處理詞向量的同時,還會進行另一個處理。圖像特征首先會被扁平化,所有的數值會被轉換成一個數字列表。然后我們在這個層上應用一個密集層來抽取高級特征,隨后這些圖像特征會被連接到標簽特征。

這可能有點難以理解,所以讓我們把處理的過程拆開來看。

 

 

 

 標簽特征

 

 

我們先將詞向量送到 LSTM 層中運行。如下圖所示,所有的句子都會被填充到三個記號的最大長度。

 

為了混合信號并找到更高級別的模式,我們會用 TimeDistributed 密集層應用在標簽特征上。TimeDistributed 密集層與一般的密集層相同,只不過具有多個輸入和輸出。

 

 

 圖像特征

 

與此同時,我們會準備圖像。我們整理了所有迷你圖像特征,然后將它們轉換成一組列表。其中的信息沒有變,只是組織方式變了。

 

跟之前提過的一樣,為了混合信號和提取更高級的概念,我們應用了一個密集層。 而且由于我們只需要處理一個輸入值,所以我們可以用一個常規(guī)密集層。其后,為了將圖像特征連接到標簽特征,我們復制了圖像特征。

在這種情況下,我們就有三個標簽特征。因此,我們得到了相同數量的圖像特征和標簽特征。

 

 

 

 連接圖像特征和標簽特征

 

所有的句子都經過填充,以便創(chuàng)建三個標簽特征。由于我們已經預處理過了圖像特征,現在我們可以為每個標簽特征添加一個圖像特征。

 

在將每個圖像特征添加到對應的標簽特征之后,我們最終得到了三組圖像標簽特征組合。之后,我們將它們作為解碼器的輸入。

 

 

解碼器

 

 

這里,我們使用圖像標簽特征組合來預測下一個標簽。

 

在下面的例子中,我們使用三個圖像標簽特征組合來輸出下一個標簽特征。

請注意,這里 LSTM 層的 sequence 被設置為 false。由此,LSTM 層返回的是一個預測的特征,而不是輸入序列的長度。在我們的例子中,這將是下一個標簽的特征,包含了最終預測所需的信息。

 

最終的預測

密集層像傳統前饋神經網絡那樣,將下一個標簽特征中的 512 個值與 4 個最終預測連接起來。假設我們的詞匯表中有四個詞:start、hello、world 和 end。

詞匯預測可以是 [0.1,0.1,0.1,0.7]。密集層中的 softmax 激活函數分布概率是 0 到 1,所有預測的總和等于 1。在這種情況下,它預測第 4 個單詞會是下一個標簽。 然后,將獨熱編碼 [0,0,0,1] 轉換為映射值,比如“end”。

 

 

 

 

 

 輸出 

 

這里有原始網站供參考。

 

 

 

 我掉過的坑:

 

對我來說,LSTM 比 CNN 更難理解。當我展開所有的 LSTM 后,它們變得更容易理解。Fast.ai 在 RNN 上的視頻非常有用。另外,在嘗試了解特征的原理之前,請先關注輸入特征和輸出特征本身。從頭開始構建詞匯表比縮減巨大的詞匯表要容易的多。包括字體、div 標簽大小、hex 顏色值、變量名稱和普通的單詞。大多數庫被創(chuàng)建來解析文本文件而不是代碼。在文檔中,所有內容都由空格分隔,但在代碼中,則需要使用自定義的解析方式??梢允褂迷?ImageNet 上訓練的模型來提取特征。這可能看起來違反直覺,因為 ImageNet 幾乎沒有 Web 圖像。然而,與從頭開始訓練的 pix2code 模型相比,這樣做的損失要高出 30%。當然,我也對使用基于網頁截圖的預訓練的 inception-resnet 類型的模型很感興趣。

 

 

 

Bootstrap 版本

 

 

在我們的最終版本中,我們將使用 pix2code 論文中生成的 Bootstrap 網站的一個數據集。通過使用 Twitter 的 Bootstrap,我們可以將 HTML 和 CSS 相結合,并且縮減詞匯表的大小。

我們將確保它能夠為之前沒有看過的截圖生成標簽,還將深入研究它是如何建立對屏幕截圖和標簽的認知的。

我們將使用 17 個簡化過的記號,然后將這些記號轉成 HTML 和 CSS,而不是在 Bootstrap 標簽上進行訓練。這個數據集包括 1500 個測試截圖和 250 幅驗證圖像。每個截圖平均有 65 個記號,總共將生成 96925 個訓練樣本。

通過對 pix2code 論文中的模型做了一些調整,該模型可以以 97%的準確度預測網頁組件(BLEU 4-ngram 貪心搜索,稍后會介紹更多)。

 

一種端到端的方法

在 Image Caption 模型中,從預訓練好的模型中提取特征的效果很好。但經過幾次實驗后,我發(fā)現 pix2code 的端到端方法的效果更好。預訓練的模型尚未用網頁數據訓練過,只是用在分類上。

在這個模型中,我們用輕量級的卷積神經網絡替換了預訓練好的圖像特征。但是我們沒有使用 max-pooling 來增加信息密度,而是增加了步幅,用以維護元素的位置和顏色。

 

這里可以使用卷積神經網絡(CNN)和遞歸神經網絡(RNN)這兩種核心模型。最常見的 RNN 是長短期記憶(LSTM)網絡,也是我將要講的。

我在之前的文章中已經介紹過很多很棒的 CNN 教程了,所以這里我就只重點介紹下 LSTM。

 

 

 

 理解 LSTM 中的時間步

 

LSTM 的難點之一是時間步的概念。原始神經網絡可以被認為有兩個時間步。如果你給它“hello”,它會預測到“world”。但是,想要預測更多的時間步是很困難的。在下面的例子中,輸入四個時間步,每個單詞對應一個。

LSTM 適用于含有時間步的輸入,是一個適合有序信息的神經網絡。如果你展開我們的模型,就會看到像下圖所示的那樣。對于每個向下遞推的步驟,你需要保持同樣的權重。對于舊的輸出和新的輸出,你可以分別設置一套權重。

將加權后的輸入和輸出用激活函數連接在一起,它就是對應時間步的輸出。由于我們重復使用這些權重,它們將從一些輸入中提取信息,并建立起有關序列的知識。

以下是 LSTM 中每個時間步的簡化版本。

 

為了理解這個邏輯,我建議你參考 Andrew Trask 的精彩教程,自己從頭開始構建一個 RNN。

 

 

 理解 LSTM 層中的不同單元

 

每個 LSTM 層的單元(unit)數量決定了它的記憶能力,以及每個輸出特征的大小。需要再次指出的是,一個特征是用于在層與層之間傳輸信息的一長串數字。

LSTM 層中的每個單元會學習跟蹤語法的不同方面。下面是對一個單位跟蹤原始 div 信息的可視化結果,是我們用來訓練 Bootstrap 模型的簡化標簽。

 

每個 LSTM 單元會維護一個細胞狀態(tài)(cell state)。把細胞狀態(tài)想象成記憶,而權重和激活函數用來以不同的方式修改狀態(tài)。這使得 LSTM 層能夠微調每個輸入要保留和丟棄哪些信息。

除了每個輸入傳遞輸出特征之外,LSTM 層還會傳遞細胞狀態(tài),其中每個單元都分別對應一個值。為了理解 LSTM 中的組件是如何相互作用的,我推薦 Colah 的教程、Jayasiri 的 Numpy 實現以及 Karphay 的講座和文章。

   

 

 

 

 測試準確性 

 

找到一個公平的方法來衡量準確性非常困難。假設你選擇逐字比較,那么如果你的預測中有一個字不同步,那么你的準確性就可能會是零。如果你刪掉一個符合預測的單詞,最后的準確性也可能是 99%。

我用的是 BLEU 測評法,這是一種用于機器翻譯和圖像字幕模型的最佳實踐。它按照 1 到 4 個單詞序列把句子分成四個 gram。在下面的預測中的“cat”應該是“code”。

 

為了拿到最終的分數,你需要將得到的數字都乘以 25%,(4/5)*0.25 + (2/4)*0.25 + (1/3)*0.25 + (0/2)*0.25 = 0.2 + 0.125 + 0.083 + 0 = 0.408。求和的結果再乘以句子長度的處罰值。因為我們例子中的句子長度是正確的,所以求和的結果直接就是最終的結果。

你可以通過增加 gram 的數量讓它變得更難。四個 gram 的模型是最符合人類翻譯的模型。我建議使用下面的代碼運行幾個例子并閱讀 Wiki 頁,來加深對這方面的了解。

 

  

 

 

 

 輸出  

 

一些輸出樣本的鏈接:

  • 生成網站 1——original 1

https://emilwallner.github.io/bootstrap/pred_1/

  • 生成網站 2——original 2

https://emilwallner.github.io/bootstrap/real_2/

  • 生成網站 3——original 3

https://emilwallner.github.io/bootstrap/pred_3/

  • 生成網站 4——original 4

https://emilwallner.github.io/bootstrap/pred_4/

  • 生成網站 5——original 5

https://emilwallner.github.io/bootstrap/pred_5/ 

 

 

 我掉過的坑:

 

 

 

 

  • 理解不同模型的弱點,而不是測試隨機模型。開始的時候,我使用了類似批次標準化和雙向網絡這類隨機模型,并嘗試實現注意力機制。然后看了測試數據,才發(fā)現這樣無法準確預測顏色和位置,我意識到 CNN 有一個弱點。這就導致我采用更大的步幅來取代 maxpooling。之后驗證損失就從 0.12 變?yōu)?0.02,而 BLEU 得分從 85%提高到了 97%。
  • 如果它們相關的話,只使用預先訓練好的模型。鑒于給定的數據集很小,我認為經過預訓練的圖像模型會提高性能。從我的實驗來看,端到端的模型訓練起來比較慢,需要更多的內存,但是精度要高出 30%。
  • 在遠程服務器上運行模型時,你的計劃需要有所調整。在我的 Mac 上,它會按字母順序來讀取文件。但是在遠程服務器上,它是隨機定位的。這就造成了截圖和代碼之間的不匹配。雖然它仍然收斂,但驗證數據比我修正之后的要差 50%。
  • 確保你理解庫函數。包括詞匯表中空記號的填充空格。當我沒有添加填充空格時,預測中沒有包括任何一個空記號。這也是我看了好幾遍輸出結果之后才注意到的,而且模型從來沒有預測到一個單記號。經過快速的檢查,我發(fā)現到這甚至不在詞匯表中。另外,詞匯表要以相同的順序進行訓練和測試。
  • 試驗時使用更輕量級的模型。使用 GRU 而不是 LSTM 會將每個 epoch 周期減少 30%,并且對性能沒有太大的影響。 

 

 

 

下一步 

 

 

 

 

 

前端開發(fā)是應用深度學習的理想領域。因為生成數據很容易,并且目前的深度學習算法可以映射絕大部分的邏輯。

其中最令人興奮的領域之一是注意力機制在 LSTM 上的應用。這不僅會提高準確性,而且還能使我們能夠直觀地看到 CNN 在產生標簽時將焦點放在了哪里。

注意力機制也是標簽、樣式表、腳本和后端之間溝通的關鍵。注意力層可以跟蹤變量,確保神經網絡能夠在編程語言之間進行通信。

但在不久的將來,最大的問題在于如何找到一種可伸縮的方式來生成數據,這樣就可以逐步加入字體、顏色、文字和動畫。

到目前為止,大部分的進步都是發(fā)生在將草圖轉化為模板應用程序的過程中。在不到兩年的時間里,我們將可以在紙上畫一個應用程序,并在不到一秒的時間內就可以獲得相應的前端代碼。Airbnb 的設計團隊和 Uizard 已經構建了兩個可用的原型。 

 

 

 

一些實驗
開始 

 

 

  • 運行所有的模型
  • 嘗試不同的超參數
  • 測試一個不同的 CNN 構架
  • 添加雙向 LSTM 模型
  • 用不同的數據集來實現模型 

 

 

 

進一步的試驗 

 

  • 使用相應的語法創(chuàng)建一個可靠的隨機應用程序或網頁生成器。
  • 從草圖到應用模型的數據。將應用程序或網頁截圖自動轉換為草圖,并使用 GAN 創(chuàng)建不同類型的草圖。
  • 應用一個注意力層,可視化每個預測在圖像上的焦點,類似于這個模型。
  • 為模塊化方法創(chuàng)建一個框架。比如,有字體的多個編碼器模型,其中一個用于顏色,另一個用于排版,之后將這些編碼器整合到一個解碼器中。獲得穩(wěn)定的固體圖像特征是一個好兆頭。
  • 為神經網絡提供簡單的 HTML 組件,并且教它使用 CSS 生成動畫。

原文鏈接:https://blog.floydhub.com/turning-design-mockups-into-code-with-deep-learning/ 

 

責任編輯:龐桂玉 來源: AI前線
相關推薦

2024-05-30 08:40:41

大型語言模型LLM人工智能

2018-03-20 15:33:05

深度學習加密貨幣

2017-06-09 14:45:14

前端深度學習

2021-09-04 17:26:31

SpringBoot轉換器參數

2023-08-26 16:06:10

COBOLJava數據

2024-09-13 15:24:20

深度學習自動微分

2014-05-04 12:51:21

Javascript編譯器

2009-07-15 16:56:59

Jython類型Java類型

2020-12-17 08:08:15

CentOS

2024-02-19 15:38:08

JsonPython字符串

2017-05-25 15:14:36

2021-06-30 14:29:56

GitHub 編程工具AI

2017-12-06 15:46:31

深度學習結構化數據NLP

2021-10-29 15:13:21

LinuxPDF文件

2022-10-12 08:00:00

語音識別Node.js音頻質量

2021-05-05 10:06:09

React應用程序微前端

2023-05-05 00:19:22

2023-08-25 14:47:56

TransFLACFLAC

2021-05-12 08:00:00

深度學習人工智能設備

2023-10-16 09:26:48

CSS類型轉換
點贊
收藏

51CTO技術棧公眾號