tensorflow基础知识学习(三)---卷积神经网络

卷积函数

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
                                           )

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值