对自己深度学习搭建图像识别过程进行总结
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')
- 两个元组连起来 可以使用 tuple([None])+image_shape
- 修改标签输入函数格式如(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)