Giter VIP home page Giter VIP logo

Comments (8)

lsh1994 avatar lsh1994 commented on June 9, 2024 1

你说的是对的,模型最后可以改为:

    o = Conv2D(nClasses, (1, 1), padding="same")(o)
    o = BatchNormalization()(o)
    # o = Activation("relu")(o)
    #
    # o = Reshape((-1, nClasses))(o)
    o = Activation("softmax")(o)

    model = Model(inputs=img_input, outputs=o)
    return model

此时模型最后就是(None,320,320,15),注意要修改LoadBatches.py函数getSegmentationArr形如:

def getSegmentationArr(seg, nClasses, input_height, input_width):

    seg_labels = np.zeros((input_height, input_width, nClasses))

    for c in range(nClasses):
        seg_labels[:, :, c] = (seg == c).astype(int)

    # seg_labels = np.reshape(seg_labels, (input_height, input_width, nClasses))
    return seg_labels

再运行LoadBatches.py应得:(16, 320, 320, 3) (16, 320, 320, 15)。
Activation层按照最后一个维度softmax,交叉熵只要y_1,y_2维度相同,然后求平均。过几日我会修改这些容易混淆的地方。(代码在你手,想咋改就咋改😂)

参考:
https://tensorflow.google.cn/api_docs/python/tf/nn/softmax_cross_entropy_with_logits_v2

from keras-segmentation.

KaiiZhang avatar KaiiZhang commented on June 9, 2024

非常感谢!一开始没有注意到LoadBatches.py这个函数中进行了reshape(seg_labels, (-1, nClasses))的操作,现在明白了!
我复现了你代码中的fcn8和segnet,效果很好。我记录一下我过程中遇到的问题,希望能帮助到你后续完善项目,或者帮助别人复现代码。
1.train.py中 from Models import FCN8, FCN32,SegNet 会报错no model named Models,我的解决方法是在Models 文件夹下加了一个__init__.py的空文件
2.SegNet.py中 line90:Vgg_streamlined.load_weights(r"E:\Code\PycharmProjects\keras-segmentation\data\vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5") 使用的是绝对路径,复现的时候要改成自己的路径
3.部分文件中有中文注释,需要添加 # coding=UTF-8 防止字符报错
4.LoadBatches.py中我用的keras版本是2.1.6-tf,其中取消掉了G. next ()方法,需修改为next(G)

from keras-segmentation.

Chenyang-Qu avatar Chenyang-Qu commented on June 9, 2024

我在使用segnet的时候遇到一个error,最后一层的activation显示
ValueError: Error when checking model target: expected activation to have 4 dimensions, but got array with shape (32, 10)
我的输入是64*64的rgb图像,总共10类,最后一层activation以后应该是(4096,10)没错啊。为什么会报这个错啊?求教大神!

from keras-segmentation.

KaiiZhang avatar KaiiZhang commented on June 9, 2024

我在使用segnet的时候遇到一个error,最后一层的activation显示
ValueError: Error when checking model target: expected activation to have 4 dimensions, but got array with shape (32, 10)
我的输入是64*64的rgb图像,总共10类,最后一层activation以后应该是(4096,10)没错啊。为什么会报这个错啊?求教大神!

你有改模型哪里么,更详细地说一下。其次是如果你自己找原因地话,主要检查一下激活层输入和输出地维度。检查是不是改动了哪里造成维度发生了变化

from keras-segmentation.

Chenyang-Qu avatar Chenyang-Qu commented on June 9, 2024

我在使用segnet的时候遇到一个error,最后一层的activation显示
ValueError: Error when checking model target: expected activation to have 4 dimensions, but got array with shape (32, 10)
我的输入是64*64的rgb图像,总共10类,最后一层activation以后应该是(4096,10)没错啊。为什么会报这个错啊?求教大神!

你有改模型哪里么,更详细地说一下。其次是如果你自己找原因地话,主要检查一下激活层输入和输出地维度。检查是不是改动了哪里造成维度发生了变化

模型我没有改动,我把loadbatch这里改了,我是直接用flow_from_directory()读取生成batch的,没有手工读取。总共10类,我把batch_size设置为1以后还特地输出看了一下,是一张图片+它的标签,一个四维的数组。
最开始的input是(None,64,64,3),最后一个激活层前是(None,4096,10),激活层后也是(None,4096,10),如果按照论文理解的话,应该是把一个4096的图像标注清楚类型了吧。。我现在有点不明白,为什么会报错维度错误。。。
我打算尝试一下手工读取数据,就是仿照您的loadbatch函数来读取,我怀疑是flow_from_directory()这个生成器我没有理解透彻,这毕竟是个库函数。

from keras-segmentation.

KaiiZhang avatar KaiiZhang commented on June 9, 2024

我在使用segnet的时候遇到一个error,最后一层的activation显示
ValueError: Error when checking model target: expected activation to have 4 dimensions, but got array with shape (32, 10)
我的输入是64*64的rgb图像,总共10类,最后一层activation以后应该是(4096,10)没错啊。为什么会报这个错啊?求教大神!

你有改模型哪里么,更详细地说一下。其次是如果你自己找原因地话,主要检查一下激活层输入和输出地维度。检查是不是改动了哪里造成维度发生了变化

模型我没有改动,我把loadbatch这里改了,我是直接用flow_from_directory()读取生成batch的,没有手工读取。总共10类,我把batch_size设置为1以后还特地输出看了一下,是一张图片+它的标签,一个四维的数组。
最开始的input是(None,64,64,3),最后一个激活层前是(None,4096,10),激活层后也是(None,4096,10),如果按照论文理解的话,应该是把一个4096的图像标注清楚类型了吧。。我现在有点不明白,为什么会报错维度错误。。。
我打算尝试一下手工读取数据,就是仿照您的loadbatch函数来读取,我怀疑是flow_from_directory()这个生成器我没有理解透彻,这毕竟是个库函数。

我还是不太确定问题在哪里,不过如果没有改模型的话,那么模型内部是没问题的,需要检查的是模型的输入和输出就好了。
我猜测一个原因。正常情况下,reshape层会导致张量shape变为(None,4096,10),经过激活层后模型的输出shape为(None,4096,10)。那么为模型提供的Label的shape也应该是(None,4096,10),这两个shape要一致才可以计算交叉熵函数。会不会是输出和你提供的Label图像的shape不一致。

from keras-segmentation.

lsh1994 avatar lsh1994 commented on June 9, 2024

flow_from_directory()返回的是图片和图片对应的标签(图片所在文件夹名称),而不是图片对应同样大小的标签矩阵(h,w,C)。可以尝试构造迭代对象,next()一下

from keras-segmentation.

Chenyang-Qu avatar Chenyang-Qu commented on June 9, 2024

flow_from_directory()返回的是图片和图片对应的标签(图片所在文件夹名称),而不是图片对应同样大小的标签矩阵(h,w,C)。可以尝试构造迭代对象,next()一下

是的,我查阅了一下keras的文档,这个函数返回的确实是一个标签的一维数组而不是矩阵。谢谢您!
我得想个办法了,我的数据集没有给出mask imag,只有各个图像的名称,我得考虑怎么生成label矩阵

from keras-segmentation.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.