最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用tensorflow實現(xiàn)AlexNet

 更新時間:2017年11月20日 16:25:06   作者:triplebee  
這篇文章主要為大家詳細介紹了使用tensorflow實現(xiàn)AlexNet,具有一定的參考價值,感興趣的小伙伴們可以參考一下

AlexNet是2012年ImageNet比賽的冠軍,雖然過去了很長時間,但是作為深度學(xué)習(xí)中的經(jīng)典模型,AlexNet不但有助于我們理解其中所使用的很多技巧,而且非常有助于提升我們使用深度學(xué)習(xí)工具箱的熟練度。尤其是我剛?cè)腴T深度學(xué)習(xí),迫切需要一個能讓自己熟悉tensorflow的小練習(xí),于是就有了這個小玩意兒......

先放上我的代碼:https://github.com/hjptriplebee/AlexNet_with_tensorflow

如果想運行代碼,詳細的配置要求都在上面鏈接的readme文件中了。本文建立在一定的tensorflow基礎(chǔ)上,不會對太細的點進行說明。

模型結(jié)構(gòu)

關(guān)于模型結(jié)構(gòu)網(wǎng)上的文獻很多,我這里不贅述,一會兒都在代碼里解釋。

有一點需要注意,AlexNet將網(wǎng)絡(luò)分成了上下兩個部分,在論文中兩部分結(jié)構(gòu)完全相同,唯一不同的是他們放在不同GPU上訓(xùn)練,因為每一層的feature map之間都是獨立的(除了全連接層),所以這相當于是提升訓(xùn)練速度的一種方法。很多AlexNet的復(fù)現(xiàn)都將上下兩部分合并了,因為他們都是在單個GPU上運行的。雖然我也是在單個GPU上運行,但是我還是很想將最原始的網(wǎng)絡(luò)結(jié)構(gòu)還原出來,所以我的代碼里也是分開的。

模型定義

def maxPoolLayer(x, kHeight, kWidth, strideX, strideY, name, padding = "SAME"): 
  """max-pooling""" 
  return tf.nn.max_pool(x, ksize = [1, kHeight, kWidth, 1], 
             strides = [1, strideX, strideY, 1], padding = padding, name = name) 
 
def dropout(x, keepPro, name = None): 
  """dropout""" 
  return tf.nn.dropout(x, keepPro, name) 
 
def LRN(x, R, alpha, beta, name = None, bias = 1.0): 
  """LRN""" 
  return tf.nn.local_response_normalization(x, depth_radius = R, alpha = alpha, 
                       beta = beta, bias = bias, name = name) 
 
def fcLayer(x, inputD, outputD, reluFlag, name): 
  """fully-connect""" 
  with tf.variable_scope(name) as scope: 
    w = tf.get_variable("w", shape = [inputD, outputD], dtype = "float") 
    b = tf.get_variable("b", [outputD], dtype = "float") 
    out = tf.nn.xw_plus_b(x, w, b, name = scope.name) 
    if reluFlag: 
      return tf.nn.relu(out) 
    else: 
      return out 
 
def convLayer(x, kHeight, kWidth, strideX, strideY, 
       featureNum, name, padding = "SAME", groups = 1):#group為2時等于AlexNet中分上下兩部分 
  """convlutional""" 
  channel = int(x.get_shape()[-1])#獲取channel 
  conv = lambda a, b: tf.nn.conv2d(a, b, strides = [1, strideY, strideX, 1], padding = padding)#定義卷積的匿名函數(shù) 
  with tf.variable_scope(name) as scope: 
    w = tf.get_variable("w", shape = [kHeight, kWidth, channel/groups, featureNum]) 
    b = tf.get_variable("b", shape = [featureNum]) 
 
    xNew = tf.split(value = x, num_or_size_splits = groups, axis = 3)#劃分后的輸入和權(quán)重 
    wNew = tf.split(value = w, num_or_size_splits = groups, axis = 3) 
 
    featureMap = [conv(t1, t2) for t1, t2 in zip(xNew, wNew)] #分別提取feature map 
    mergeFeatureMap = tf.concat(axis = 3, values = featureMap) #feature map整合 
    # print mergeFeatureMap.shape 
    out = tf.nn.bias_add(mergeFeatureMap, b) 
    return tf.nn.relu(tf.reshape(out, mergeFeatureMap.get_shape().as_list()), name = scope.name) #relu后的結(jié)果

定義了卷積、pooling、LRN、dropout、全連接五個模塊,其中卷積模塊因為將網(wǎng)絡(luò)的上下兩部分分開了,所以比較復(fù)雜。接下來定義AlexNet。

class alexNet(object): 
  """alexNet model""" 
  def __init__(self, x, keepPro, classNum, skip, modelPath = "bvlc_alexnet.npy"): 
    self.X = x 
    self.KEEPPRO = keepPro 
    self.CLASSNUM = classNum 
    self.SKIP = skip 
    self.MODELPATH = modelPath 
    #build CNN 
    self.buildCNN() 
 
  def buildCNN(self): 
    """build model""" 
    conv1 = convLayer(self.X, 11, 11, 4, 4, 96, "conv1", "VALID") 
    pool1 = maxPoolLayer(conv1, 3, 3, 2, 2, "pool1", "VALID") 
    lrn1 = LRN(pool1, 2, 2e-05, 0.75, "norm1") 
 
    conv2 = convLayer(lrn1, 5, 5, 1, 1, 256, "conv2", groups = 2) 
    pool2 = maxPoolLayer(conv2, 3, 3, 2, 2, "pool2", "VALID") 
    lrn2 = LRN(pool2, 2, 2e-05, 0.75, "lrn2") 
 
    conv3 = convLayer(lrn2, 3, 3, 1, 1, 384, "conv3") 
 
    conv4 = convLayer(conv3, 3, 3, 1, 1, 384, "conv4", groups = 2) 
 
    conv5 = convLayer(conv4, 3, 3, 1, 1, 256, "conv5", groups = 2) 
    pool5 = maxPoolLayer(conv5, 3, 3, 2, 2, "pool5", "VALID") 
 
    fcIn = tf.reshape(pool5, [-1, 256 * 6 * 6]) 
    fc1 = fcLayer(fcIn, 256 * 6 * 6, 4096, True, "fc6") 
    dropout1 = dropout(fc1, self.KEEPPRO) 
 
    fc2 = fcLayer(dropout1, 4096, 4096, True, "fc7") 
    dropout2 = dropout(fc2, self.KEEPPRO) 
 
    self.fc3 = fcLayer(dropout2, 4096, self.CLASSNUM, True, "fc8") 
 
  def loadModel(self, sess): 
    """load model""" 
    wDict = np.load(self.MODELPATH, encoding = "bytes").item() 
    #for layers in model 
    for name in wDict: 
      if name not in self.SKIP: 
        with tf.variable_scope(name, reuse = True): 
          for p in wDict[name]: 
            if len(p.shape) == 1:  
              #bias 只有一維 
              sess.run(tf.get_variable('b', trainable = False).assign(p)) 
            else: 
              #weights  
              sess.run(tf.get_variable('w', trainable = False).assign(p)) 

buildCNN函數(shù)完全按照alexnet的結(jié)構(gòu)搭建網(wǎng)絡(luò)。
loadModel函數(shù)從模型文件中讀取參數(shù),采用的模型文件見github上的readme說明。
至此,我們定義了完整的模型,下面開始測試模型。

模型測試

ImageNet訓(xùn)練的AlexNet有很多類,幾乎包含所有常見的物體,因此我們隨便從網(wǎng)上找?guī)讖垐D片測試。比如我直接用了之前做項目的渣土車圖片:

然后編寫測試代碼:

#some params 
dropoutPro = 1 
classNum = 1000 
skip = [] 
#get testImage 
testPath = "testModel" 
testImg = [] 
for f in os.listdir(testPath): 
  testImg.append(cv2.imread(testPath + "/" + f)) 
 
imgMean = np.array([104, 117, 124], np.float) 
x = tf.placeholder("float", [1, 227, 227, 3]) 
 
model = alexnet.alexNet(x, dropoutPro, classNum, skip) 
score = model.fc3 
softmax = tf.nn.softmax(score) 
 
with tf.Session() as sess: 
  sess.run(tf.global_variables_initializer()) 
  model.loadModel(sess) #加載模型 
 
  for i, img in enumerate(testImg): 
    #img preprocess 
    test = cv2.resize(img.astype(np.float), (227, 227)) #resize成網(wǎng)絡(luò)輸入大小 
    test -= imgMean #去均值 
    test = test.reshape((1, 227, 227, 3)) #拉成tensor 
    maxx = np.argmax(sess.run(softmax, feed_dict = {x: test})) 
    res = caffe_classes.class_names[maxx] #取概率最大類的下標 
    #print(res) 
    font = cv2.FONT_HERSHEY_SIMPLEX 
    cv2.putText(img, res, (int(img.shape[0]/3), int(img.shape[1]/3)), font, 1, (0, 255, 0), 2)#繪制類的名字 
    cv2.imshow("demo", img)  
    cv2.waitKey(5000) #顯示5秒 

如上代碼所示,首先需要設(shè)置一些參數(shù),然后讀取指定路徑下的測試圖像,再對模型做一個初始化,最后是真正測試代碼。測試結(jié)果如下:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

盐山县| 永兴县| 什邡市| 融水| 枣庄市| 灵台县| 固安县| 台东市| 威远县| 上饶市| 夏津县| 东兰县| 永济市| 诸暨市| 广灵县| 常山县| 中西区| 信丰县| 藁城市| 香河县| 军事| 吴川市| 宣城市| 南通市| 桂平市| 濮阳县| 金秀| 元谋县| 伊春市| 四子王旗| 西昌市| 泰州市| 宁乡县| 桃源县| 克什克腾旗| 应用必备| 封开县| 林甸县| 溆浦县| 美姑县| 文昌市|