JobPlus知识库 IT 工业智能4.0 文章
AlexNet模型python实现与应用

AlexNet模型实现流程

该模型总共应用五个卷积层和3个完全连接层进行卷积模型构建,其中第一和第二卷积层后有局部相应归一化处理(LRN),第一二五层后进行了最大池化处理,后三个完全连接层均进行了dropout防过拟合处理。以下为网络模型的参数维度、经过处理后训练集样本维度和参数数量等相关信息。另外在第二第四第五层分成了两个GPU进行模型训练,此时参数中的channel(第三个维度)要对半分,标红部分需要除以2。

参数相关信息表

AlexNet模型的python实现

1.定义卷积层函数

本人定义的函数没有将参数划分成两部分,若划分成两部分,可用以下代码:

2.定义LRN函数(进行局部相应归一化处理)

3.定义最大池化函数

4.定义dropout函数(可定义也可不定义,区别不大)

5.定义完全连接层

用Alexnet模型训练淘宝商品分类1000张图片

[python] view plain copy

  1.   

[python] view plain copy

  1. import cv2  
  2. import numpy as np  
  3. import matplotlib.pyplot as plt  
  4. import tensorflow as tf  
  5. import os  
  6. import random  
  7.   
  8. def convinit(w,h,channel,featurenum):  
  9.     W = tf.Variable(tf.truncated_normal([w,h,channel,featurenum],stddev = 0.01))#首先需要创建W和b变量  
  10.     b = tf.Variable(tf.constant(0.01,shape = [featurenum]))  
  11.     return W,b  
  12. def fcinit(inputD,outputD):  
  13.     W = tf.Variable(tf.truncated_normal([inputD,outputD],stddev =0.01),dtype = tf.float32)  
  14.     b = tf.Variable(tf.constant(0.01,shape = [outputD]),dtype = tf.float32)  
  15.     return W,b  
  16. def convLayer(x,W,b,stride_x,stride_y,Flagure,padding = 'SAME'):  
  17.     conv = tf.nn.conv2d(x,W,strides = [1,stride_x,stride_y,1],padding = padding)#进行卷积处理  
  18.     out = tf.add(conv,b)  
  19.     if Flagure:  
  20.         return tf.nn.relu(out)  
  21.     else:  
  22.         return out #在最后一个卷积时不需要用relu  
  23. def LRN(x,alpha,beta,R,bias):  
  24.     y = tf.nn.local_response_normalization(x,depth_radius = R,alpha = alpha,beta = beta,bias = bias)  
  25.     return y   
  26. def max_poolLayer(x,w,h,stride_x,stride_y,padding = 'SAME'):  
  27.     y = tf.nn.max_pool(x,ksize = [1,w,h,1],strides = [1,stride_x,stride_y,1],padding = padding)  
  28.     return y  
  29. def dropout(x,keeppro):  
  30.     y = tf.nn.dropout(x,keeppro)  
  31.     return y  
  32. def fcLayer(x,W,b,Flagure):  
  33.     out = tf.add(tf.matmul(x,W),b)  
  34.     if Flagure:  
  35.         return tf.nn.relu(out)  
  36.     else:  
  37.         return out  
  38. def model(x,keeppro):  
  39.     #conv1  
  40.     W1,b1 = convinit(10,10,3,64)  
  41.     conv1 = convLayer(x,W1,b1,4,4,True,'VALID')  
  42.     LRN1 = LRN(conv1,2e-05,0.75,2,1)  
  43.     maxpool1 = max_poolLayer(LRN1,3,3,2,2,'VALID')  
  44.     #conv2  
  45.     W2,b2 = convinit(5,5,64,96)  
  46.     conv2 = convLayer(maxpool1,W2,b2,2,2,True,'VALID')  
  47.     LRN2 = LRN(conv2,2e-05,0.75,2,1)  
  48.     maxpool2 = max_poolLayer(LRN2,3,3,2,2,'VALID')  
  49.     #conv3  
  50.     W3,b3 = convinit(3,3,96,128)  
  51.     conv3 = convLayer(maxpool2,W3,b3,1,1,True,'SAME')  
  52.     #conv4  
  53.     W4,b4 = convinit(3,3,128,256)  
  54.     conv4 = convLayer(conv3,W4,b4,1,1,True,'SAME')  
  55.     #conv5  
  56.     W5,b5 = convinit(3,3,256,256)  
  57.     conv5 = convLayer(conv4,W5,b5,1,1,True,'SAME')  
  58.     maxpool5 = max_poolLayer(conv5,2,2,2,2,'SAME')  
  59.     #fclayer1  
  60.     fcIn = tf.reshape(maxpool5,[-1,4*4*256])  
  61.     W_1,b_1 = fcinit(4*4*256,512)  
  62.     fcout1 = fcLayer(fcIn,W_1,b_1,True)  
  63.     dropout1 = dropout(fcout1,keeppro)  
  64.     #fclayer2  
  65.     W_2,b_2 = fcinit(512,256)  
  66.     fcout2 = fcLayer(dropout1,W_2,b_2,True)  
  67.     dropout2 = dropout(fcout2,keeppro)  
  68.     #fclayer3  
  69.     W_3,b_3 = fcinit(256,10)  
  70.     fcout3 = fcLayer(dropout2,W_3,b_3,False)      
  71.     out_1 = tf.nn.softmax(fcout3)  
  72.     out = dropout(out_1,keeppro)  
  73.     return out   
  74. def accuracy(x,y):  
  75.     global out  
  76.     predict = sess.run(out,feed_dict = {x:test_x,keeppro:0.5})  
  77.     correct_predict = tf.equal(tf.argmax(predict,1),tf.argmax(y,1))  
  78.     accuracy = tf.reduce_mean(tf.cast(correct_predict,tf.float32))  
  79.     result = sess.run(accuracy,feed_dict = {x:test_x,y:test_y,keeppro:0.5})  
  80.     return predict,result   
  81.   
  82. #make data  
  83. #read file  
  84. file = 'D:\\CNN paper\\Alex_net\\image1000test200\\train.txt'  
  85. os.chdir('D:\\CNN paper\\Alex_net\\image1000test200\\train')  
  86. with open(file,'rb') as f:  
  87.     dirdata = []  
  88.     for line in f.readlines():  
  89.         lines = bytes.decode(line).strip().split('\t')  
  90.         dirdata.append(lines)  
  91. dirdata = np.array(dirdata)  
  92.   
  93. #read imgdata  
  94. imgdir,label_1 = zip(*dirdata)  
  95. alldata_x = []  
  96. for dirname in imgdir:  
  97.     img = cv2.imread(dirname.strip(),cv2.IMREAD_COLOR)  
  98.     imgdata = cv2.resize(img,(320,320),cv2.INTER_LINEAR)  
  99.     alldata_x.append(imgdata)  
  100. #random shuffle  
  101. alldata = zip(alldata_x,label_1)  
  102. temp = list(alldata)  
  103. random.shuffle(temp)  
  104. data_xs,data_label = zip(*temp)  
  105. data_x = np.array(data_xs)  
  106. label = [int(i) for i in data_label]  
  107. #label one hot  
  108. tf_label_onehot = tf.one_hot(label,10)  
  109. with tf.Session() as sess:  
  110.     data_y = sess.run(tf_label_onehot)  
  111. #data increase  
  112. train_x = data_x[:500]  
  113. train_y = data_y[:500]  
  114. test_x = data_x[500:800]  
  115. test_y = data_y[500:800]  
  116.   
  117. x = tf.placeholder(tf.float32,[None,320,320,3])  
  118. y = tf.placeholder(tf.float32,[None,10])  
  119. keeppro = tf.placeholder(tf.float32)  
  120. out = model(x,keeppro)  
  121. out = tf.clip_by_value(out,1e-10,1.0)  
  122. loss = tf.reduce_mean(-tf.reduce_sum(y*tf.log(out),reduction_indices = [1]))  
  123. Optimizer = tf.train.GradientDescentOptimizer(0.01).minimize(loss)  
  124. init = tf.global_variables_initializer()  
  125. with tf.Session() as sess:  
  126.     sess.run(init)  
  127.     for i in range(100):  
  128.         sess.run(Optimizer,feed_dict = {x:train_x,y:train_y,keeppro:0.5})  
  129.         if i%10 == 0:  
  130.             cost = sess.run(loss,feed_dict = {x:train_x,y:train_y,keeppro:0.5})  
  131.             print('after %d iteration,cost is %f'%(i,cost))  
  132.             predict = sess.run(out,feed_dict = {x:test_x,keeppro:0.5})  
  133.             correct_predict = tf.equal(tf.argmax(predict,1),tf.argmax(y,1))  

[python] view plain copy

  1. accuracy = tf.reduce_mean(tf.cast(correct_predict,tf.float32))  
  2. result = sess.run(accuracy,feed_dict = {x:test_x,y:test_y,keeppro:0.5})  
  3. print('after %d iteration,accuracy is %f'%(i,result))  



如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

¥ 打赏支持
245人赞 举报
分享到
用户评价(0)

暂无评价,你也可以发布评价哦:)

扫码APP

扫描使用APP

扫码使用

扫描使用小程序