淘先锋技术网

首页 1 2 3 4 5 6 7

对自己深度学习搭建图像识别过程进行总结

1、对输入的图像数据 x 进行处理,输出一个经过正规化的、Numpy array 格式的图像数据,x是一个数组,

x是一个多维的列表,先使用函数转化为多维数组。然后正规化就是把0-255的数值化为0-1内进行计算。

       我使用np.array(x)把它化为数组,然后除以255。.

导师建议:可以尝试如 (x-np.min(x))/(np.max(x)-np.min(x)) 的写法 ,从而避免在函数实现里hard coding部分变量或参数的值。

2、对标签进行独热编码,已知现有图像的编码为0-9,一共有10类。首先对0-9编码,然后对label数据进行fit,挨个分类。

        lb.fit([0,1,2,3,4,5,6,7,8,9])也可以使用range(10)
   

3、对所有数据应用以上两个函数

4、搭建tensorflow,先进行输入数据,形式如image_shape(None,32,32,3)


    • 两个元组连起来 可以使用 tuple([None])+image_shape
          
          k = tf.placeholder(dtype = tf.float32, shape = b,name = 'x')
           
          
  • 修改标签输入函数格式如(None,n_output):

    •       两个元素组成元组,可以先组成列表,然后组成元组 tuple([None,n_classes])
          
          i = tf.placeholder(dtype = tf.float32, shape = b,name = 'y')
        
  • 修改 保留概率函数,是一个常数,0-1:
    • i= tf.placeholder(dtype = tf.float32,name = 'keep_prob')
    •  

5、定义层

5.1卷积层+最大池化,取得tensor,shape里的一个数字,方法tf.cast(x_tensor.shape[-1],tf.int32),取得倒数第二个数。卷积层可以设置1-3个,输出层数最好由小到大,是2的整数次方,比如64,128,256,另外由于maxpool有防止过拟合的功能,所以卷积层里面可以不加防止过拟合的dropout。由于是32x32的输入图片,比较小,所以卷积核希望小点,才能防止漏了特征,比如3*3这样,步长1即可,最大化池设置2*2为好,步长2,这样不重复采样。

加一句,卷积核的计算过程,是对3个通道分别进行卷积,得到的结果相加,这样一个卷积核会得到一层输出,而不是3层,n个卷积核会得到n层输出。

weights = tf.Variable(tf.truncated_normal(shape=[卷积核高,卷积核宽,输入深度,卷积核数量],mean=0,stddev=0.1))    

bias = tf.Variable(tf.zeros(卷积核数量))         

conv=tf.nn.conv2d(x_tensor,weights,strides=[1,步长高,步长宽,1],padding='SAME')    

conv=tf.nn.relu(tf.nn.bias_add(conv,bias))        

conv_pool=tf.nn.max_pool(conv,ksize=[1, 池化高,池化宽, 1],    strides=[1, 池步长高,池步长宽, 1],    padding='SAME')

权重设置为接近0又不等于0,所以把标准差设置的很小。conv-ksize,是卷积核大小,conv_num_outputs是输出层数,相应的pool_就是池化核大小和输出层数。

5.2展开层,直接用的tf.layers里面的函数。

y=tf.layers.Flatten()(x_tensor)

5.3全连接层,主要用于分类,使用relu激活函数,减少计算量,可以设置1-3层,输出由大到小,最好是2的次方,比如512,256,128

y = tf.layers.dense(inputs=x_tensor, units=num_outputs, activation=tf.nn.relu)

5.4 输出层,不使用激活函数的全连接层。

y = tf.layers.dense(inputs=x_tensor, units=num_outputs)

6、对神经网络进行优化,x是输入,y是标签,keep_prob是保留概率。

session.run(optimizer, feed_dict={x:feature_batch,y:label_batch,keep_prob:keep_probability}

7、打印lost和accuracy,保留概率设置为1,进行计算lost,和accuracy

print (session.run(cost, feed_dict={x:feature_batch,y:label_batch,keep_prob:1}))

print (session.run(accuracy, feed_dict={x:valid_features,y:valid_labels,keep_prob:1}))


8、设置代数,样本大小,和保留概率,样本大小最好为64,128,256等,保留概率这里0.5-0.7都可以,代数一般10-20

epochs = 10
batch_size = 64
keep_probability = 0.7


9、进行训练

for epoch in range(epochs):
        batch_i = 1
        for batch_features, batch_labels in helper.load_preprocess_training_batch(batch_i, batch_size):
            train_neural_network(sess, optimizer, keep_probability, batch_features, batch_labels)
        print('Epoch {:>2}, CIFAR-10 Batch {}:  '.format(epoch + 1, batch_i), end='')
        print_stats(sess, batch_features, batch_labels, cost, accuracy)