質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • Python

    7907questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • TensorFlow

    667questions

  • NumPy

    436questions

    NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

引数に*は必要ないのでしょうか?

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 423
退会済みユーザー

退会済みユーザー

引数に*は必要ないのか疑問に思っています。
http://www.buildinsider.net/small/booktensorflow/0201    
を参考にして今Tensorflowの勉強をしています。

def _get_weights(shape,stddev=1.0):
  var = tf.get_variable(
      'weights',
      shape,
      initializer=tf.truncated_normal_initializer(stddev=stddev)
  )
  return var

weights = _get_weights(shape=[5,5,3,64],stddev=1e-4)


というコードが出てきて、_get_weightsメソッドのshapeに*をつけなくていいのか?と思います。
つまり、

def _get_weights(*shape,stddev=1.0):


になると思うのです。
Pythonで、関数で引数にリストを渡すときには*をつけなければならないと習ったので、なぜここではつけないのかな、と。
ちなみに、全体は

# coding: utf-8

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import tensorflow as tf

NUM_CLASSES = 10

def _get_weights(shape,stddev=1.0):
  var = tf.get_variable(
      'weights',
      shape,
      initializer=tf.truncated_normal_initializer(stddev=stddev)
  )
  return var

def _get_biases(shape,value=0.0):
  var = tf.get_variable(
      'biases',
      shape,
      initializer=tf.constant_initializer(value)
  )
  return var

def inference(image_node):
   #  conv1
   with tf.variable_scope('conv1') as scope:
     weights = _get_weights(shape=[5,5,3,64],stddev=1e-4)
     conv = tf.nn.conv2d(image_node,weights,[1,1,1,1],padding='SAME')
     biases = _get_biases([64],value=0.1)
     bias = tf.nn.bias_add(conv,biases)
     conv1 = tf.nn.relu(bias,name=scope.name)

   #  pool
   pool1 = tf.nn.max_pool(conv1,ksize=[1,3,3,1],strides=[1,2,2,1],padding='SAME',name='pool1')

   #  conv2
   with tf.variable_scope('conv2') as scope:
     weights = _get_weights(shape=[5,5,64,64],stddev=1e-4)
     conv = tf.nn.conv2d(pool1,weights,[1,1,1,1],padding='SAME')
     biases = _get_biases([64],value=0.1)
     bias = tf.nn.bias_add(conv,biases)
     conv2 = tf.nn.relu(bias,name=scope.name)

   #  pool2
   pool2 = tf.nn.max_pool(conv2,ksize=[1,3,3,1],strides=[1,2,2,1],padding='SAME',name='pool2')
   reshape = tf.reshape(pool2,[1,-1])
   dim = reshape.get_shape()[1].value

   #  fc3
   with tf.variable_scope('fc3') as scope:
       weights = _get_weights(shape=[dim,384],stddev=0.04)
       biases = _get_biases([384],value=0.1)
       fc3 = tf.nn.relu(
           tf.matmul(reshape,weights) + biases,
           name=scope.name
       )

   #  fc4
   with tf.variable_scope('fc4') as scope:
       weights = _get_weights(shape=[384,192],stddev=0.04)
       biases = _get_biases([192],value=0.1)
       fc4 = tf.nn.relu(tf.matmul(fc3,weights) + biases,name=scope.name)

   #   output
   with tf.variable_scope('output') as scope:
       weights = _get_weights(shape=[192,NUM_CLASSES],stddev=1/192.0)
       biases = _get_biases([NUM_CLASSES],value=0.0)
       logits = tf.add(tf.matmul(fc4,weights),biases,name='logits')


   return logits


のようになっています。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

Pythonで、関数で引数にリストを渡すときには*をつけなければならないと習ったので、

教わった内容が間違っているか、誤解して覚えている可能性があります。

リストのまま渡したければ * を付ける必要は無いですし、リストを展開して渡したければ * を付けます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

*を付けることもできるし、もし付けると、呼び出す側は

weights = _get_weights(5,5,3,64,stddev=1e-4)


こう書くことになります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/12 12:36

    なるほど!*をつけるときは関数の引数にリスト型で持たせるのではなく、一個一個、変数の値でもたせるという認識であっていますか?

    キャンセル

  • 2017/04/12 13:09

    はい、こういう呼び方を可変長引数で渡す、といいます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python

    7907questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • TensorFlow

    667questions

  • NumPy

    436questions

    NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。