国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

用tensorflow搭建CNN的方法

2020-01-04 15:46:00
字體:
來源:轉載
供稿:網(wǎng)友

CNN(Convolutional Neural Networks) 卷積神經(jīng)網(wǎng)絡簡單講就是把一個圖片的數(shù)據(jù)傳遞給CNN,原涂層是由RGB組成,然后CNN把它的厚度加厚,長寬變小,每做一層都這樣被拉長,最后形成一個分類器

tensorflow,CNN

在 CNN 中有幾個重要的概念:

  1. stride
  2. padding
  3. pooling

stride,就是每跨多少步抽取信息。每一塊抽取一部分信息,長寬就縮減,但是厚度增加。抽取的各個小塊兒,再把它們合并起來,就變成一個壓縮后的立方體。

padding,抽取的方式有兩種,一種是抽取后的長和寬縮減,另一種是抽取后的長和寬和原來的一樣。

pooling,就是當跨步比較大的時候,它會漏掉一些重要的信息,為了解決這樣的問題,就加上一層叫pooling,事先把這些必要的信息存儲起來,然后再變成壓縮后的層

利用tensorflow搭建CNN,也就是卷積神經(jīng)網(wǎng)絡是一件很簡單的事情,筆者按照官方教程中使用MNIST手寫數(shù)字識別為例展開代碼,整個程序也基本與官方例程一致,不過在比較容易迷惑的地方加入了注釋,有一定的機器學習或者卷積神經(jīng)網(wǎng)絡制式的人都應該可以迅速領會到代碼的含義。

#encoding=utf-8 import tensorflow as tf  import numpy as np  from tensorflow.examples.tutorials.mnist import input_data  mnist = input_data.read_data_sets('MNIST_data', one_hot=True)  def weight_variable(shape):   initial = tf.truncated_normal(shape,stddev=0.1) #截斷正態(tài)分布,此函數(shù)原型為尺寸、均值、標準差   return tf.Variable(initial) def bias_variable(shape):   initial = tf.constant(0.1,shape=shape)   return tf.Variable(initial) def conv2d(x,W):   return tf.nn.conv2d(x,W,strides=[1,1,1,1],padding='SAME') # strides第0位和第3為一定為1,剩下的是卷積的橫向和縱向步長 def max_pool_2x2(x):   return tf.nn.max_pool(x,ksize = [1,2,2,1],strides=[1,2,2,1],padding='SAME')# 參數(shù)同上,ksize是池化塊的大小  x = tf.placeholder("float", shape=[None, 784]) y_ = tf.placeholder("float", shape=[None, 10])  # 圖像轉化為一個四維張量,第一個參數(shù)代表樣本數(shù)量,-1表示不定,第二三參數(shù)代表圖像尺寸,最后一個參數(shù)代表圖像通道數(shù) x_image = tf.reshape(x,[-1,28,28,1])  # 第一層卷積加池化 w_conv1 = weight_variable([5,5,1,32]) # 第一二參數(shù)值得卷積核尺寸大小,即patch,第三個參數(shù)是圖像通道數(shù),第四個參數(shù)是卷積核的數(shù)目,代表會出現(xiàn)多少個卷積特征 b_conv1 = bias_variable([32])  h_conv1 = tf.nn.relu(conv2d(x_image,w_conv1)+b_conv1) h_pool1 = max_pool_2x2(h_conv1)  # 第二層卷積加池化  w_conv2 = weight_variable([5,5,32,64]) # 多通道卷積,卷積出64個特征 b_conv2 = bias_variable([64])  h_conv2 = tf.nn.relu(conv2d(h_pool1,w_conv2)+b_conv2) h_pool2 = max_pool_2x2(h_conv2)  # 原圖像尺寸28*28,第一輪圖像縮小為14*14,共有32張,第二輪后圖像縮小為7*7,共有64張  w_fc1 = weight_variable([7*7*64,1024]) b_fc1 = bias_variable([1024])  h_pool2_flat = tf.reshape(h_pool2,[-1,7*7*64]) # 展開,第一個參數(shù)為樣本數(shù)量,-1未知 f_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat,w_fc1)+b_fc1)  # dropout操作,減少過擬合 keep_prob = tf.placeholder(tf.float32) h_fc1_drop = tf.nn.dropout(f_fc1,keep_prob)  w_fc2 = weight_variable([1024,10]) b_fc2 = bias_variable([10]) y_conv = tf.nn.softmax(tf.matmul(h_fc1_drop,w_fc2)+b_fc2)  cross_entropy = -tf.reduce_sum(y_*tf.log(y_conv)) # 定義交叉熵為loss函數(shù) train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy) # 調用優(yōu)化器優(yōu)化 correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))  sess = tf.InteractiveSession() sess.run(tf.initialize_all_variables()) for i in range(2000):  batch = mnist.train.next_batch(50)  if i%100 == 0:   train_accuracy = accuracy.eval(feed_dict={x:batch[0], y_: batch[1], keep_prob: 1.0})   print "step %d, training accuracy %g"%(i, train_accuracy)  train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})  print "test accuracy %g"%accuracy.eval(feed_dict={x: mnist.test.images[0:500], y_: mnist.test.labels[0:500], keep_prob: 1.0}) 

在程序中主要注意這么幾點:

1、維度問題,由于我們tensorflow基于的是張量這樣一個概念,張量其實就是維度擴展的矩陣,因此維度特別重要,而且維度也是很容易使人迷惑的地方。

2、卷積問題,卷積核不只是二維的,多通道卷積時卷積核就是三維的

3、最后進行檢驗的時候,如果一次性加載出所有的驗證集,出現(xiàn)了內存爆掉的情況,由于是使用的是云端的服務器,可能內存小一些,如果內存夠用可以直接全部加載上看結果

4、這個程序原始版本迭代次數(shù)設置了20000次,這個次數(shù)大約要訓練數(shù)個小時(在不使用GPU的情況下),這個次數(shù)可以按照要求更改。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關教程知識閱讀請移步到python教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 阳城县| 平原县| 横峰县| 白河县| 同仁县| 康乐县| 白沙| 新巴尔虎左旗| 新竹县| 团风县| 阳新县| 宝兴县| 紫云| 龙南县| 金秀| 米林县| 深水埗区| 浪卡子县| 安远县| 会昌县| 潞西市| 汶上县| 库伦旗| 竹山县| 大关县| 台南市| 花莲县| 沁水县| 涞源县| 靖边县| 宁蒗| 江口县| 西乌| 沐川县| 鲁山县| 乌拉特前旗| 寿阳县| 方城县| 松潘县| 革吉县| 济宁市|