如何解决使用keras ResNet50模型进行二进制分类的输出层
我正在尝试使用Keras ResNet50实现来训练二进制图像分类模型。
我想在不使用传递学习的情况下测试模型,但是当我尝试使用具有Sigmoid激活的简单密集层对二进制分类更改输出层时,出现形状尺寸错误。
我的代码是这样的:
time = Time.new
puts "Current time: #{time.inspect}"
backup_path = "C:\\redmine_backups\\#{time.year}-#{time.month}-#{time.day}-time-#{time.hour}h-#{time.min}min-#{time.sec}sec\\"
backup_filename = "#{time.year}-#{time.month}-#{time.day}-redmine.sql"
system("mkdir #{backup_path}")
mysql_dump_executable = "C:\\Program Files\\MySQL\\MySQL Workbench 8.0 CE\\mysqldump.exe"
mysql_dump_call = "C:\\Program Files\\MySQL\\MySQL Workbench 8.0 CE\\mysqldump.exe --defaults-file=\"C:\\ProgramData\\MySQL\\MySQL Server 8.0\\my.conf\"
--user=root --host=localhost --protocol=tcp --port=3306 --default-character-set=utf8 --skip-triggers \"redmine\" > #{backup_path}"
if File.exist?(mysql_dump_executable)
system('start','',mysql_dump_call)
else
puts "MySQLDump executable does not exist."
end
这样做我得到了这个错误:
baseModel= ResNet50(weights=None,include_top=False,classes=2,pooling=max)
output = baseModel.output
output = layers.Dense(1,activation='sigmoid')(output)
model = keras.models.Model(inputs=baseModel.input,outputs=output)
model.compile(optimizer=Adam(learning_rate=0.0001),loss='binary_crossentropy',metrics=['accuracy'])
如果我在密集层之前添加一个扁平层:
ValueError: logits and labels must have the same shape ((None,7,1) vs (None,1))
我在这里想念的是什么?如何更改致密层的输入形状?
解决方法
对于ResNet,您指定Top = False且pooling ='max',因此Resent模型已向模型添加了最终的max pooling层。因此,请使用以下代码:无需添加展平层,最大池化可以为您展平输出。
out=basemodel.layers[-1].output
output = layers.Dense(1,activation='sigmoid')(out)
您可以使用model.summary()查看模型结构。 另外,您不应该使用classes = 2。如果top为false,则不应指定类。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。