Подклассы моделей игнорируют веса слоев Keras, добавленных в список Python - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь создать подкласс модели с переменным количеством слоев и размером скрытых слоев.

Поскольку количество и размер скрытых слоев не фиксированы, я добавил экземпляры слоев Keras в список в соответствии с параметрами конструктора. Но я не понимаю, почему, когда я использую список self.W, чтобы сохранить слои Keras, модель игнорирует их вес.

class MLP(keras.Model):

  def __init__(self, first_size, num_hidden_layers, hidden_activation, num_classes, **kwargs):

    super(MLP, self).__init__()

    self.W = [Dense(units=first_size//(2**i), activation=hidden_activation) for i in range(num_hidden_layers)]

    # Regression task
    if num_classes == 0:
      self.W.append(Dense(units=1, activation='linear'))

    # Classification task
    else:
      self.W.append(Dense(units=num_classes, activation='softmax'))


  def call(self, inputs):

    x = inputs
    for w in self.W:
      x = w(x)

    return x
model = MLP(first_size=128, num_hidden_layers=4, hidden_activation='relu', num_classes=10)

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['acc'])
model.fit(x_train, y_train, batch_size=64, epochs=20, validation_data=(x_val, y_val))
model.summary()

Модель: "mlp_23"
_________________________________________________________________
Параметр выходной формы слоя (типа) # ========================================== ===========================
Всего параметров: 0
Обучаемые параметры: 0
Необучаемые параметры: 0 _________________________________________________________________

1 Ответ

0 голосов
/ 10 апреля 2020

Я думаю, что вы можете сделать это легко, как это. Например, я использовал набор данных iris из sklearn.

from keras.models import Model
from keras.layers import Input, Dense
import sklearn.datasets
iris_dataset = sklearn.datasets.load_iris()
x_train = iris_dataset["data"]
y_train = iris_dataset["target"]

inputs = Input(shape=x_train[0].shape)
x = inputs
num_hidden_layers=4
num_classes=10
hidden_activation='relu'
first_size=128

for i in range(num_hidden_layers):
    x=Dense(units=first_size//(2**i), activation=hidden_activation)(x)    
outputs=Dense(units=num_classes, activation='softmax')(x)

model = Model(inputs=inputs,outputs=outputs)
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['acc'])
model.summary()

output

Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 4)                 0         
_________________________________________________________________
dense_1 (Dense)              (None, 128)               640       
_________________________________________________________________
dense_2 (Dense)              (None, 64)                8256      
_________________________________________________________________
dense_3 (Dense)              (None, 32)                2080      
_________________________________________________________________
dense_4 (Dense)              (None, 16)                528       
_________________________________________________________________
dense_5 (Dense)              (None, 10)                170       
=================================================================
Total params: 11,674
Trainable params: 11,674
Non-trainable params: 0
...