添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
tensorflow2.0-ValueError:A target array with shape was passed for an output of shape...问题解决
已于 2023-03-02 19:37:20 修改
2020-02-02 14:21:14

在Jupyter notebook训练一个多分类模型时遇到报错

问题:
喂入的是fashion_mnist数据集,训练和测试的图片都经过了归一化,标签也都转为独热编码

模型建立的代码如下:

model = tf.keras.Sequential()
model.add(tf.keras.layers.Flatten(input_shape = (28, 28)))
model.add(tf.keras.layers.Dense(128, activation = 'relu'))
model.add(tf.keras.layers.Dense(10, activation = 'softmax'))

之前运行的时候是没有报错的,
后来我打算添加层,试一下网络拟合能力有没有提升,
于是在上面的代码下面简单粗暴地加了一行:

model.add(tf.keras.layers.Dense(128, activation = 'relu'))

之后进行模型装配,指定损失函数为分类交叉熵

model.compile(optimizer = tf.keras.optimizers.Adam(learning_rate = 0.01),
              loss = 'categorical_crossentropy',
              metrics = ['acc'])

传入数据进行训练的时候就遇到报错:

model.fit(train_image, train_label_onehot, epochs = 5)

报错如下:

...
ValueError: A target array with shape (60000, 10) was passed for an output of shape (None, 128)
while using as loss `categorical_crossentropy`. 
This loss expects targets to have the same shape as the output.

原因:
添加网络层的时候没有修改输出神经元的个数。
将标签转为独热编码之后label.shape由(60000, )变为(60000, 10)
因此对应的输出的应该是10个神经元

解决:
128 改为10

model.add(tf.keras.layers.Dense(10, activation = 'relu'))

总结:
其实不应该这么直接修改网络层,
softmax层应置于最后一层。

在修改网络结构的时候要注意输出神经元的修改,
从第二层开始,
输入神经元由机器自动判断不用自己定义,
但输出神经元还是要自己判断。

keras保存模型时,使用的是m.save_weights,只保存了模型的权重而没有结构,直接使用keras.models.load_model就会报错。所以,可以重新构建相同结构的模型,(m.save_weights)使用m.load_weights;或者如上m.save,keras.models.load_model。 参考:https://blog.csdn.net/nima1994/article/details/91045745 但是我的问题是:我导入的模型是别人的,如何直接导入只有权重没有结构的模型呢? 1、keras.models.load_model() 读取网络、权重 通常不会报出这种错误,但还是有奇人能搞出来。这种错误通过断点调试就可以发现错误 在利用Python进行绘图时可能报出这种错误。 Traceback (most recent call last): File "E:\Anaconda3\envs\python27\Lib\lib-tk\Tkinter.py", line 1542, in __call__ return self.func(*args) File "E:\Anaconda3\envs\python27\lib\site-packages\matplotlib\backends\_backend_tk.py", l const CometMlAPI = require('comet-ml-api'); const apiKey = 's9ILl8ox92nZSTVh8eo4B47LC'; const cometMl = new CometMlAPI(apiKey, 'v1'); cometMl.projects().then((response) => { console.log(response); }).catch(e => { console.log(e); cometMl.projects().then((response) => {}) cometMl.experiments(pro CookieCutter值错误 将存储库克隆到当前目录后,运行 cookiecutter cookiecutter-value-error --config-file=cookiecutter-value-error/init.yaml --no-input File ".../python3.8/site-packages/poyo/_nodes.py", line 47, in __init__ raise ValueError("Parent of ChildMixin instance needs to be a Container.") ValueError: Parent of ChildMixin instance needs to be a Container. 2、脚本重启 3、加载模型:model.load_weights(‘./model.h5’) 4、模型报错:ValueError: You are trying to load a weight file containing 12 layers into a model with 0 layers. 问题分析: 模型创建后还没有编译,一般是在模型加载前调用model.build(input_shape), 但我通过Dataset将输入已经变为dict格式了,暂时没找这样输入怎么匹配input_shap API的用户体验设计原文:User experience design for APIs 作者:Francois Chollet译者:夜风轻扬译者注:什么样的API才是好的API?如何开发出用户乐于使用的API?请阅读下文。编写代码不仅仅是人与电脑间的事。代码也不只和电脑有关;还会影响到用户。程序员编写的代码会被其他程序员阅读、使用和维护。程序员只有使用顺手的工具,心情舒畅的时候才会写出更好更多的 过拟合问题实战 1.构建数据集 我们使用的数据集样本特性向量长度为 2,标签为 0 或 1,分别代表了 2 种类别。借助于 scikit-learn 库中提供的 make_moons 工具我们可以生成任意多数据的训练集。 import matplotlib.pyplot as plt # 导入数据集生成工具 import numpy as np import seaborn as sns from sklearn ValueError: Error when checking target: expected activation_7 to have shape (2,) but got array with shape (1,) 原贴:https://stackoverflow.com/questions/49392972/error-when-checking-target-expected-dens... 对keras模型进行编译,当loss是categorical_crossentropy的时候, model.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.Adadelta(), metrics=['accuracy']) 需要将l... categorical_crossentropy 本文讲解的是categorical_crossentropy损失函数,categorical_crossentropy和binary_crossentropy比较容易混淆,想了解binary_crossentropy可以点击查看。本文将通过数学公式+代码的形式讲解。 这是我使用resnet50.h5进行训练新的模型时出现的问题,而出现此问题的原因是模型的resnet的类别是1000类。而此时的类别是7类,类别不匹配造成的,所以解决方法是:在加载模型权重是设置by_name=True,意思是允许进行fine-tuning微调 model.load_weights(weight_path,by_name=True)