国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

利用 TensorFlow 實現卷積自編碼器

Steven / 3155人閱讀

摘要:自編碼器的一個非常受歡迎的使用場景是圖像處理。這個自編碼器就稱之為卷積自編碼器,使用卷積自編碼器卷積自編碼器可以用于圖像的重構工作。網絡架構卷積自編碼器的編碼部分將是一個典型的卷積過程。

作者:chen_h
微信號 & QQ:862251340
微信公眾號:coderpai
簡書地址:https://www.jianshu.com/p/250...


介紹和概念

自動編碼器(Auto-encoders)是神經網絡的一種形式,它的輸入數據與輸出數據是相同的。他們通過將輸入數據壓縮到一個潛在表示空間里面,然后再根據這個表示空間將數據進行重構得到最后的輸出數據。

自編碼器的一個非常受歡迎的使用場景是圖像處理。其中使用到的小技巧是用卷積層來替換全連接層。這個轉變方法是將一個非常寬的,非常瘦的(比如 100*100 的像素點,3 通道,RGB)圖像轉換成一個非常窄的,非常厚的圖像。這種方法非常有助于幫助我們從圖像中提取出視覺特征,從而得到更準確的潛在表示空間。最后我們的圖像重構過程采用上采樣和卷積。

這個自編碼器就稱之為卷積自編碼器(Convolutional Autoencoder,CAE)

使用卷積自編碼器

卷積自編碼器可以用于圖像的重構工作。例如,他們可以學習從圖片中去除噪聲,或者重構圖片缺失的部分。

為了實現上述提到的效果,我們一般不使用相同的輸入數據和輸出數據,取而代之的是,使用含有噪聲的圖片作為輸入數據,然后輸出數據是一個干凈的圖片。卷積自編碼器就會通過學習,去去除圖片中的噪聲,或者去填補圖片中的空缺部分。

接下來,讓我們來看一下 CAE 是如何來填充圖中眼睛上的十字架。我們假設圖片的眼睛上面存在一個十字架黑影,我們需要刪除這個十字架噪聲。首先,我們需要來手動創(chuàng)建這個數據庫,當然,這個動作非常方便。

現在我們的卷積自編碼器就可以開始訓練了,我們可以用它去除我們從未見過的眼睛照片上面的十字線!

利用 TensorFlow 來實現這個卷積自編碼器

看我們利用 MNIST 數據集來看看這個網絡是如何實現的,完整的代碼可以在 Github 上面下載。

網絡架構

卷積自編碼器的編碼部分將是一個典型的卷積過程。每一個卷積層之后都會加上一個池化層,主要是為了減少數據的維度。解碼器需要從一個非常窄的數據空間中重構出一個寬的圖像。

一般情況下,你會看到我們后面是采用反卷積層來增加我們圖像的寬度和高度。它們的工作原理和卷積層的工作原理幾乎完全一樣,但是作用方向相反。比如,你有一個 33 的卷積核,那么在編碼器中我們是將該區(qū)域的圖像編碼成一個元素點,但是在解碼器中,也就是反卷積中,我們是把一個元素點解碼成 33 個元素點。TensorFlow API 為我們提供了這個功能,參考 tf.nn.conv2d_transpose

自動編碼器只需要在噪聲的圖像上進行訓練,就可以非常成功的進行圖片去燥。比如,我們可以在訓練圖片中添加入高斯噪聲來創(chuàng)建包含噪聲的圖像,然后將這些像素值裁剪在 0 到 1 之間。我們將噪聲圖像作為輸入數據,最原始的感覺圖像作為輸出數據,也就是我們的目標值。

模型定義
learning_rate = 0.001
inputs_ = tf.placeholder(tf.float32, (None, 28, 28, 1), name="inputs")
targets_ = tf.placeholder(tf.float32, (None, 28, 28, 1), name="targets")
### Encoder
conv1 = tf.layers.conv2d(inputs=inputs_, filters=32, kernel_size=(3,3), padding="same", activation=tf.nn.relu)
# Now 28x28x32
maxpool1 = tf.layers.max_pooling2d(conv1, pool_size=(2,2), strides=(2,2), padding="same")
# Now 14x14x32
conv2 = tf.layers.conv2d(inputs=maxpool1, filters=32, kernel_size=(3,3), padding="same", activation=tf.nn.relu)
# Now 14x14x32
maxpool2 = tf.layers.max_pooling2d(conv2, pool_size=(2,2), strides=(2,2), padding="same")
# Now 7x7x32
conv3 = tf.layers.conv2d(inputs=maxpool2, filters=16, kernel_size=(3,3), padding="same", activation=tf.nn.relu)
# Now 7x7x16
encoded = tf.layers.max_pooling2d(conv3, pool_size=(2,2), strides=(2,2), padding="same")
# Now 4x4x16
### Decoder
upsample1 = tf.image.resize_images(encoded, size=(7,7), method=tf.image.ResizeMethod.NEAREST_NEIGHBOR)
# Now 7x7x16
conv4 = tf.layers.conv2d(inputs=upsample1, filters=16, kernel_size=(3,3), padding="same", activation=tf.nn.relu)
# Now 7x7x16
upsample2 = tf.image.resize_images(conv4, size=(14,14), method=tf.image.ResizeMethod.NEAREST_NEIGHBOR)
# Now 14x14x16
conv5 = tf.layers.conv2d(inputs=upsample2, filters=32, kernel_size=(3,3), padding="same", activation=tf.nn.relu)
# Now 14x14x32
upsample3 = tf.image.resize_images(conv5, size=(28,28), method=tf.image.ResizeMethod.NEAREST_NEIGHBOR)
# Now 28x28x32
conv6 = tf.layers.conv2d(inputs=upsample3, filters=32, kernel_size=(3,3), padding="same", activation=tf.nn.relu)
# Now 28x28x32
logits = tf.layers.conv2d(inputs=conv6, filters=1, kernel_size=(3,3), padding="same", activation=None)
#Now 28x28x1
# Pass logits through sigmoid to get reconstructed image
decoded = tf.nn.sigmoid(logits)
# Pass logits through sigmoid and calculate the cross-entropy loss
loss = tf.nn.sigmoid_cross_entropy_with_logits(labels=targets_, logits=logits)
# Get cost and define the optimizer
cost = tf.reduce_mean(loss)
opt = tf.train.AdamOptimizer(learning_rate).minimize(cost)

訓練過程:

sess = tf.Session()
epochs = 100
batch_size = 200
# Set"s how much noise we"re adding to the MNIST images
noise_factor = 0.5
sess.run(tf.global_variables_initializer())
for e in range(epochs):
    for ii in range(mnist.train.num_examples//batch_size):
        batch = mnist.train.next_batch(batch_size)
        # Get images from the batch
        imgs = batch[0].reshape((-1, 28, 28, 1))
        
        # Add random noise to the input images
        noisy_imgs = imgs + noise_factor * np.random.randn(*imgs.shape)
        # Clip the images to be between 0 and 1
        noisy_imgs = np.clip(noisy_imgs, 0., 1.)
        
        # Noisy images as inputs, original images as targets
        batch_cost, _ = sess.run([cost, opt], feed_dict={inputs_: noisy_imgs,
                                                         targets_: imgs})
print("Epoch: {}/{}...".format(e+1, epochs),
              "Training loss: {:.4f}".format(batch_cost))

作者:chen_h
微信號 & QQ:862251340
簡書地址:https://www.jianshu.com/p/250...

CoderPai 是一個專注于算法實戰(zhàn)的平臺,從基礎的算法到人工智能算法都有設計。如果你對算法實戰(zhàn)感興趣,請快快關注我們吧。加入AI實戰(zhàn)微信群,AI實戰(zhàn)QQ群,ACM算法微信群,ACM算法QQ群。長按或者掃描如下二維碼,關注 “CoderPai” 微信號(coderpai)

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41200.html

相關文章

  • tensorflow學習筆記3——MNIST應用篇

    摘要:的卷積神經網絡應用卷積神經網絡的概念卷積神經網絡是一種前饋神經網絡,它的人工神經元可以響應一部分覆蓋范圍內的周圍單元,對于大型圖像處理有出色表現。 MNIST的卷積神經網絡應用 卷積神經網絡的概念 卷積神經網絡(Convolutional Neural Network,CNN)是一種前饋神經網絡,它的人工神經元可以響應一部分覆蓋范圍內的周圍單元,對于大型圖像處理有出色表現。[2] 它...

    baishancloud 評論0 收藏0
  • 卷積編碼

    摘要:卷積滿足交換操作,因此在一般的維空間輸入,自編碼可以被用來訓練解碼編碼。事實上,解碼卷積的超參數是由編碼框架確定的由于卷積跨越每個特征圖,并且產生具有的維度,因此經過濾波器之后產生相同的空間范圍。 作者:chen_h微信號 & QQ:862251340微信公眾號:coderpai簡書地址:https://www.jianshu.com/p/ec4... 這篇教程是翻譯Paolo Ga...

    shiyang6017 評論0 收藏0
  • 初學者怎么選擇神經網絡環(huán)境?對比MATLAB、Torch和TensorFlow

    摘要:本報告面向的讀者是想要進入機器學習領域的學生和正在尋找新框架的專家。其輸入需要重塑為包含個元素的一維向量以滿足神經網絡。卷積神經網絡目前代表著用于圖像分類任務的較先進算法,并構成了深度學習中的主要架構。 初學者在學習神經網絡的時候往往會有不知道從何處入手的困難,甚至可能不知道選擇什么工具入手才合適。近日,來自意大利的四位研究者發(fā)布了一篇題為《神經網絡初學者:在 MATLAB、Torch 和 ...

    yunhao 評論0 收藏0

發(fā)表評論

0條評論

Steven

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<