1 # 导入工具包
2 import math
3 import time
4 import numpy as np
5 import h5py
6 import matplotlib.pyplot as plt
7 from scipy import ndimage
8 from PIL import Image
9 import tensorflow as tf
10 from tensorflow.python.framework import ops
11
12 %matplotlib inline
13 %pylab
14 np.random.seed(1)
15 conv_layers = {}
16
17 #独热编码
18 def convert_to_one_hot(Y,C):
19 """
20 Y:需要编码的输入
21 C:编码位数
22 """
23 Y = np.eye(C)[Y.reshape(-1)].T
24 return Y
25
26 #图片显示
27 def show_image(X,Y,index):
28 plt.imshow(X[index])
29 print("y = "+str(np.squeeze(Y[:,index]))) #squeeze 压缩成数字
30 plt.show()
31
32 #MINI-BATCH函数
33 def random_mini_batch(X,Y,mini_batch_size=64,seed=0):
34 """
35 X:输入数据,(m,Hi,Wi,Ci)
36 Y:直值(m.n_y)
37 mini_batch_size:mini_batch的数量,整数
38 return:
39 mini_batches:(mini_batch_X,mini_batch_Y)
40 """
41 m = X.shape[0] #训练数据的数量
42 mini_batches = []
43 np.random.seed(seed)
44
45 nums = m//mini_batch_size
46
47 #将(X,Y)洗牌 _permulation 用来打乱
48 permutation = list(np.random.permutation(m))
49 Shuffled_X = X[permutation,:,:,:]
50 Shuffled_Y = Y[permutation,:]
51
52 for k in range(0,nums):
53 mini_batch_X = Shuffled_X[k*mini_batch_size:(k+1)*mini_batch_size,:,:,:]
54 mini_batch_Y = Shuffled_Y[k*mini_batch_size:(k+1)*mini_batch_size,:]
55 mini_batch = (mini_batch_X,mini_batch_Y)
56 mini_batches.append(mini_batch)
57
58 if m%mini_batch_size != 0 :
59 mini_batch_X = Shuffled_X[nums*mini_batch_size:m,:,:,:]
60 mini_batch_Y = Shuffled_Y[nums*mini_batch_size:m,:]
61 mini_batch = (mini_batch_X,mini_batch_Y)
62 mini_batches.append(mini_batch)
63
64 return mini_batches
65
66 #数据导入
67 def load_dataset():
68 #训练集
69 train_dataset = h5py.File('datasets/train_signs.h5',"r") #html 5
70 train_set_x_orig = np.array(train_dataset["train_set_x"][:])
71 train_set_y_orig = np.array(train_dataset["train_set_y"][:])
72 #测试集
73 test_dataset = h5py.File('datasets/test_signs.h5','r')
74 test_set_x_orig = np.array(test_dataset["test_set_x"][:])
75 test_set_y_orig = np.array(test_dataset["test_set_y"][:])
76 #类别
77 classes = np.array(test_dataset["list_classes"][:])
78 #打印维度
79 print("Original Training datasets' dimensions::X:{0},Y:{1}".format(train_set_x_orig.shape,
80 train_set_y_orig.shape))
81 print("Original Testing datasets' dimensions:X:{0},Y:{1}".format(test_set_x_orig.shape,
82 test_set_y_orig.shape))
83 #将y转换成列向量
84 train_set_y_orig = train_set_y_orig.reshape((1,train_set_y_orig.shape[0]))
85 test_set_y_orig = test_set_y_orig.reshape((1,test_set_y_orig.shape[0]))
86 Y_train = train_set_y_orig
87 Y_test = test_set_y_orig
88 #归一化
89 X_train = train_set_x_orig/255
90 X_test = test_set_x_orig/255
91 #将Y进行独热编码 0-100000 1-010000...并且转换为横向量
92 Y_train_1hot = convert_to_one_hot(Y_train,6).T
93 Y_test_1hot = convert_to_one_hot(Y_test,6).T
94 #打印其余数据维度
95 print ("number of training examples = " + str(X_train.shape[0]))
96 print ("number of test examples = " + str(X_test.shape[0]))
97 print ("X_train shape: " + str(X_train.shape))
98 print ("Y_train shape: " + str(Y_train_1hot.shape))
99 print ("X_test shape: " + str(X_test.shape))
100 print ("Y_test shape: " + str(Y_test_1hot.shape))
101
102 return train_set_x_orig,test_set_x_orig,Y_train,Y_test,\
103 X_train,X_test,Y_train_1hot,Y_test_1hot,classes
104
105 #编写占位符函数
106 def create_placeholders(n_H0,n_W0,n_C0,n_y):
107 """
108 n_H0:标量,图片高 height
109 n_W0:标量,图片宽 weight
110 n_c0:标量,图片输入的通道数 channels
111 n_y:标量,分类数
112 """
113 X = tf.placeholder(tf.float32,shape=(None,n_H0,n_W0,n_C0))
114 Y = tf.placeholder(tf.float32,shape=(None,n_y))
115 return X,Y
116
117 #参数初始化函数
118 def initialize_parameters():
119 """
120 初始化权重参数W1,W2
121 只需要初始化conv2d函数的权重(filters)
122 对于FC层,Tensorflow会自动初始化
123 """
124 tf.set_random_seed(1)
125 W1 = tf.get_variable("W1",[4,4,3,8],
126 initializer=tf.contrib.layers.xavier_initializer(seed=0))
127 W2 = tf.get_variable("W2",[2,2,8,16],
128 initializer=tf.contrib.layers.xavier_initializer(seed=0))
129 parameters={"W1":W1,
130 "W2":W2}
131 return parameters
132
133 #前向传播
134 def forward_propagation(X,parameters):
135 #取回参数
136 W1 = parameters['W1']
137 W2 = parameters['W2']
138 #CONV2D
139 Z1 = tf.nn.conv2d(X,W1,strides=[1,1,1,1],padding='SAME')
140 #RELU
141 A1 = tf.nn.relu(Z1)
142 #MAXPOOL:WINDOW_8X8; STRIDE_8; PADDING_SAME;
143 P1 = tf.nn.max_pool(A1,ksize=[1,8,8,1],strides=[1,8,8,1],padding='SAME')
144 #CONV2D
145 Z2 = tf.nn.conv2d(P1,W2,strides = [1,1,1,1],padding='SAME')
146 #RELU
147 A2 = tf.nn.relu(Z2)
148 #MAXPOOL
149 P2 = tf.nn.max_pool(A2,ksize=[1,4,4,1],strides=[1,4,4,1],padding='SAME')
150 #FALTTEN
151 P2 = tf.contrib.layers.flatten(P2)
152 #FC全连接层,暂时不用进行非线性激活,不调用softmax,最后连接到6个神经元做 softmax
153 Z3 = tf.contrib.layers.fully_connected(P2,num_outputs=6,activation_fn=None)
154 return Z3
155
156 #计算损失
157 def compute_cost(Z3,Y):
158 cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=Z3,
159 labels=Y))
160 return cost
161
162 #模型
163 def model(X_train,Y_train,X_test,Y_test,learning_rate=0.009,num_epochs=100,
164 mini_batch_size = 64,print_cost = True):
165 #可以不需要重新写入来重复运行这个模型
166 ops.reset_default_graph()
167 tf.set_random_seed(1)
168 seed = 3
169 (m,n_H0,n_W0,n_C0) = X_train.shape
170 n_y = Y_train.shape[1]
171 costs = [] #用于绘图
172 #建立占位符
173 X,Y = create_placeholders(n_H0,n_W0,n_C0,n_y)
174 #初始化参数
175 parameters = initialize_parameters()
176 #前向传播
177 Z3 = forward_propagation(X,parameters)
178 #计算损失
179 cost = compute_cost(Z3,Y)
180 #反向传播,定义tensorflow优化器,使用Adam优化器来最小化cost
181 optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
182 #初始化全局变量
183 init = tf.global_variables_initializer()
184 #开始进行tensorflow计算
185 with tf.Session() as sess:
186 #初始化
187 sess.run(init)
188 #循环训练
189 for epoch in range(num_epochs):
190 minibatch_cost = 0
191 # seed = seed+1
192 nums = m//mini_batch_size
193 minibatches=random_mini_batch(X_train,Y_train,mini_batch_size,seed)
194 for minibatch in minibatches:
195 #选择一组minibatch
196 (minibatch_X,minibatch_Y) = minibatch
197 _,temp_cost = sess.run([optimizer,cost],
198 feed_dict = {X:minibatch_X,Y:minibatch_Y})
199 minibatch_cost += temp_cost/nums
200 #打印损失
201 if print_cost == True and epoch%5 == 0:
202 print("第{0}次迭代,当前cost:{1}".format(epoch,minibatch_cost))
203 if print_cost == True and epoch%1 == 0:
204 costs.append(minibatch_cost)
205 #绘出损失图
206 plt.plot(np.squeeze(costs))
207 plt.plot(np.squeeze(costs))
208 plt.grid(True)
209 plt.ylabel('cost')
210 plt.xlabel('iterations (per tens)')
211 plt.title("Learning rate =" + str(learning_rate))
212 plt.show()
213 #计算正确预测
214 #返回最大的索引
215 predict_op = tf.argmax(Z3,1)
216 #判断是否相同 返回布尔值
217 correct_prediction = tf.equal(predict_op,tf.argmax(Y,1))
218
219 #计算测试集精度 #转换为数字了 tf.cast
220 accuracy = tf.reduce_mean(tf.cast(correct_prediction,"float"))
221 print(accuracy)
222
223 train_accuracy = accuracy.eval({X:X_train,Y:Y_train})
224 test_accuracy = accuracy.eval({X:X_test,Y:Y_test})
225 print("Train Accuracy:", train_accuracy)
226 print("Test Accuracy:", test_accuracy)
227
228 return train_accuracy, test_accuracy, parameters
229
230 #数据导入:
231 X_orig_train,X_orig_test,Y_orig_train,Y_orig_test,\
232 X_train,X_test,Y_train,Y_test,classes = load_dataset()
233
234 #运行模型
235 _,_,parameters = model(X_train,Y_train,X_test,Y_test)
测试代码:
1 #测试代码
2 #显示其中一张图片
3 show_image(X_train,Y_orig_train,0)
4 #占位符测试
5 X,Y = create_placeholder(100,100,3,6)
6 print(str(X))
7 print(str(Y))
8 #filters初始化测试
9 tf.reset_default_graph()
10 with tf.Session() as sess_test:
11 parameters = initialize_parameters()
12 init = tf.global_variables_initializer()
13 sess_test.run(init)
14 print("W1="+str(parameters["W1"].eval().shape))
15 print("W2="+str(parameters["W2"].eval().shape))
16 #前向传播测试
17 tf.reset_default_graph()
18 with tf.Session() as sess:
19 np.random.seed(1)
20 X,Y = create_placeholders(64,64,3,6)
21 parameters = initialize_parameters()
22 Z3 = forward_propagation(X,parameters)
23 init = tf.global_variables_initializer()
24 sess.run(init)
25 a = sess.run(Z3,{X:np.random.randn(4,64,64,3),Y:np.random.randn(4,6)})
26 print("Z3="+str(a))
27 #损失值测试
28 tf.reset_default_graph()
29 with tf.Session() as sess:
30 np.random.seed(1)
31 X, Y = create_placeholders(64, 64, 3, 6)
32 parameters = initialize_parameters()
33 Z3 = forward_propagation(X, parameters)
34 cost = compute_cost(Z3, Y)
35 init = tf.global_variables_initializer()
36 sess.run(init)
37 a = sess.run(cost, {X: np.random.randn(4,64,64,3), Y: np.random.randn(4,6)})
38 print("cost = " + str(a))
39 #mini_batches测试
40 X = np.random.randn(660,10,10,3)
41 Y = np.random.randn(660,6)
42 mini_batches = random_mini_batch(X,Y,mini_batch_size=5,seed=0)
43 # print(mini_batches[1:10])