Python 多个图像输入到同一ResNet,导致输入不匹配
我正在尝试建立一个网络,其中ResNet分别对三幅输入图像进行特征检测。特征检测后,三个平行分支与密集层结合。尝试为模型提供一些输入时抛出错误Python 多个图像输入到同一ResNet,导致输入不匹配,python,tensorflow,keras,input,tensorflow2.0,Python,Tensorflow,Keras,Input,Tensorflow2.0,我正在尝试建立一个网络,其中ResNet分别对三幅输入图像进行特征检测。特征检测后,三个平行分支与密集层结合。尝试为模型提供一些输入时抛出错误 #basis model in1 = Input(shape=(224, 224, 3), name='base_image') in2 = Input(shape=(224, 224, 3), name='image1') in3 = Input(shape=(224, 224, 3), name='image2') ResNet = ResNet
#basis model
in1 = Input(shape=(224, 224, 3), name='base_image')
in2 = Input(shape=(224, 224, 3), name='image1')
in3 = Input(shape=(224, 224, 3), name='image2')
ResNet = ResNet50(
include_top=False,
weights="imagenet",
input_shape=(224, 224, 3)
)
ResNet.trainable = False
out1 = ResNet(in1)
out2 = ResNet(in2)
out3 = ResNet(in3)
basis1 = GlobalAveragePooling2D()(out1)
basis1 = Dropout(0.7)(basis1)
basis1 = Flatten()(basis1)
basis2 = GlobalAveragePooling2D()(out2)
basis2 = Dropout(0.7)(basis2)
basis2 = Flatten()(basis2)
basis3 = GlobalAveragePooling2D()(out3)
basis3 = Dropout(0.7)(basis3)
basis3 = Flatten()(basis3)
#own model
concat = Concatenate()([basis1, basis2, basis3])
dense_1 = Dense(2048, activation='relu')(concat)
dense_2 = Dense(1024, activation='relu')(dense_1)
output = Dense(1, activation='softmax')(dense_2)
my_model = Model(inputs = [in1, in2, in3], outputs=output)
以下是模型的外观:
images数组(肯定)返回一个带有形状(2242243)的图像
导致fit()中出现以下错误:
似乎第一个子数组被这种方法忽略了?我在这个问题上纠缠了很长时间。我想你需要
ResNet1 = ResNet50(include_top=False, weights="imagenet", input_shape=(224, 224, 3)
ResNet2 = ResNet50(include_top=False, weights="imagenet", input_shape=(224, 224, 3)
ResNet3 = ResNet50(include_top=False, weights="imagenet", input_shape=(224, 224, 3)
out1 = ResNet1(in1)
out2 = ResNet2(in2)
out3 = ResNet3(in3)
basis1 = GlobalAveragePooling2D()(out1) # this make a vector so you don't need flatten layer
basis1 = Dropout(0.7)(basis1)
basis2 = GlobalAveragePooling2D()(out2) # this make a vector so you don't need flatten layer
basis2 = Dropout(0.7)(basis2)
basis3 = GlobalAveragePooling2D()(out3) # this make a vector so you don't need flatten layer
basis3 = Dropout(0.7)(basis3)
concat = Concatenate()([basis1, basis2, basis3])
dense_1 = Dense(2048, activation='relu')(concat) # I would reduce nodes t0 256
# I would add a dropout layer here Dropout(.3)
dense_2 = Dense(1024, activation='relu')(dense_1)# I would reduce nodes to 32
output = Dense(1, activation='softmax')(dense_2)
如果你看一下你的模型图,所有的输入都会进入一个单一的Resnet模型。
另外,由于您使用的是二进制交叉熵,我认为您的标签必须只有一个1或0。在使用model.fit()
时,根据我的经验,最好使用一个输入,而不是一个列表。稍后,手动索引输入张量以获得单个图像。在您的情况下,输入形状将是(批大小,3224224,3)
inputs=Input(shape=(3224224,3),name='images')
ResNet=ResNet50(
include_top=False,
weights=“imagenet”,
输入_形状=(2242243)
)
ResNet.trainable=False
out1=ResNet(输入[:,0])
out2=ResNet(输入[:,1])
out3=ResNet(输入[:,2])
...
my_模型=模型(输入=输入,输出=输出)
此外,为了更好地控制管道,最好使用numpy构建输入和输出数组,而不是将它们作为python列表:
testX=np.stack([
np.stack([images[0],images[1],images[2]],axis=0),
np.stack([images[3]、images[4]、images[5]、axis=0),
np.stack([images[6],images[7],images[8]],axis=0)
]#形状:(3,3,224,224,3)
testY=np.stack([1.0,0.0,1.0],axis=0)[:,无]#形状:(3,1)
你有9张图片,但只有3张地面真相,这是你的问题;如果每行都是3通道图像,如果是,请将它们连接起来。谢谢您的回答。尽管如此,不可能多次实例化ResNet,因为编译模型时会抛出错误(多个层具有相同的给定名称)。由于图层名称不可命名,因此这是一条死胡同。另一个答案的方法是有效的,但我将结合你关于辍学层的提示。谢谢:)哦,忘了那会是个问题。谢谢,让它起作用了。但是你确定它是out1=ResNet(inputs[:,0])
而不是out1=ResNet(inputs[0,:])
?因为我希望每个ResNet有一个图像,输入的尺寸如下:(imageNr,pixels\u height,pixels\u width,RGB)我的坏,一个批次中有三个图像序列,形状是(批次,3,height,width,RGB)
。索引保持不变,但我已经修复了形状注释。谢谢
ValueError: Data cardinality is ambiguous:
x sizes: 224, 224, 224, 224, 224, 224, 224, 224, 224
y sizes: 1, 1, 1
Make sure all arrays contain the same number of samples.
ResNet1 = ResNet50(include_top=False, weights="imagenet", input_shape=(224, 224, 3)
ResNet2 = ResNet50(include_top=False, weights="imagenet", input_shape=(224, 224, 3)
ResNet3 = ResNet50(include_top=False, weights="imagenet", input_shape=(224, 224, 3)
out1 = ResNet1(in1)
out2 = ResNet2(in2)
out3 = ResNet3(in3)
basis1 = GlobalAveragePooling2D()(out1) # this make a vector so you don't need flatten layer
basis1 = Dropout(0.7)(basis1)
basis2 = GlobalAveragePooling2D()(out2) # this make a vector so you don't need flatten layer
basis2 = Dropout(0.7)(basis2)
basis3 = GlobalAveragePooling2D()(out3) # this make a vector so you don't need flatten layer
basis3 = Dropout(0.7)(basis3)
concat = Concatenate()([basis1, basis2, basis3])
dense_1 = Dense(2048, activation='relu')(concat) # I would reduce nodes t0 256
# I would add a dropout layer here Dropout(.3)
dense_2 = Dense(1024, activation='relu')(dense_1)# I would reduce nodes to 32
output = Dense(1, activation='softmax')(dense_2)