2017-12-01 1 views
0

Wir verwenden chainer.functions.linear, um y=Wx+b zu berechnen.Wie implementiert man eine Charge lineare Verbindung in Chainer, die unterschiedliche Gewichtungen für jedes Beispiel im Batch unterstützt?

In meinem Fall muss ich eine lineare Verbindung mit einer weiteren Dimension implementieren.

Nehmen wir an, das Eingabebeispiel ist (c, x), der gewünschte Ausgang ist dann y = W_c x + b. Lassen Sie uns die Verzerrung ignorieren und y = W_c x machen.
Die Kardinalnummer {c} ist im Voraus bekannt (normalerweise Klassen von Proben).

Theoretisch kann der W Parameter als 3-d Tensor (C, y_dims, x_dims) implementiert werden. Aber was noch? Muss ich über die Charge iterieren und W_c in Form (y_dims, x_dims) extrahieren und functions.linear nur für das (1, x_dims) -förmige Beispiel anrufen?

Antwort

0

Nun, ich selbst fand eine Lösung für die Frage.

die Daten Lassen von Formen sein, wie folgt,

  • W: (C, y_dims, x_dims)
  • x: (batch, x_dims)
  • c: (batch, 1)

Zuerst habe ich eine Gewichtsmatrix für jedes x in Charge erhalten:

W_c = chainer.functions.get_item(W, chainer.as_variable(c).data) 
y = chainer.functions.batch_matmul(W_c, chainer.expand_dims(x, 2)) // in shape (batch, y_dims, 1) 

So ist die Schlüsselfunktion hier get_item, die sowohl numpy.ndarray als auch cupy.ndarray aber NOTchainer.Variable akzeptiert. Es funktioniert wie numpy.take aber ist differenzierbar und spart eine Menge Arbeit.

Verwandte Themen