-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtensoralex2.py
More file actions
134 lines (104 loc) · 4.13 KB
/
tensoralex2.py
File metadata and controls
134 lines (104 loc) · 4.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#coding=utf-8
# 输入数据
import input_data
mnist = input_data.read_data_sets('/tmp/data/' , one_hot = True)
import tensorflow as tf
# 定义网络超参数
learning_rate = 0.001
training_iters = 200000
batch_size = 64
display_step = 20
# 定义网络参数
n_input = 784 # 输入的维度
n_classes = 10 # 标签的维度
dropout = 0.8 # Dropout 的概率
# 占位符的输入
x = tf.placeholder(tf.types.float32 , [None , n_input])
y = tf.placeholder(tf.types.float32 , [None , n_classes])
keep_prob = tf.placeholder(tf.types.float32)
# 卷积操作
def conv2d(name , l_input , w , b):
return tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(l_input , w , strides = [1 , 1 , 1 , 1] , padding='SAME') , b) , name = name)
#最大下采样操作
def max_pool(name , l_input , k):
return tf.nn.max_pool(l_input , ksize = [1 , k , k , 1] , strides = [1 , k , k , 1] , padding='SAME' , name = name)
#归一化操作
def norm(name , l_input , lsize = 4):
return tf.nn.lrn(l_input , lsize , bias = 1.0 , alpha = 0.001 / 9.0 , beta = 0.75 , name = name)
# 定义整个网络
def alex_net(_X , _weights , _biases , _dropout):
# vector to matrix
_X = tf.reshape(_X , shape = [-1 , 28 , 28 , 1])
#conv net 1
conv1 = conv2d('conv1' , _X , _weights['wc1'] , _biases['bc1'])
#max_pool
pool1 = max_pool('pool1' , conv1 , k = 2)
#normlization
norm1 = norm('norm1' , pool1 , lsize = 4)
#Dropout
norm1 = tf.nn.dropout(norm1 , _dropout)
#conv net 2
conv2 = conv2d('conv2' , norm1 , _weights['wc2'] , _biases['bc2'])
#max pooling
pool2 = max_pool('pool2' , conv2 , k =2)
#normlization
norm2 = norm('norm2' , pool2 , lsize = 4)
#Dropout
norm2 = tf.nn.dropout(norm2 , _dropout)
#conv net 3
conv3 = conv2d('conv3' , norm2 , _weights['wc3'] , _biases['bc3'])
#max pooling
pool3 = max_pool('pool3' , conv3 , k = 2)
#normlization
norm3 = norm('norm3' , pool3 , lsize = 4)
#Dropout
norm3 = tf.nn.dropout(norm3 , _dropout)
# 全连接层,先把特征图转为向量
dense1 = tf.reshape(norm3 , [-1 , _weights['wd1'].get_shape().as_list()[0]])
dense1 = tf.nn.relu(tf.matmul(dense1 , _weights['wd1']) + _biases['bd1'] , name = 'fc1')
# Fully Connection
dense2 = tf.nn.relu(tf.matmul(dense1 , _weights['wd2']) + _biases['bd2'] , name = 'fc2')
#网络输出层
out = tf.matmul(dense2 , _weights['out']) + _biases['out']
return out
# 存储所有的网络参数
weights = {
'wc1': tf.Variable(tf.random_normal([3 , 3 , 1 , 64])) ,
'wc2': tf.Variable(tf.random_normal([3 , 3 , 64 , 128])) ,
'wc3': tf.Variable(tf.random_normal([3 , 3 , 128 , 256])) ,
'wd1': tf.Variable(tf.random_normal([4*4*256 , 256])) ,
'wd2': tf.Variable(tf.random_normal([1024 , 1024])) ,
'out': tf.Variable(tf.random_normal([1024 , 10]))
}
biases = {
'bc1': tf.Variable(tf.random_normal([64])) ,
'bc2': tf.Variable(tf.random_normal([128])) ,
'bc3': tf.Variable(tf.random_normal([256])) ,
'bd1': tf.Variable(tf.random_normal([1024])) ,
'bd2': tf.Variable(tf.random_normal([1024])) ,
'out': tf.Variable(tf.random_normal([n_classes]))
}
#构建模型
pred = alex_net(x , weights , biases , keep_prob)
#定义损失函数和学习步骤
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred , y))
optimizer = tf.train.AdamOptimizer(learning_rate = learning_rate).minimize(cost)
# Test Network
init = tf.initialize_all_variables()
# 开始训练
with tf.Session() as sess:
sess.run(init)
step = 1
# Keep training until reach max iterations
while step * batch_size < training_iters:
batch_xs , batch_ys = mnist.train.next_batch(batch_size)
#获取批数据
sess.run(optimizer , feed_dict = {x: batch_xs , y: batch_ys , keep_prob: dropout})
if step % display_step == 0:
acc = sess.run(accuracy , feed_dict= {x: batch_xs , y: batch_ys , keep_prob: 1.})
loss = sess.run(cost , feed_dict = {x:batch_xs , y:batch_ys , keep_prob: 1.})
print 'Iter' + str(step * batch_size) + ' , Minibatch Loss=' + '{:.6f}'.format(loss) + ' , Training Accuracy='+ '{:.5f}'.format(acc)
step +=1
print 'Optimization Finished!'
#计算测试精度
print 'Testing accuracy:' , sess.run(accuracy , feed_dict = {x: mnist.test.images[:256] , y: mnist.test.labels[:256] , keep_prob: 1.})