Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多个图像输入到同一ResNet,导致输入不匹配_Python_Tensorflow_Keras_Input_Tensorflow2.0 - Fatal编程技术网

Python 多个图像输入到同一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

我正在尝试建立一个网络,其中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)