GVKun编程网logo

from_logits = True和from_logits =False获得针对UNet的tf.losses.CategoricalCrossentropy的不同训练结果

5

关于from_logits=True和from_logits=False获得针对UNet的tf.losses.CategoricalCrossentropy的不同训练结果的问题就给大家分享到这里,感谢

关于from_logits = True和from_logits =False获得针对UNet的tf.losses.CategoricalCrossentropy的不同训练结果的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于1、求 loss:tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits (logits, labels, name=None))、Android - Log的等级: Verbose,Debug,Info,Warn,Error - ALOGV,ALOGD,ALOGI,ALOGW,ALOGE、android – AlertDialog setTitle()和FragmentDialog中的setMessage等价物、android-Retrofit2 HttpLoggingInterceptor Logcat等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

from_logits = True和from_logits =False获得针对UNet的tf.losses.CategoricalCrossentropy的不同训练结果

from_logits = True和from_logits =False获得针对UNet的tf.losses.CategoricalCrossentropy的不同训练结果

如果我Softmax Activation像这样设置最后一层,我正在用unet进行图像语义分割工作:

...conv9 = Conv2D(n_classes, (3,3), padding = ''same'')(conv9)conv10 = (Activation(''softmax''))(conv9)model = Model(inputs, conv10)return model...

然后使用即使只有一个训练图像loss =tf.keras.losses.CategoricalCrossentropy(from_logits=False) ,训练也 不会收敛

但是,如果我没有Softmax Activation像这样设置最后一层:

...conv9 = Conv2D(n_classes, (3,3), padding = ''same'')(conv9)model = Model(inputs, conv9)return model...

然后使用loss = tf.keras.losses.CategoricalCrossentropy(from_logits=True) 训练将
收敛 为一个训练图像。

我的groundtruth数据集是这样生成的:

X = []Y = []im = cv2.imread(impath)X.append(im)seg_labels = np.zeros((height, width, n_classes))for spath in segpaths:    mask = cv2.imread(spath, 0)    seg_labels[:, :, c] += maskY.append(seg_labels.reshape(width*height, n_classes))

为什么?我的用法有问题吗?

这是我的git实验代码:https :
//github.com/honeytidy/unet
您可以检出并运行(可以在cpu上运行)。您可以更改激活层和CategoricalCrossentropy的from_logits并查看我说的内容。

答案1

小编典典

将“ softmax”激活推入交叉熵损失层可大大简化损失计算并使其在数值上更稳定。
在您的示例中,可能存在这样的情况:数字问题足够严重,导致培训过程对该from_logits=False选项无效。

1、求 loss:tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits (logits, labels, name=None))

1、求 loss:tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits (logits, labels, name=None))

1.求loss:

tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits, labels, name=None))

第一个参数logits:就是神经网络最后一层的输出,如果有batch的话,它的大小就是[batchsize,num_classes],单样本的话,大小就是num_classes

第二个参数labels:实际的标签,大小同上

具体的执行流程大概分为两步:

  1. 第一步是先对网络最后一层的输出做一个softmax,这一步通常是求取输出属于某一类的概率,对于单样本而言,输出就是一个num_classes大小的向量([Y1,Y2,Y3...]其中Y1,Y2,Y3...分别代表了是属于该类的概率
  2. 第二步是softmax的输出向量[Y1,Y2,Y3...]和样本的实际标签做一个交叉熵,公式如下:

其中指代实际的标签中第i个的值(用mnist数据举例,如果是3,那么标签是[0,0,0,1,0,0,0,0,0,0],除了第4个值为1,其他全为0)

就是softmax的输出向量[Y1,Y2,Y3...]中,第 i 个元素的值

显而易见,预测越准确,结果的值越小(别忘了前面还有负号),最后求一个平均,得到我们想要的loss

注意!!!这个函数的返回值并不是一个数,而是一个向量,如果要求交叉熵,我们要再做一步tf.reduce_sum操作,就是对向量里面所有元素求和,最后才得到如果求loss,则要做一步tf.reduce_mean操作,对向量求均值!

import tensorflow as tf  
  
logits=tf.constant([[1.0,2.0,3.0],[1.0,2.0,3.0],[1.0,2.0,3.0]])   
y=tf.nn.softmax(logits)   
y_=tf.constant([[0.0,0.0,1.0],[0.0,0.0,1.0],[0.0,0.0,1.0]])   
cross_entropy = -tf.reduce_sum(y_*tf.log(y))  #交叉熵公式
cross_entropy2=tf.reduce_sum(tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y_))#代入函数
  
with tf.Session() as sess:  
    softmax=sess.run(y)  
    c_e = sess.run(cross_entropy)  
    c_e2 = sess.run(cross_entropy2)  
    print("step1:softmax result=")  
    print(softmax)  
    print("step2:cross_entropy result=")  
    print(c_e)  
    print("Function(softmax_cross_entropy_with_logits) result=")  
    print(c_e2)

step1:softmax result=
[[0.09003057 0.24472848 0.66524094]
[0.09003057 0.24472848 0.66524094]
[0.09003057 0.24472848 0.66524094]]
step2:cross_entropy result=
1.222818
Function(softmax_cross_entropy_with_logits) result=
1.2228179

Android - Log的等级: Verbose,Debug,Info,Warn,Error - ALOGV,ALOGD,ALOGI,ALOGW,ALOGE

Android - Log的等级: Verbose,Debug,Info,Warn,Error - ALOGV,ALOGD,ALOGI,ALOGW,ALOGE


http://blog.csdn.net/liuxd3000/article/details/13768141


1、  目的:

为了规范软件工程师在Android代码编写过程中输出Log的行为,使得发布的产品中打印的Log是必须的,打印的Log的级别是能真实反映此Log对应的级别,标签、Log内容具有很好的可读性。

2、  适用范围

android平台Javac++c代码编写。

3、  Log的调用及等级介绍

(1)Log的等级有Verbose,Debug,Info,Warn,Error

(2)java层调用:在java层调用import android.util.Log,在需要打印Log的地方执行Log.v,Log.d,Log.i,Log.w,Log.e.

(3)cc++层调用:在c,c++层包含此头文件:#include <cutils/log.h>,在需要调用Log的地方执行:ALOGV,ALOGD,ALOGI,ALOGW,ALOGE

(4)、各个Log等级的使用

Verbose: 开发调试过程中一些详细信息,不应该编译进产品中,只在开发阶段使用。(参考api文档的描述:Verbose should never be compiled into anapplication except during development

Debug: 用于调试的信息,编译进产品,但可以在运行时关闭。(参考api文档描述:Debug logs are compiled in but stripped atruntime

Info:例如一些运行时的状态信息,这些状态信息在出现问题的时候能提供帮助。

Warn:警告系统出现了异常,即将出现错误。

Error:系统已经出现了错误。

InfoWarnError这三个等级的Log的警示作用依次提高,需要一直保留。这些信息在系统异常时能提供有价值的分析线索。

4、  具体规则

1)、Verbose等级的Log,请不要在user版本中出现。Verbose级别的Log输出参见下面例子。

示例Java部分:

import android.os.Build;

import android.util.Log

final public Boolean isEng =Build.TYPE.equals("eng");

if (isEng)

 Log.v(LOG_TAG,LOG_MESSAGE);

 

示例c、c++部分:

#include<cutils/log.h>

char value[PROPERTY_VALUE_MAX];

int isEng=0;

property_get("ro.build.type",value, "user");

isEng=strcmp(value, "eng");

if (isEng)

 ALOGV();

 

2)、Debug等级的log,默认不开启,通过终端命令开启。

Debug级别的log输出参见下面例子。

示例Java部分:

import android.util.Log

final String TAG=”MyActivity”;

final public Boolean LOG_DEBUG = Log.isLoggable(TAG, Log.DEBUG);

 

if (LOG_DEBUG)

  Log.d(LOG_TAG,LOG_MESSAGE);

 

运行时开启log: 在终端输入:setprop log.tag.MyActivity DEBUG

运行时关闭log: 在终端输入:setprop log.tag.MyActivity INFO

 

示例c、c++部分:

#include<cutils/log.h>

#defineLOG_CTL debug.MyActivity.enablelog

charvalue[PROPERTY_VALUE_MAX];

int isDebug=0;

property_get(LOG_CTL,value, "0");

isDebug=strcmp(value,"1");

if (isDebug)

  ALOGD();

运行时开启log: 在终端输入:setpropdebug.MyActivity.enablelog 1

运行时关闭log: 在终端输入:setpropdebug.MyActivity.enablelog 0

 

3)、InfoWarnError等级的Log禁止作为普通的调试信息使用,这些等级的Log是系统出现问题时候的重要分析线索,如果随意使用,将给Log分析人员带来极大困扰。请参考前面的等级介绍合理使用。

(4)、禁止使用new Exception("print trace").printStackTrace()或者Log. getStackTraceString(Exception)方式打印普通调试信息,因为这种方式打印Log非常消耗系统资源。此种方式打印Log一般只出现try..catch某个异常使用。

5)、Logtag命名,使用Activity名称或者类、模块的名称,不要出现自己的姓名拼音或其他简称。在c++/c代码中调用ALOGD等宏函数,参数没有传入tag,需要在文件头部#define LOG_TAG"YOUR_TAG_NAME"

6)、Log的内容,不要出现公司名称、个人名称或相关简称,Log内容不要出现无意义的内容,如连续的等号或星号或连续的数字等,Log内容要方便其他分析Log的人员查看。

7)、Log输出的频率需要控制,例如1s打印一次的Log,尽量只在eng版本使用,user版本如需开启,请默认关闭,通过设置setprop命令来开启。


android – AlertDialog setTitle()和FragmentDialog中的setMessage等价物

android – AlertDialog setTitle()和FragmentDialog中的setMessage等价物

我正在重写Honeycomb的现有应用程序,但我遇到了一个问题.在现有应用程序中,我们使用默认标题和消息值创建AlertDialog,然后在需要时替换它们.要替换它们,我们使用setTitle()和setMessage():

AlertDialog dialog = getDialog();
if (some condition) {
    dialog.setTitle(R.string.error1);
    dialog.setMessage(getResources().getString(R.string.error1_msg));
}
else {
    dialog.setTitle(R.string.error2);
    dialog.setMessage(getResources().getString(R.string.error2_msg));
}

但是,现在我们正在使用DialogFragment,没有setTitle()或setMessage()的方法,因此我们无法在创建后更改它.这种情况有解决方法,还是我们运气不好?

解决方法

您必须扩展DialogFragment以提供内容.有关示例和其他选项,请参见 documentation.

android-Retrofit2 HttpLoggingInterceptor Logcat

android-Retrofit2 HttpLoggingInterceptor Logcat

可能是一个新手问题,但我想知道我实际上在哪里捕获了log cat中的日志.有没有放置日志的地方,要使用的特殊正则表达式等?这就是我的拦截器的样子:

HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

        OkHttpClient okClient = new OkHttpClient.Builder().addInterceptor(interceptor).build();

        // Retrofit setup


        Retrofit client = new retrofit2.Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .client(okClient)
                .build();

这是一个API调用,其中body为null

 retrofit2.Call<GeneralTokenResponse> generalTokenResponseCall = ApiInterface.getGeneralAccesstoken(ApiGeneral.API_VERSION);
        generalTokenResponseCall.enqueue(new retrofit2.Callback<GeneralTokenResponse>() {
            @Override
            public void onResponse(retrofit2.Call<GeneralTokenResponse> call, retrofit2.Response<GeneralTokenResponse> response) {
                Log.d("DEBUG", "body: "+response.body());

            }

            @Override
            public void onFailure(retrofit2.Call<GeneralTokenResponse> call, Throwable t) {

            }
        });

解决方法:

我这样使用:

    // init okhttp 3 logger
    HttpLoggingInterceptor logging = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
        @Override public void log(String message) {
            Log.d("mytag", "OkHttp: " + message);
        }
    });
    logging.setLevel(HttpLoggingInterceptor.Level.BODY);

关于from_logits = True和from_logits =False获得针对UNet的tf.losses.CategoricalCrossentropy的不同训练结果的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于1、求 loss:tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits (logits, labels, name=None))、Android - Log的等级: Verbose,Debug,Info,Warn,Error - ALOGV,ALOGD,ALOGI,ALOGW,ALOGE、android – AlertDialog setTitle()和FragmentDialog中的setMessage等价物、android-Retrofit2 HttpLoggingInterceptor Logcat等相关知识的信息别忘了在本站进行查找喔。

本文标签: