构建CNN模型时遇AttributeError:'function'对象无'summary'属性求助
解决AttributeError: 'function' object has no attribute 'summary'错误
嘿,我一眼就揪出问题所在了——你在vgg()函数里犯了个超容易忽略的小失误!
你看函数最后一行写的是return vgg,这意味着你返回的是函数本身,而不是你花功夫构建好的model对象。当你执行model = vgg()时,model变量其实指向的是这个函数,而非Keras模型实例,自然就没有summary()方法啦,这才是报错的根本原因。
和你怀疑的滤波器数量、全连接层单元数完全没关系哦,那些参数只会影响模型的训练速度或内存占用,不会触发这个属性错误。
来看看修复后的完整代码:
from keras.models import Sequential from keras.layers import Conv2D,MaxPooling2D,Flatten,Dense from keras.optimizers import Adam def vgg(): kernel=(3,3) pool=(2,2) model=Sequential() model.add(Conv2D(96,kernel,padding='same',input_shape=(32,32,1),activation='relu')) model.add(Conv2D(96,kernel,padding='same',activation='relu')) model.add(MaxPooling2D(pool,strides=2,padding='same')) model.add(Conv2D(128,kernel,padding='same',activation='relu')) model.add(Conv2D(128,kernel,padding='same',activation='relu')) model.add(MaxPooling2D(pool,strides=2,padding='same')) model.add(Conv2D(256,kernel,padding='same',activation='relu')) model.add(Conv2D(256,kernel,padding='same',activation='relu')) model.add(Conv2D(256,kernel,padding='same',activation='relu')) model.add(MaxPooling2D(pool,strides=2,padding='same')) model.add(Conv2D(512,kernel,padding='same',activation='relu')) model.add(Conv2D(512,kernel,padding='same',activation='relu')) model.add(Conv2D(512,kernel,padding='same',activation='relu')) model.add(MaxPooling2D(pool,strides=2,padding='same')) model.add(Conv2D(512,kernel,padding='same',activation='relu')) model.add(Conv2D(512,kernel,padding='same',activation='relu')) model.add(Conv2D(512,kernel,padding='same',activation='relu')) model.add(MaxPooling2D(pool,strides=2,padding='same')) model.add(Flatten()) model.add(Dense(4096,activation='relu')) model.add(Dense(4096,activation='relu')) model.add(Dense(43,activation='softmax')) model.compile(Adam(lr=0.001),loss='categorical_crossentropy',metrics=['accuracy']) return model # 这里改成返回model对象! model=vgg() print(model.summary())
只需要把函数最后一行的return vgg改成return model,就能解决这个问题啦。
另外,如果你之后真遇到模型参数过多导致的内存不足问题,可以试试这些小技巧:
- 减少卷积层的滤波器数量,比如把96改成64、512改成256
- 缩小全连接层的单元数,比如把4096改成1024
- 启用混合精度训练来降低内存占用
内容的提问来源于stack exchange,提问作者Harshit Bargali
相关产品推荐
相关产品推荐

