卷积函数
1.普通的卷积方法
input 要进行卷积的数组
filter 卷积核[a,b,c,d], abc卷积核的大小 d卷积核的数量
strides 步长[1,a,b,1],第一个和最后一个数字一定是1,a和b分别对应长方向和宽方向移动的步长
padding 属性有VALID和SAME,默认情况下是VALID(不使用全0填充)
tf.nn.conv2d(input="",filter="",strides="",padding="",use_cudnn_on_gpu="",data_format="",name="")
2.简化卷积方法(slim)
#slim:对卷积操作的简化(不需要自己设置卷积核参数,不需要设置通道数,默认左右步长相等)
#arg_scope:对卷积或池化的一些参数设置默认值
slim.arg_scope([slim.conv2d,slim.max_pool2d,slim.avg_pool2d],stride=1,padding="SAME")
tf.contrib.slim.conv2d (input,[卷积核个数],[高度,宽度],strides=1,padding='SAME')
3.矩阵扩张(扩大矩阵的长和宽)
paddings=[[],[],[],[]]: 四个数组分别为四个维度,[a,a]第一维扩张a,[b,b]第二维扩张b,[c,c]第三维扩张c,[d,d]第四维扩张d
mode:
CONSTANT:扩张用0填充
REFLECT: 确定轴进行翻转,轴不复制
SYMMETRIC:确定轴进行翻转,轴复制
tf.pad(input="",paddings=[[a,a],[b,b],[c,c],[d,d]],mode="CONSTANT/REFLECT/SYMMETRIC")
4.反卷积
x: 输入[batch_size,高,宽,通道数]
kernel: 反卷积核[高,宽,个数,通道数] 注意!!!:卷积核为[高,宽,通道数,个数]
output_shape:输出的大小
strides: 步长
求解卷积核方法一:
1.将kernel改为[高,宽,通道数,个数],
2.扩大x,数值中间补上stride-1个0,两边补上kernel的高/2向上取整的数量的0
3.对第2步扩大后的x做卷积操作,卷积核为第一步修改后的kernel。方法为:输出高 = 输入高-卷积核高+1
求解卷积核方法二:逆运算(输入输出互换进行计算即可)
1.假设输出尺寸为[batch_size,h,w,channel]
2.当padding为"SAME"时: h/strides[1] == x[1] w/strides[2] == x[2] channel = kernel[3] (皆为向上取整)
3.当padding为"VALID"时:(h-kernel[0]+1)/strides[1]==x[1] (w-kernel[1]+1)/stride[2]==x[2] channel = kernel[3] (皆为向上取整)
tf.nn.conv2d_transpose(x,kernel,output_shape=[1,5,5,3],strides=[1,2,2,1],padding="SAME")
除此之外还有:
tf.nn.conv1d(input="",filter="",strides="",padding="",use_cudnn_on_gpu="",data_format="",name="")
tf.nn.conv2d_backprop_filter(input="",filter_sizes="",out_backprop="",strides="",padding="",use_cudnn_on_gpu="",data_format="",name="")
tf.nn.conv2d_backprop_input(input_sizes="",filter="",out_backprop="",strides="",padding="",use_cudnn_on_gpu="",data_format="",name="")
tf.nn.conv2d_transpose(value="",filter="",strides="",padding="",data_format="",name="")
tf.nn.conv3d(input="",filter="",strides="",padding="",name="")
tf.nn.conv3d_backprop_filter(input="",filter="",out_backprop="",strides="",padding="",name="")
tf.nn.conv3d_backprop_filter_v2(input="",filter_sizes="",out_backprop="",strides="",padding="",name="")
tf.nn.conv3d_backprop_input(input="",filter="",out_backprop="",strides="",padding="",name="")
tf.nn.conv3d_backprop_input_v2(input="",filter_sizes="",out_backprop="",strides="",padding="",name="")
tf.nn.conv3d_transpose(value="",filter="",output_shape="",strides="",padding="",name="")
池化函数
ksize 提供了过滤器的尺寸[1,a,b,1], a*b池化框的大小
strides 提供了步长信息[1,a,b,1],第一个和最后一个数字一定是1,a和b分别对应长方向和宽方向移动的步长
padding 属性有VALID和SAME,默认情况下是VALID(不使用全0填充)
tf.nn.max_pool(value="",ksize="",strides="",padding="",data_format="",name="")
除此之外还有:
tf.nn.avg_pool(value="",ksize="",strides="",padding="",data_format="",name="")
tf.nn.pool(input="",window_shape="",pooling_type="",padding="",dilation_rate="",strides="",name="",data_format="")
tf.nn.avg_pool3d(input="",ksize="",strides="",padding="",name="")
tf.nn.avg_pool3d_grad(orig_input_shape="",grad="",ksize="",strides="",padding="",name="")
tf.nn.max_pool3d(input="",ksize="",strides="",padding="",name="")
tf.nn.max_pool3d_grad(orig_input="",orig_output="",grad="",ksize="",strides="",padding="",name="")
tf.nn.max_pool_with_argmax(input="",ksize="",strides="",padding="",Targmax="",name="")
读取图片
图片读取和解码(读取->解码->求值)
方法一:批处理
img_queue = tf.train.string_input_producer(image_list, shuffle=shuffle) #定义图片序列,image_list为图片路径列表
reader = tf.WholeFileReader() #创建一个读取器
_, img = reader.read(img_queue) #使用读取器读取图片队列
img = tf.image.decode_image(img, channels=3) #对图片格式进行解码
方法二:单张图片处理
img = tf.gfile.FastGFile(image_paths,'rb').read()
img = tf.image.decode_image(img, channels=3) #对图片格式进行解码
img.eval() #获得图片的矩阵数值
图片存入和编码(编码->求值->写入)
encode_image = tf.image.encode_png(img_after_decode)
with tf.gfile.GFile(image_paths,'wb') as f:
f.write(encode_image.eval())
对图片的操作
cropped_image = tf.random_crop(img,[24,24,3]) #裁剪,将图片随机裁剪为24x24x3
resized_image = tf.image.resize_images(cropped_image,[300,300],method=3) #大小调整(不裁剪)
flipped_image = tf.image.random_flip_left_right(resized_image) #翻转,随机左右翻转图片
adjusted_brightness = tf.image.random_brightness(flipped_image,max_delta=0.8) #亮度,随机调整图片亮度
adjusted_contrast = tf.image.random_contrast(adjusted_brightness,lower=0.2,upper=1.8)#对比度
float_image = tf.image.per_image_standardization(adjusted_contrast) #标准化(非归一化)图片
对数据集进行批处理
数据的顺序被打乱
image_train, labels_train = tf.train.shuffle_batch([image,label], #所要进行批处理的图像和标签
batch_size = 10, #1个batch的大小
num_threads = 16, #指定多线程同时进行入队操作
capacity = 20, #队伍的容量大小
min_after_dequeue=5, #进行出队操作后,队伍中剩下的数据量的最小值
allow_smaller_final_batch=1 #最后一个batch数量不足10时指定可允许的batch大小的最小值
)
数据顺序分批
image_train, labels_train = tf.train.batch([image,label],
batch_size = 10,
num_threads = 16,
capacity = 20,
allow_smaller_final_batch=1
)