微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

keras的preprocess_input导致ValueError:数据基数不明确

如何解决keras的preprocess_input导致ValueError:数据基数不明确

我将keras用于回归模型。我正在尝试微调VGG16。一切正常。添加tensorflow.keras.applications.vgg16.preprocess_input以根据VGG16预处理图像后,出现以下错误

ValueError:数据基数不明确: x尺寸:1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 y码:422 确保所有阵列都包含相同数量的样本。

加载图像后,我遍历主题并应用此方法

from keras.preprocessing.image import img_to_array

images = []
for img in loaded_images:
    img = img_to_array(img)
    img = img.reshape((1,img.shape[0],img.shape[1],img.shape[2]))
    img = preprocess_input(img)
    images.append(img)

actual = actual.reshape(1,-1)
assert len(images) == len(actual)

之后,我将图像划分为训练,有效和测试集,如下所示:

修改

train_images,test_images,train_actual_score,test_actual_score = train_test_split(images,scaled_train_mos,test_size=0.20,random_state=42)

最后,我调用fit函数

history = model.fit(x=train_images,y=train_actual_score,validation_data=(test_images,test_actual_score),epochs=30,batch_size=8,verbose=2)

更新

这里是standalone code来重现上述问题。

解决方法

为了使代码正常工作,我对您的代码做了一些更改:

第一名: 在生成随机数据时,您正在生成大小为(244,24,3)的img,但是您的模型将输入为(224,224,3)

# original
im = np.random.randint(0,255,(244,244,3)) 
# changes
im = np.random.randint(0,(224,3))

第二名: 更改了重塑功能:

# Original
from keras.preprocessing.image import img_to_array
images_ = []
for img in images:
    img = img_to_array(img)
    img = img.reshape(1,img.shape[0],img.shape[1],img.shape[2])
    img = preprocess_input(img)
    images_.append(img)
# changed
from keras.preprocessing.image import img_to_array

images_ = []
for img in images:
    img = img_to_array(img)
    img = img.reshape(img.shape[0],img.shape[2])
    img = preprocess_input(img)
    images_.append(img)

您使用的整形方法生成的(50,1,244,244,3)不正确。尽管我不确定为什么首先要使用重塑,因为您的数据已经采用了正确的格式。

第三名: 您将分数重塑为形状(1,50),这意味着您的训练数据仅包含1个样本和50个值。无需更改分数的形状。 (50,1)是正确的形状,表示您有50个样本和预测值。

第四名: 将列表转换为numpy数组:

train_images = np.array(train_images)
test_images = np.array(test_images)
train_score = np.array(train_score)
test_score = np.array(test_score)

查看完整的工作代码here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。