Reputation: 43521
I want to have many different models in an array, but I get an error:
AttributeError: 'Tensor' object has no attribute 'assign'
My code is:
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)
I'm calling it with:
inas = INAS(input_shape=input_shape, num_classes=num_classes)
for model in inas.models:
print(model.summary())
inas.train(x_train, y_train)
What am I doing wrong?
Trace:
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'
Upvotes: 1
Views: 873
Reputation: 6166
The problem is that your kernel_size
is zero in your first model. The kernel of first Conv2D
is empty.
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)
It will work if you train the second model.
Upvotes: 2