Chcę zbudować w pełni podłączony warstwę (gęstą) do zadania regresji. Zwykle robię to z TF2, używając API Kerasa jak:

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(units=2, activation='sigmoid', input_shape=(1, )))
model.add(tf.keras.layers.Dense(units=2, activation='linear'))
model.compile(optimizer='adam', loss='mae')
model.fit(inp_data, out_data, epochs=1000)

Teraz chcę zbudować niestandardową warstwę. Warstwa składa się z, powiedzmy, że 10 jednostek, w których 8 jednostek ma predefiniowane, stałe, niezaufowalne ciężary i grypy, a 2 jednostki mają losowo wybrane wagi i uprzedzenia, aby być przeszkoleni przez sieć. Czy ktoś każdy pomysł, jak mogę go zdefiniować w Tensorlow?

2
Farhad 16 styczeń 2020, 15:43

1 odpowiedź

Najlepsza odpowiedź

Warstwy Kerasa mogą domyślnie odbierać parametr trainable, True, aby wskazać, czy chcesz, aby były przeszkoleni. Niestardujące warstwy będą po prostu utrzymać wartość, którą podano przez inicjatora. Jeśli poprawnie rozumiem, chcesz mieć jedną warstwę, która jest tylko częściowo przeszkolona. To nie jest możliwe jako takie z istniejącymi warstwami. Może mógł to zrobić z niestandardową klasą warstwy, ale możesz mieć równoważne zachowanie przy użyciu dwóch prostych warstw, a następnie włączanie ich (tak długo, jak działa element aktywacyjny, a nawet nie, jak w softmax Warstwa, możesz zastosować tę aktywację po konkatenacji). W ten sposób może działać:

inputs = tf.keras.Input(shape=(1,))
# This is the trainable part of the layer
layer_train = tf.keras.layers.Dense(units=8, activation='sigmoid')(inputs)
# This is the non-trainable part
layer_const = tf.keras.layers.Dense(units=2, activation='sigmoid', trainable=False)(inputs)
# Merge both parts
layer = tf.keras.layers.Concatenate()([layer_train, layer_const])
# Make model
model = tf.keras.Model(inputs=inputs, outputs=layer)
# ...
4
jdehesa 16 styczeń 2020, 14:26