zoukankan      html  css  js  c++  java
  • tensorflow2.0-ValueError:A target array with shape was passed for an output of shape...问题解决

    在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层应置于最后一层。

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

  • 相关阅读:
    struct resbuf 结构就象LISP里面的表(
    CString互转int
    C++中std::sort/std::stable_sort/std::partial_sort的区别及使用
    *ARX对数据的类型和单位进行转换
    c++常见容器操作
    C++中const关键字的使用方法,烦透了一遍一遍的搜,总结一下,加深印象!!!
    ARX 简单程序(不错的例子)
    ARX对象的一些文字说明
    CAD ObjectARX扩展工具的源码(一)
    CAD ObjectARX扩展工具的源码(三)
  • 原文地址:https://www.cnblogs.com/peijz/p/13047986.html
Copyright © 2011-2022 走看看