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

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

ただいまの
回答率

90.52%

  • Python 3.x

    6343questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • 機械学習

    679questions

    機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

XORニューロンを生成するクラスを作りたい

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 257

ALMI

score 16

プログラミング初心者の為用語などが分かりづらかったら申し訳ありません。指摘をいただいたらすぐに直します。

前提・実現したいこと

pythonに慣れる、機械学習に触れてみる、ことを目標に勉強しています。
オライリーの「ゼロから作るDeep Learning」と言う本を参考にしながら進めていて、
現在はand, or, xorとして振る舞うニューロンを生成するクラスを実装しているところです。

質問したい事

以下のコードのように設定しました。
一般的なニューロンのクラスをBaseとして定義し、重みやバイアスを設定することで、and, or, nand として振る舞うインスタンスをつくる事ができます。(挙動は確認済みです)
質問したい点は、xorのように振る舞うインスタンスをつくるようクラスを定義できないかということです。
現状、クラスの内部では重みやバイアスの和が線形式として定義されているので、このままではどんな初期値を入れてもインスタンスとしてはxorは作れないだろうとは思います。
そこで、どのようなクラスを定義すればand, or, xor, nand すべてをインスタンスとして生成できるかアイディアなどを伺いたいです。

該当のソースコード

"""ステップ関数の定義"""
def step(x):
    if x > 0:
        return 1
    else:
        return 0

""" 各ニューロンを生成するためのクラス。
    重み : w1, w2     
    バイアス:bias
    を設定し、
                x*w1 + y*w2 + bias
    を引数にとったステップ関数の値
       step( x*w1 + y*w2 + bias )
    を発火によって返す   """
class Base:

    #パラメータのセット   
    def __init__(self, w1, w2, bias):
        self.w1 = w1
        self.w2 = w2
        self.bias = bias

    #後からパラメータを調整する為の関数
    def change_a(self, x):
        self.w1 = x 
    def change_b(self, x):
        self.w2 = x 
    def change_theta(self, x):
        self.bias = bias 

    # 発火機能
    def fire(self, x, y):
        return step(self.w1*x + self.w2*y + self.bias)


"""とりあえずAND, NAND, OR インスタンスを生成
    線形表現できる限界(NORもあるけど)
    動作確認済み"""
and01 = Base(1, 1, -1.9)
nand01 = Base(-1, -1, 2)
or01 = Base(1, 1, -0.5)

"""XORを関数として定義
    以下のようにすればうまく行くけど
    出来ればand, or, nandと同じようにインスタンスにしたい"""
def xor01(x,y):
    return and01.fire(nand01.fire(x, y), or01.fire(x, y))
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

継承でインタフェースを合わせてみました。こんな感じでいかがですか?
あと、バイアス等の調整は、直接インスタンス変数に代入すればよいかと思い、メソッドをなくしました。

class Base:

    def __init__(self, w1, w2, bias):
        self.name = ""
        self.w1 = w1
        self.w2 = w2
        self.bias = bias

    def step(self, x):
        if x > 0:
            return 1
        else:
            return 0

    def fire(self, x, y):
        return self.step(self.w1 * x + self.w2 * y + self.bias)

    def testTable(self):
        print('{0} Table'.format(self.name))
        print('X: 0, Y: 0, => {0}'.format(self.fire(0, 0)))
        print('X: 0, Y: 1, => {0}'.format(self.fire(0, 1)))
        print('X: 1, Y: 0, => {0}'.format(self.fire(1, 0)))
        print('X: 1, Y: 1, => {0}'.format(self.fire(1, 1)))

class AND(Base):

    def __init__(self):
        super().__init__(1, 1, -1.9)
        self.name = "AND"

class NAND(Base):

    def __init__(self):
        super().__init__(-1, -1, 2)
        self.name = "NAND"

class OR(Base):

    def __init__(self):
        super().__init__(1, 1, -0.5)
        self.name = "OR"

class XOR(Base):

    def __init__(self):
        self.name = "XOR"
        self._and  = AND()
        self._nand = NAND()
        self._or   = OR()

    def fire(self, x, y):
        return self._and.fire(self._nand.fire(x, y), self._or.fire(x, y))

if __name__ == '__main__':

    and_gate = AND()
    and_gate.testTable()

    nand_gate = NAND()
    nand_gate.testTable()

    or_gate = OR()
    or_gate.testTable()

    xor_gate = XOR()
    xor_gate.testTable()

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/01/04 18:43

    早速の回答ありがとうございます!
    クラスの継承を使って各ゲートのインターフェースをそろえているんですね。とても読みやすくて分かりやすいです。

    自分自身質問したい事がかたまっていない中、丁寧にありがとうございました。勉強になります。
    実は後で多層のニューラルネットワークをつくることを想定して、初期値(重み、バイアス)を与えることで各ニューロンをインスタンスとして生成したいと考えていたのですが、もしかしたら第0層と1層目意向を別のクラスにするといいのかなと思いました。
    大分質問とずれますね。継承を使ってやって見たいと思います。

    キャンセル

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

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

関連した質問

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

  • Python 3.x

    6343questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • 機械学習

    679questions

    機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。