日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

tf.nn 和tf.layers以及tf.contrib.layers的简单区别(转)

發布時間:2025/3/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 tf.nn 和tf.layers以及tf.contrib.layers的简单区别(转) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

tensorflow不同層的使用(tf.nn 和tf.layers以及tf.contrib.layers)的簡單區別(轉)

2018年09月02日 18:50:33?holmes_MX
版權聲明:原創博客未經允許請勿轉載! https://blog.csdn.net/holmes_MX/article/details/82317742

小trick: 對于使用tf.layers建立的神經網絡,如果想要對loss函數進行正則話,可以采用如下方式[1]:

但是該方法不適用于編程者自己定義不同層的正則化。

l2 = tf.add_n([tf.nn.l2_loss(var) for var in tf.trainable_variables()])

注意:本文中tensorflow ver=1.8

0. 寫作目的

好記性不如爛筆頭。及時更新。

1. 不同層的介紹

tf.nn是最基礎的層,如tf.nn.conv2d, tf.nn.max_pool等,需要編程者自己定義權重。下面給出自己定義的Conv2d函數:

(注意: 這里統一使用tf.variable_scope()來管理范圍)

  • def myConv2d(input_tensor, conv_size, stride_size ,
  • output_channel, name, regu=None, padding='SAME', act=tf.nn.relu, reuse=False):
  • with tf.variable_scope(name, reuse=reuse):
  • input_channel = input_tensor.get_shape()[-1].value
  • weights = tf.get_variable(name='weights', shape=[conv_size, conv_size, input_channel, output_channel],
  • dtype=tf.float32,
  • initializer=tf.truncated_normal_initializer(stddev=0.1))
  • biases = tf.get_variable(name='biases', shape=[output_channel], dtype=tf.float32,
  • initializer=tf.constant_initializer(0.001))
  • conv = tf.nn.conv2d(input=input_tensor, filter=weights, strides=[1, stride_size, stride_size, 1], padding=padding,
  • use_cudnn_on_gpu=True, name=name)
  • if regu != None and reuse != True:
  • tf.add_to_collection('losses', tf.contrib.layers.l2_regularizer(regu)(weights))
  • print_Layer(conv)
  • if act == None:
  • return tf.nn.bias_add(value=conv, bias=biases)
  • conv_relu = act(tf.nn.bias_add(value=conv, bias=biases))
  • print_Layer(conv_relu)
  • return conv_relu
  • tf.layers是基于tf.nn封裝的高級函數[2],如果自己定義Conv2d,只需要一個函數即可,如下

  • tf.layers.conv2d(
  • inputs,
  • filters,
  • kernel_size,
  • strides=(1, 1),
  • padding='valid',
  • data_format='channels_last',
  • dilation_rate=(1, 1),
  • activation=None,
  • use_bias=True,
  • kernel_initializer=None,
  • bias_initializer=tf.zeros_initializer(),
  • kernel_regularizer=None,
  • bias_regularizer=None,
  • activity_regularizer=None,
  • kernel_constraint=None,
  • bias_constraint=None,
  • trainable=True,
  • name=None,
  • reuse=None
  • )
  • tf.contrib.layers.conv2d也是封裝完好的高級函數[3],具體為:

  • tf.contrib.layers.conv2d(
  • inputs,
  • num_outputs,
  • kernel_size,
  • stride=1,
  • padding='SAME',
  • data_format=None,
  • rate=1,
  • activation_fn=tf.nn.relu,
  • normalizer_fn=None,
  • normalizer_params=None,
  • weights_initializer=initializers.xavier_initializer(),
  • weights_regularizer=None,
  • biases_initializer=tf.zeros_initializer(),
  • biases_regularizer=None,
  • reuse=None,
  • variables_collections=None,
  • outputs_collections=None,
  • trainable=True,
  • scope=None
  • )
  • 2. tensorflow中相同功能不同函數的使用對比

    2.1 對于初學者

    ?1) 如果只是想快速了解一下大概,不建議使用tf.nn.conv2d類似的函數,可以使用tf.layers和tf.contrib.layers高級函數

    ?2) 當有了一定的基礎后,如果想在該領域進行深入學習,建議使用tf.nn.conv2d搭建神經網絡,此時會幫助你深入理解網絡中參數的具體功能與作用,而且對于loss函數需要進行正則化的時候很便于修改。

    且能很清晰地知道修改的地方。而如果采用tf.layers和tf.contrib.layers高級函數,由于函數內部有正則項,此時,不利于深入理解。而且如果編寫者想自定義loss,此時比較困難,如如果讀者想共享參數時,此時計算loss函數中的正則項時,應該只計算一次,如果采用高級函數可能不清楚到底如何計算的。

    ?

    [Reference]

    [1] 小trick來源:?https://github.com/LaurentMazare/deep-models/blob/master/densenet/densenet.py

    [2]?tensroflow官網:https://www.tensorflow.org/versions/r1.8/api_docs/python/tf/layers/conv2d

    [3] tensroflow官網:https://www.tensorflow.org/versions/r1.8/api_docs/python/tf/contrib/layers/conv2d

    轉載于:https://www.cnblogs.com/ciao/articles/10870570.html

    新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!

    總結

    以上是生活随笔為你收集整理的tf.nn 和tf.layers以及tf.contrib.layers的简单区别(转)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。