Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.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 重塑的RESNET50输入是一个值为1638400的张量,但需要25088的倍数_Python_Tensorflow_Machine Learning_Keras_Deep Learning - Fatal编程技术网

Python 重塑的RESNET50输入是一个值为1638400的张量,但需要25088的倍数

Python 重塑的RESNET50输入是一个值为1638400的张量,但需要25088的倍数,python,tensorflow,machine-learning,keras,deep-learning,Python,Tensorflow,Machine Learning,Keras,Deep Learning,我有一个数据集,包含8个类的2513个图像,我想在上面微调ResNet50。这是我的代码: 导入keras 从keras.preprocessing.image导入ImageDataGenerator 从sklearn.model\u选择导入列车\u测试\u拆分 将matplotlib.pyplot作为plt导入 从tensorflow.keras.applications.resnet50导入resnet50 从tensorflow.keras.layers导入稠密、激活、重塑、Conv2D、

我有一个数据集,包含8个类的2513个图像,我想在上面微调ResNet50。这是我的代码:

导入keras
从keras.preprocessing.image导入ImageDataGenerator
从sklearn.model\u选择导入列车\u测试\u拆分
将matplotlib.pyplot作为plt导入
从tensorflow.keras.applications.resnet50导入resnet50
从tensorflow.keras.layers导入稠密、激活、重塑、Conv2D、展平、全局平均池2D、退出
将numpy作为np导入
从tensorflow.keras.models导入模型
从tensorflow.keras.optimizers导入SGD、Adam和Nadam
DATA_DIR='DATA/'
列车\数据发生器=图像数据发生器(
#重新缩放=1./255,
#剪切范围=0.2,
#缩放范围=0.2,
#水平翻转=真,
验证_分割=0.3
)
列车发电机=列车数据发电机。来自列车目录的流量(数据目录,
批次尺寸=50,
class_mode='classifical',
("培训")
验证\u生成器=来自\u目录的列车\u datagen.flow\u(
数据目录,与培训数据目录相同
批次尺寸=50,
class_mode='classifical',
subset='validation')#设置为验证数据
#X_序列,X_测试,y_序列,y_测试=序列测试分割(X,y,测试大小=0.20,随机状态=33)
基本模型=ResNet50(权重=imagenet',包括顶部=True)
head_模型=基础_模型。获取_层(“conv5_块1_1_conv”)。输出
头部模型=密集(512,activation=“relu”)(头部模型)
head_模型=辍学率(0.5)(head_模型)
head_模型=展平()(head_模型)
#底出=重塑(25088,)(底出)
头部模型=密集(1,激活=“乙状结肠”)(头部模型)
#将头部FC模型放置在基础模型的顶部(这将成为
#我们将培训的实际模型)
模型=模型(输入=基本模型。输入,输出=头部模型)
model.summary()
#在基础模型中的所有层上循环并冻结它们,以便它们
#*不*在第一次培训过程中更新
对于基本模型层中的层:
layer.trainable=错误
#sgd=sgd(lr=lrate,动量=0.9,衰变=衰变,nesterov=False)
亚当=亚当(lr=0.001)
compile(优化器=adam,loss='classifical_crossentropy',metrics=['accurity'])
1.2型拟合发生器(
列车发电机,
每个历元的步长=序列生成器。样本//32,
验证数据=验证生成器,
验证\u步骤=验证\u生成器.samples//32,
时代=100)
模型保存(“asd.h5”)
但运行此命令会引发以下错误:

InvalidArgumentError:重塑的输入是一个值为1638400的张量,但请求的形状需要25088的倍数 [[node model_8/展平_7/重塑(定义于..)


我要做些什么来修复它?

看起来有两件事你需要考虑或保证。首先,你加载<代码> ReNET50 <它的代码>重量> /代码>和<代码>包含> 参数,但没有定义<代码>输入形状> /代码>,与默认值(<代码> 224, 224, 3 < /代码>)同时,您在
flow\u from\u directory
中定义生成器,您也没有设置
image\u size
,它使用
color\u mode=rgb
设置
(256,256)
。因此,您可能需要查看输入形状不匹配的问题。这也是

其次,正如您所提到的,您有8个类来分类,并为您的模型将损失函数设置为
category\u crossentropy
,那么您的最后一层应该更像这样:

# head_model = Dense(1, activation="sigmoid")(head_model) # No
head_model = Dense(8, activation="softmax")(head_model)   # Yes
在确保这些细节之后,模型应该按预期运行

from tensorflow.keras.applications import ResNet50
from tensorflow.keras.layers import Dense, Dropout, Flatten
from tensorflow.keras import Model 

base_model = ResNet50(weights='imagenet', include_top=True)
head_model = base_model.get_layer("conv5_block1_1_conv").output
head_model = Dense(512, activation="relu")(head_model)
head_model = Dropout(0.5)(head_model)
head_model = Flatten()(head_model)
head_model = Dense(8, activation="softmax")(head_model)
model = Model(inputs=base_model.input, outputs=head_model)

import numpy as np 
img = np.random.randint(0, 255, size=(2, 224, 224, 3))
model.compile(optimizer= 'adam', loss='categorical_crossentropy', 
               metrics=['accuracy'])
pred = model.predict(img)
pred.shape
(2, 8)