tensorflow迁移学习:VGG16花朵分类

转自:https://blog.csdn.net/weixin_41770169/article/details/80330581

github地址:https://github.com/1269215860/vgg16_flowers.git

其实上面的文章已经写的很详细了,但是还有一点小小的问题,通过参考其他的代码,将其进行补充,这样完整的程序就可以运行了。

下面我就主要说说进行补充的地方:

补充1:

       如果按照原文章的步骤一步步进行,在进行到这步的时候,会有报错,会提示找不到labels和codes文件,原因是我们在运行上一步的代码没有对其进行保存。

# read codes and labels from file
import csv 

with open('labels') as f:
    reader = csv.reader(f, delimiter='\n')
    labels = np.array([each for each in reader if len(each) > 0]).squeeze()
with open('codes') as f:
    codes = np.fromfile(f, dtype=np.float32)
    codes = codes.reshape((len(labels), -1))

我们只需要在这段上面的代码处,对输出的labels和codes文件进行保存处理即可。如下所示:

#将图像批量batches通过VGG模型,将输出作为新的输入:
# Set the batch size higher if you can fit in in your GPU memory
batch_size = 10
codes_list = []
labels = []
batch = []
 
codes = None
 
with tf.Session() as sess: 
    vgg = vgg16.Vgg16()
    input_ = tf.placeholder(tf.float32, [None, 224, 224, 3])
    with tf.name_scope("content_vgg"):
        vgg.build(input_)
    
 
    for each in classes:
        print("Starting {} images".format(each))
        class_path = data_dir + each
        files = os.listdir(class_path)
        for ii, file in enumerate(files, 1):
            # Add images to the current batch
            # utils.load_image crops the input images for us, from the center
            img = utils.load_image(os.path.join(class_path, file))
            batch.append(img.reshape((1, 224, 224, 3)))
            labels.append(each)
            
            # Running the batch through the network to get the codes
            if ii % batch_size == 0 or ii == len(files):
                images = np.concatenate(batch)
 
                feed_dict = {input_: images}
                codes_batch = sess.run(vgg.relu6, feed_dict=feed_dict)
                
                # Here I'm building an array of the codes
                if codes is None:
                    codes = codes_batch
                else:
                    codes = np.concatenate((codes, codes_batch))
                
                # Reset to start building the next batch
                batch = []
                print('{} images processed'.format(ii))
                
#这里就是添加的保存的代码
                #这样我们就可以得到一个 codes 数组,和一个 labels 数组,分别存储了所有花朵的特征值和类别。
                with open('codes', 'w') as f:
                    codes.tofile(f)
    
                import csv
                with open('labels', 'w') as f:
                    writer = csv.writer(f, delimiter='\n')
                    writer.writerow(labels)

接下来就会在文件所在的目录内自动生成labels和codes文件,然后继续原文章的步骤进行就可以实现最后的结果。

tensorflow迁移学习:VGG16花朵分类_第1张图片

补充2:

文章结尾处,作者是以柱状图的形式来展示预测结果的,现在我们以只显示概率和品种的形式来展示结果。jintensorflow迁移学习:VGG16花朵分类_第2张图片

#将数组转换为list
predic_list = prediction.tolist()
print(type(predic_list))
index = predic_list.index(max(predic_list))
print(lb.classes_[index]+":"+str(max(predic_list)))

这样就可以满足部分同学对概率显示预测结果的需求啦。

今天第一次写,以后会继续坚持,加油。

你可能感兴趣的:(深度学习)