0

Python の反復処理について質問があります。現時点では、次のコード (の一部) を使用して、非常に単純なニューラル ネットワークを構築しようとしています。

class neural_net:
    def __init__(self, n_neurons, n_input):
        self.n_neurons = n_neurons
        self.n_input = n_input
        self.input = []
        self.weights = []
        self.output = []


    def generate_input(self):
        input = [0.0,0.0,1.0]
        self.input = input


    def generate_random_weights(self):
        weights = [[0] * self.n_input ] * (self.n_neurons)
        for i in range(self.n_neurons):
            for ii in range(self.n_input):
                weights[i][ii] =  round(random.random(), 1)
        self.weights = weights

関数 generate_random_weights では、i=0 と i=1 は常に同時に更新されます。print'weights:', self.weightsを使用して印刷すると、結果は常に次のようになります。

weights: [[0.2, 0,1, 0,8], [0,2, 0,1, 0,8]]

最初と 2 番目のリストは常に同じです。なぜこれが起こるのか誰か知っていますか?

4

1 に答える 1

1

あなたの問題は、初期化方法にありますweights

weights = [[0] * self.n_input ] * (self.n_neurons)

これは次と同等です。

inner_list = [0] * self.n_input
weights = [inner_list] * (self.n_neurons)

これにより、 の各要素が同じリストのコピーであることが明確になることを願っていweightsます。代わりに、次のようなものを使用する必要があります。

weights = [[0] * self.n_input for _ in range(self.n_neurons)]

ここで覚えておくべき重要なことは*、値がすべて不変である場合にのみリストを作成するために使用する必要があるため[0] * 4、安全ですが[[0]] * 4、同じ内部リストへの 4 つの参照を持つ新しいリストを作成することです。

代わりにリスト内包表記を使用すると、外側のリストの各場所に対して新しい内側のリストを確実に作成できます。

于 2013-10-30T16:09:44.780 に答える