代码是基于《实战GOOGLE深度学习框架》书中手写数字识别的示例,
做了一些修改
inference函数最后的返回处加上某一层,比如conv1
修改train函数中y=inference()
a,b,c,d,e=sess.run([conv1_img,pool1_img,conv2_img,conv3_img,pool3_img],feed_dict={x:_x_})
# a=sess.run(conv1_img,feed_dict={x:_x_})
# print(type(a))
# print(a.shape)
# print(a[0,:,:,0].shape)
cv2.imwrite(r'C:\Users\Administrator\Desktop\test\conv1_0\{}.jpg'.format(i),a[0,:,:,0]*255)
cv2.imwrite(r'C:\Users\Administrator\Desktop\test\conv1_1\{}.jpg'.format(i),a[0,:,:,1]*255)
inference函数返回的特征图是数据格式是tensor,不能直接保存,所以用sess.run()来将数据格式转换为ndarray来保存
def inference(input_tensor,train,regularizer):
with tf.variable_scope('layer1-conv1'):
conv1_weights=tf.get_variable('weights',[CONV1_SIZE,CONV1_SIZE,NUM_CHANNELS,CONV1_DEEP],initializer=tf.truncated_normal_initializer(stddev=0.1))
conv1_biases=tf.get_variable('biases',[CONV1_DEEP],initializer=tf.constant_initializer(0.0))
conv1=tf.nn.conv2d(input_tensor,conv1_weights,strides=[1,1,1,1],padding='SAME')
relu1=tf.nn.relu(tf.nn.bias_add(conv1,conv1_biases))
with tf.name_scope('layer2-pool1'):
pool1=tf.nn.max_pool(relu1,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')
# print(pool1)
with tf.variable_scope('layer3-conv2'):
conv2_weights=tf.get_variable('weights',[CONV2_SIZE,CONV2_SIZE,CONV1_DEEP,CONV2_DEEP],initializer=tf.truncated_normal_initializer(stddev=0.1))
conv2_biases=tf.get_variable('biases',[CONV2_DEEP],initializer=tf.constant_initializer(0.0))
conv2=tf.nn.conv2d(pool1,conv2_weights,strides=[1,1,1,1],padding='SAME')
relu2=tf.nn.relu(tf.nn.bias_add(conv2,conv2_biases))
# with tf.name_scope('layer4-pool2'):
# pool2=tf.nn.max_pool(relu2,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')
with tf.variable_scope('layer5-conv2'):
conv3_weights=tf.get_variable('weights',[CONV3_SIZE,CONV3_SIZE,CONV2_DEEP,CONV3_DEEP],initializer=tf.truncated_normal_initializer(stddev=0.1))
conv3_biases=tf.get_variable('biases',[CONV3_DEEP],initializer=tf.constant_initializer(0.0))
conv3=tf.nn.conv2d(relu2,conv3_weights,strides=[1,1,1,1],padding='SAME')
relu3=tf.nn.relu(tf.nn.bias_add(conv3,conv3_biases))
with tf.name_scope('layer6-pool2'):
pool3=tf.nn.max_pool(relu3,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')
pool_shape=pool3.get_shape().as_list()
nodes=pool_shape[1]*pool_shape[2]*pool_shape[3]
reshaped=tf.reshape(pool3,[pool_shape[0],nodes])
with tf.variable_scope('layer5-fc1'):
fc1_weights=tf.get_variable('weights',[nodes,FC_SIZE],initializer=tf.truncated_normal_initializer(stddev=0.1))
if regularizer !=None:
tf.add_to_collection('loses',regularizer(fc1_weights))
fc1_biases=tf.get_variable('biases',[FC_SIZE],initializer=tf.constant_initializer(0.1))
fc1=tf.nn.relu(tf.matmul(reshaped,fc1_weights)+fc1_biases)
# 如果train标签为真,则引入dropout函数使输出层一半的神经元失活
if train:fc1=tf.nn.dropout(fc1,0.5)
with tf.variable_scope('layer6-fc2'):
fc2_weights=tf.get_variable('weights',[FC_SIZE,NUM_LABELS],initializer=tf.truncated_normal_initializer(stddev=0.1))
if regularizer !=None:
tf.add_to_collection('losses',regularizer(fc2_weights))
fc2_biases=tf.get_variable('biases',[NUM_LABELS],initializer=tf.constant_initializer(0.1))
logit=tf.matmul(fc1,fc2_weights)+fc2_biases
return logit,conv1,pool1,conv2,conv3,pool3
#
#def get_weight_variable(shape,regularizer):
# weights=tf.get_variable('weights',shape,initializer=tf.truncated_normal_initializer(stddev=0.1))
# if regularizer != None:
# tf.add_to_collection('losses',regularizer(weights))
#def conv_img():
#定义训练过程
def train(mnist):
# 输入数据,输出数据
x=tf.placeholder(tf.float32,[BATCH_SIZE,INPUT_NODE],name='x-input')
reshaped_xs=tf.reshape(x, (BATCH_SIZE, 28, 28,1))
y_=tf.placeholder(tf.float32,[None,OUTPUT_NODE],name='y-input')
regularizer=tf.contrib.layers.l2_regularizer(REGULARAZTION_RATE)
# 计算神经网络在当前参数下的前向传播结果
y,conv1_img,pool1_img,conv2_img,conv3_img,pool3_img=inference(reshaped_xs,False,regularizer)
# 训练轮数变量
global_step=tf.Variable(0,trainable=False)
# 初始化滑动平均
variable_averages=tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY,global_step)
#tf.get_variables返回所有没有指定trainable=False的参数
# 在所有代表神经网络参数的变量上使用滑动平均值
variables_averages_op=variable_averages.apply(tf.trainable_variables())
# 计算交差熵 ,tf.argmax获得正确答案对应编号
cross_entropy=tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y,labels=tf.argmax(y_,1))
# 计算在当前batch中所有样例交差熵的平均值
cross_entropy_mean=tf.reduce_mean(cross_entropy)
loss=cross_entropy_mean+tf.add_n(tf.get_collection('losses'))
# 指数衰减学习率
learning_rate=tf.train.exponential_decay(LEARNING_RATE_BASE,global_step,100,LEARNING_RATE_DECAY)
# 优化损失函数
train_step=tf.train.GradientDescentOptimizer(learning_rate)\
.minimize(loss,global_step=global_step)
# 反向传播,更新神经网络中参数和每一个参数的滑动平均值
with tf.control_dependencies([train_step,variables_averages_op]):
train_op=tf.no_op(name='train')
saver=tf.train.Saver()
correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(y_,1))
accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
with tf.Session() as sess:
tf.global_variables_initializer().run()
# 测试数据
# test_feed={x:mnist.test.next_batch(BATCH_SIZE),y_:mnist.test.next_batch(BATCH_SIZE)}
# 迭代地训练神经网络
start=time.clock()
for i in range(TRAINING_STEPS):
# 产生这一轮使用的一个batch的训练数据,并运行训练
xs,ys=mnist.train.next_batch(BATCH_SIZE)
_,loss_value,step=sess.run([train_op,loss,global_step],feed_dict={x:xs,y_:ys})
if i % 10 ==0:
_x_,_y_=mnist.validation.next_batch(BATCH_SIZE)
# print(_x_.shape)
# reshaped_x_=np.reshape(_x_, (BATCH_SIZE, 28, 28,1))
# cv2.imwrite(r'C:\Users\Administrator\Desktop\test\2.jpg',reshaped_x_[0,:,:]*255)
# print(conv1_img)
a,b,c,d,e=sess.run([conv1_img,pool1_img,conv2_img,conv3_img,pool3_img],feed_dict={x:_x_})
# a=sess.run(conv1_img,feed_dict={x:_x_})
# print(type(a))
# print(a.shape)
# print(a[0,:,:,0].shape)
cv2.imwrite(r'C:\Users\Administrator\Desktop\test\conv1_0\{}.jpg'.format(i),a[0,:,:,0]*255)
cv2.imwrite(r'C:\Users\Administrator\Desktop\test\conv1_1\{}.jpg'.format(i),a[0,:,:,1]*255)
cv2.imwrite(r'C:\Users\Administrator\Desktop\test\conv2_0\{}.jpg'.format(i),c[0,:,:,0]*255)
cv2.imwrite(r'C:\Users\Administrator\Desktop\test\conv2_1\{}.jpg'.format(i),c[0,:,:,1]*255)
cv2.imwrite(r'C:\Users\Administrator\Desktop\test\conv2_2\{}.jpg'.format(i),c[0,:,:,2]*255)
cv2.imwrite(r'C:\Users\Administrator\Desktop\test\conv2_3\{}.jpg'.format(i),c[0,:,:,3]*255)
cv2.imwrite(r'C:\Users\Administrator\Desktop\test\conv3_0\{}.jpg'.format(i),d[0,:,:,0]*255)
cv2.imwrite(r'C:\Users\Administrator\Desktop\test\conv3_1\{}.jpg'.format(i),d[0,:,:,1]*255)
cv2.imwrite(r'C:\Users\Administrator\Desktop\test\conv3_2\{}.jpg'.format(i),d[0,:,:,2]*255)
cv2.imwrite(r'C:\Users\Administrator\Desktop\test\conv3_3\{}.jpg'.format(i),d[0,:,:,3]*255)
# sns.heatmap(a[0,:,:,1]) #热力图
validate_acc=sess.run(accuracy,feed_dict={x:_x_,y_:_y_})
print('after %d training steps, validation accuracy ' 'using average model is %g ' % (step,validate_acc))
print ('after %d training steps, loss on training ' 'batch is %g.' % (step,loss_value))
with open(r'C:\Users\Administrator\Desktop\tensorflow\mnist17.txt','a') as f:
f.writelines([str(step),'#','#',str(loss_value),'#',str(validate_acc),'\n'])
# str(validate_acc),
# DATA_X.append(i/5)
# DATA_Y.append(loss_value)
saver.save(sess,os.path.join(MODEL_SAVE_PATH,MODEL_NAME),global_step=global_step)
# test_acc=sess.run(accuracy,feed_dict=test_feed)
# print('after %d training steps, test accuracy using average' 'model is %g ' % (TRAINING_STEPS,test_acc))
end=time.clock()
print("running time is %g s" % (end-start))