首页 > 解决方案 > 使用 keras,我怎样才能拥有一系列不同的模型?

问题描述

我想在一个数组中有许多不同的模型,但出现错误:

AttributeError: 'Tensor' object has no attribute 'assign'

我的代码是:

class INAS:
    def __init__(self, num_models=2, num_classes=10, input_shape=None):
        self.models = []
        self._num_classes = num_classes

        # self.modd = self._build_model(
        #     num_classes=num_classes, input_shape=input_shape, kernel_size=6)

        for i in range(num_models):
            mod = self._build_model(
                num_classes=num_classes, input_shape=input_shape, kernel_size=i * 3)
            self.models.append(mod)
        return

    def _build_model(self, num_classes, input_shape, kernel_size):
        model = Sequential()
        model.add(Conv2D(32, kernel_size=(kernel_size, kernel_size), strides=(1, 1),
                         activation='relu',
                         input_shape=input_shape))

        model.add(Flatten())

        model.add(Dense(num_classes, activation='softmax'))
        model.compile(loss='categorical_crossentropy', optimizer=Adam(
            lr=0.001), metrics=['accuracy'])

        return model

    def train(self, x_train, y_train):
        for model in self.models:
            model.fit(x_train, y_train, epochs=50, verbose=1)

我打电话给它:

inas = INAS(input_shape=input_shape, num_classes=num_classes)

for model in inas.models:
    print(model.summary())
inas.train(x_train, y_train)

我究竟做错了什么?

痕迹:

  File "train.py", line 24, in <module>
    inas.train(x_train, y_train)
  File "/Users/shamoon/Sites/rowan/eonas/inas.py", line 36, in train
    model.fit(x_train, y_train, epochs=50, verbose=1)
  File "/Users/shamoon/.local/share/virtualenvs/eonas-oAqeE_OT/lib/python3.7/site-packages/keras/engine/training.py", line 1010, in fit
    self._make_train_function()
  File "/Users/shamoon/.local/share/virtualenvs/eonas-oAqeE_OT/lib/python3.7/site-packages/keras/engine/training.py", line 509, in _make_train_function
    loss=self.total_loss)
  File "/Users/shamoon/.local/share/virtualenvs/eonas-oAqeE_OT/lib/python3.7/site-packages/keras/legacy/interfaces.py", line 91, in wrapper
    return func(*args, **kwargs)
  File "/Users/shamoon/.local/share/virtualenvs/eonas-oAqeE_OT/lib/python3.7/site-packages/keras/optimizers.py", line 505, in get_updates
    self.updates.append(K.update(m, m_t))
  File "/Users/shamoon/.local/share/virtualenvs/eonas-oAqeE_OT/lib/python3.7/site-packages/keras/backend/tensorflow_backend.py", line 973, in update
    return tf.assign(x, new_x)
  File "/Users/shamoon/.local/share/virtualenvs/eonas-oAqeE_OT/lib/python3.7/site-packages/tensorflow/python/ops/state_ops.py", line 224, in assign
    return ref.assign(value, name=name)
AttributeError: 'Tensor' object has no attribute 'assign'

标签: pythonkeras

解决方案


问题是您的第一个模型中的kernel_size为零。first 的内核Conv2D是空的。

print(inas.models[0].layers[0].get_weights()[0].shape)
print(inas.models[1].layers[0].get_weights()[0].shape)

# print
(0, 0, 3, 32)
(3, 3, 3, 32)

如果您训练第二个模型,它将起作用。


推荐阅读