一个月前,我将kaggle里面的food-101(101000张食物图片),数据包下载下来,想着实现图像识别,做了很长时间,然后自己电脑也带不动,不过好在是最后找各种方法实现出了识别,但是
一个月前,我将kaggle里面的food-101(101000张食物图片),数据包下载下来,想着实现图像识别,做了很长时间,然后自己电脑也带不动,不过好在是最后找各种方法实现出了识别,但是准确率真的非常低,我自己都分辨不出来到底是哪种食物,电脑怎么分的出来呢?
在上一篇博客中,我提到了数据的下载处理,然后不断地测试,然后优化代码,反正过程极其复杂,很容易出错。
再说下代码流程吧:
- 关于数据集的处理,我上篇博客写道:将其灰度处理,实际上是应该二值化,将彩色图片转化为(0,1)的范围里面,首先是读取每一个文件的数据(这里的每张图片都有一个标签),然后将其随机分为80%的训练集,20%的测试集:
for filename in dir: img = np.multiply(img, 1.0/255.0) size = int(config.size * len(images))
- 神经网络训练,我将图片二值化后,下一步需要将我得图片数据传入我得训练中,循环训练,分批传入,我采用卷积操作实现其识别:
def jj(): conv = tf.nn.relu(tf.nn.conv2d(input, filter, [1, 1, 1, 1], padding="SAME")+b) pool = tf.nn.max_pool2d(conv, [1, 2, 2, 1], [1, 2, 2, 1], padding="SAME")
我这里采用的是相同大小卷积,所以我在全连接层的地方就需要注意我的神经元个数,最后通过激励函数得出结果。
prediction = tf.nn.softmax(fc2,name="y_pred") loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=fc2,labels=labels_batch)) optimizer = tf.compat.v1.train.AdamOptimizer(learning_rate=1e-4).minimize(loss) correct_prediction = tf.equal(tf.argmax(prediction,1), tf.argmax(labels_batch,1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
- 数据训练的方法:当我们建立神经网络后,需要让机器自动去训练,所以我们需要将模型保存在电脑中,同时需要电脑能够停止训练(当损失函数的值处于某一最小值的时候)。
if loss < 0.01: print("迭代收敛,结束训练") break
这里我们上传数据为50一个批次,具体多少按照自己处理。
-
服务器中跑代码时,需要注意的是肯定需要大型cpu/gpu计算机,不然容易崩溃,然后也没有什么需要注意的地方了。
其实每个神经网络的训练处理方式都不一样,但是大致流程都差不多:数据处理-网格搭建-数据训练-网格优化。根据自己数据的不同和侧重点不同,需要建立不同的卷积算法。
总结下遇到的问题:
- 图片处理:在处理图片的时候我发现有的图片格式,大小,色彩都不相同,所以我在这里将其分类和处理,主要是分开除黑白图和彩色图
def image(url): im=Image.open(url) pix=im.convert(‘RGB‘) width=im.size[0] height=im.size[1] type="黑白Image" is_color=[] for x in range(width): for y in range(height): r,g,b=pix.getpixel((x,y)) r=int(r) g=int(g) b=int(b) if (r==g) and (g==b): pass else: type=‘彩色 Image‘ return type
数据处理其实是这里面最好做的。
- 在神经网络搭建中,需要避免过拟合和欠拟合的问题,图片数据不能太少,同时神经元不能太多,需要考虑到多个问题,以及卷积操作的方式,这里都需要自己摸索
- 虽然大型服务器好用,但是贫民学生不配拥有,借用个服务器真是太难了,真的太难了!