根据吴恩达深度学习第二周的猫狗逻辑回归数据,进行train,发现准确度只有50%左右,可以说是非常之不好了。一开始以为是我网络参数的问题,但是应用
https://blog.csdn.net/u013733326/article/details/79827273这里面的代码,再变成我自己的数据之后,发现原来人家的准确度是这么多
而我自己的准确度是
现在看来,可能是数据本身没有预处理,只是简单的进行resize和0~1化了,所以不好识别。这样看来上篇博客的猫狗大战之cnn也是用的此数据,效果不好大概也是这个原因了吧。不过上篇可以将features由64-》128来稍稍改善,这里就不行了。
下面附上代码,两个都可以跑:
1.自己之前写的,但是由于准确度只有50%,找了半天不知道啥原因,以为参数差点崩溃
# -*- coding: utf-8 -*-
"""
Created on Wed Nov 11 09:20:19 2020
@author: sun
"""
#遵循吴恩达老的时风格
#涉及到图片到tf的读取,以及resize图像
import os
from PIL import Image
import cv2
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
import tensorflow.examples.tutorials.mnist.input_data as input_data
#读取文件列表
def get_files(file_path):#总文件夹 train/test 返回所有图片名字及label
class_train=[]
label_train=[]
#for train_class in os.listdir(file_path):#包含猫0或者狗1 文件夹名字
for pic_name in os.listdir(file_path):
class_train.append(file_path+'/'+pic_name)
if 'cat' in pic_name:
label_train.append(0)
else:
label_train.append(1)
temp=np.array([class_train,label_train])#2*pic_number
temp=temp.transpose()#pic_number*2
np.random.shuffle(temp)#为了更好的shuffle
image_list=list(temp[:,0])
label_list=list(temp[:,1])
return image_list, label_list
#按照文件名字去读取图片、改变size、变成规整的batch数据。。。。
def get(image,label,batch_size,i):
img_names=image[batch_size*i:batch_size*(i+1)]
imgs=np.zeros((batch_size,(28*28)),dtype=np.uint8)
labels=np.zeros((batch_size,1),dtype=np.uint8)
for img_idx in range(len(img_names)):
img=cv2.imread(img_names[img_idx])
#img = color.rgb2gray(img)
img=cv2.resize(img[:,:,0],(1, 28*28)).flatten()
img=img/255
#print(img)
imgs[img_idx]=img
labels[img_idx][0]=label[img_idx]
#print(labels)
return imgs,labels
#返回将是Tensor
def get_batch(image,label,resize_w,resize_h,batch_size,capacity):
image=tf.cast(image,tf.string)#<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=499x375 at 0x24B9AFD0CC0>
label=tf.cast(label,tf.int64)
queue=tf.train.slice_input_producer([image,label])#是一个tensor生成器,作用是按照设定,每次从一个tensor列表中按顺序或者随机抽取出一个tensor放入文件名队列。
label=queue[1]
image=tf.read_file(queue[0])
# 将图像使用JPEG的格式解码从而得到图像对应的三维矩阵。Tensorflow还提供了 tf.image.decode_png函数对png格式的图像进行编码。
# 解码之后的结果为一个张量, 在使用他的取值之前需要明确调用运行的过程。
# Decode a JPEG-encoded image to a uint8 tensor 所以这里的 image_data 已经是一个tsnsor
#图像-》tensor 3维矩阵
image=tf.image.decode_jpeg(image,channels=1)
image=tf.image.resize_image_with_crop_or_pad(image,resize_w,resize_h)
image=tf.image.per_image_standardization(image)
image_batch,label_