python - 多次使用不同输入的 ResNet50(权重共享)
问题描述
我想多次使用相同的 ResNet50 和不同的输入,即共享权重。下面是我的 coce,但我收到了AttributeError: 'Tensor' object has no attribute 'output'
该行的错误消息resnet_x = resnet_x.output
。
我必须改变什么才能让它工作?
from tensorflow.keras.applications.resnet50 import ResNet50
from tensorflow.keras.layers import Input
from tensorflow.keras.layers import GlobalAveragePooling2D
import tensorflow as tf
from tensorflow.keras.models import Model
from tensorflow.keras.optimizers import Adam
input_tensor_x = Input(shape=(96,96,3))
input_tensor_y = Input(shape=(96,96,3))
input_tensor_z = Input(shape=(96,96,3))
base_model = ResNet50(weights=None, include_top=False, input_shape=(96,96,3))
resnet_x = base_model(input_tensor_x)
resnet_x = resnet_x.output
resnet_x = GlobalAveragePooling2D()(resnet_x)
resnet_x = Dropout(0.5)(resnet_x)
resnet_y = base_model(input_tensor_y)
resnet_y = resnet_y.output
resnet_y = GlobalAveragePooling2D()(resnet_y)
resnet_y = Dropout(0.5)(resnet_y)
resnet_z = base_model(input_tensor_z)
resnet_y = resnet_y.output
resnet_y = GlobalAveragePooling2D()(resnet_y)
resnet_y = Dropout(0.5)(resnet_y)
merge_layer = tf.keras.layers.Concatenate()([resnet_x, resnet_y, resnet_z])
output_tensor = Dense(self.num_classes, activation='softmax')(merge_layer)
# instantiate and compile model
cnn_model = Model(inputs=[input_tensor_x, input_tensor_y, input_tensor_z], outputs=output_tensor)
opt = Adam()
cnn_model.compile(loss=categorical_crossentropy, optimizer=opt, metrics=['accuracy', tf.keras.metrics.AUC()])
解决方案
只需删除线条即可resnet_XXX = resnet_XXX.output
完成工作。注意变量的名称(resnet_z层下)
input_tensor_x = Input(shape=(96,96,3))
input_tensor_y = Input(shape=(96,96,3))
input_tensor_z = Input(shape=(96,96,3))
base_model = ResNet50(weights=None, include_top=False, input_shape=(96,96,3))
resnet_x = base_model(input_tensor_x)
resnet_x = GlobalAveragePooling2D()(resnet_x)
resnet_x = Dropout(0.5)(resnet_x)
resnet_y = base_model(input_tensor_y)
resnet_y = GlobalAveragePooling2D()(resnet_y)
resnet_y = Dropout(0.5)(resnet_y)
resnet_z = base_model(input_tensor_z)
resnet_z = GlobalAveragePooling2D()(resnet_z)
resnet_z = Dropout(0.5)(resnet_z)
merge_layer = tf.keras.layers.Concatenate()([resnet_x, resnet_y, resnet_z])
output_tensor = Dense(10, activation='softmax')(merge_layer)
# instantiate and compile model
cnn_model = Model(inputs=[input_tensor_x, input_tensor_y, input_tensor_z], outputs=output_tensor)
opt = Adam()
cnn_model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy', tf.keras.metrics.AUC()])
推荐阅读
- python - 将参数传递给 ModelForm 并使用 min_value
- html - 带有溢出的容器:隐藏需要有一个图像的溢出可见
- java - 在 firebase 中 addOnCompleteListener 后不会保存 ArrayList 的数据
- linux-kernel - bpf_xdp_adjust_meta() 返回 errcode -13(权限被拒绝)
- c++ - 将字符串转换为十六进制引发错误:'std::out_of_range'
- android - 适用于 Android 的自定义 libc++
- python - 函数不断选择第一个 clf 作为最佳模型
- javascript - 按钮单击在 chrome 中什么也不做
- java - Android广播接收器在一段时间后停止
- python - 在 Python 中将字符串(具有不同格式)转换为日期时间