新手入门tensorflow一个半月以来的学习历程

时隔一个半月我的图像标注终于做完了

这里我是使用的tensorflow来完成的,当然我所使用的只是最初级的技术。(我所写的博客主要是为了记录自己成长的过程,并非教学意义)

这里我使用的老师提供的数据集一共5000张照片,4500张训练,500张测试。
5000张图片共有260个物种,每张图片有4个左右。

最后我所达到的效果

下面开始就是我完成这个项目所用到的专业内容,以及我所遇到的问题,如果有人看到这篇博客发现我有错误,请向我指出,我一定会虚心接受并改正。

我所用到的神经网络是卷积神经网络,套用的是AlexNet模型,并且稍作修改。

首先,定义占位符用来在后面传参数(真实标签)来计算loss

这里写图片描述

然后是读取图片

我的图片是按从0到4499的顺序和0到499的顺序将训练集和测试集分开存储的,这里我使用glob.glob的方法从文件夹读取所有的.jpeg的文件名,然后配合tf.read_file这个函数来将图片读入内存

读入进来之后对图片进行解码,调整大小,reshape。

image_jpeg = tf.image.decode_jpeg(read_image, channels=3)     #进行JPEG解码
image_cut = tf.image.resize_images(image_jpeg, (227, 227))    #将图片扭曲至227*227
image_reshape = tf.reshape(image_cut, [227, 227, 3])          #reshape

lables = list(map(lambda x: x.split(‘\’)[1].split(‘.’)[0], read_image_name))

使用这个方法来将图片的名称按照glob.glob的读入顺序裁剪下来,.顺序大概是这样.

这里写图片描述

然后使用tf.train.slice_input_producer,配合 tf.train.batch,将读入进来的图片和标签按照对应的顺序生成队列(这里shuffle=False为了让他不乱序,否则我没办法将他的标签和图片对应上…不过这样做会发生过拟合…但是没办法…)

image_que = tf.train.slice_input_producer([read_image_name, lables], shuffle=False)

接下来是定义AlexNet网络所用到的卷积层,池华层,权重,偏置和全连接层的函数,这个函数的定义跟AlexNet原网络基本一致。

接着是定义loss和train

因为我的标签是独立但不互斥的,也就是多目标问题。
所以我使用的计算loss的方法是

tf.nn.sigmoid_cross_entropy_with_logits()


使用的优化器是 tf.train.AdagradOptimizer

tf.train.AdagradOptimizer(learning_rate).minimize(loss)


之后便是开始训练的过程了。

我一个半月以来所遇到的两个记忆犹新的问题以及解决办法:

一.问题:

1.图片和标签对应不上。
2.loss不下降

二.解决办法:

1.图片和标签对应不上。
我曾以为glob.glob读入图片的顺序是按照从0到4499的顺序读入进来,直到有一天我print了一下读入结果。
这里我选择的方法是将图片读入进来之后将图片的名称裁剪下来,然后自己定义函数从导入的存放图片标签的矩阵按照文件名取出对应的图片标签。

def batch(X, lables, k):
    a = [None]*100
    c = k - 1
    c = c * 100
    d = 0
    for j in range(c, c + 100):
        b = lables[j]                 #从lables中取出第j个读入的图片的名字
        b = int(b)                   #将他转化成int类型
        a[d] = X[b]                  #从x(x中存放的是真实标签列表(4500*260))中取出第j行赋值给a
        d += 1
    yield a

2.loss不下降。

我曾试过改学习率,修改bitch_size,还有人说调整图片大小我也试过了…
但是结果并没有用。 最后的解决办法是

在全连接的结果通过激活函数之前,加上一个BN层。

layer = tf.layers.batch_normalization(fc1_out, training=True)

然后再将BN层的结果通过激活函数,就可以使loss继续下降了。(但是我之前没加BN层时候我的loss会从0.698左右开始下降,下降到0.693左右不变,但是加入BN层之后,loss从0.76开始下降。)

你可能感兴趣的:(新手入门tensorflow一个半月以来的学习历程)