预测概率一直不变/损失和精确度一直不变

预测概率一直不变/损失和精确度一直不变

这个问题困扰了好久,今天2022-03-01找到了解决办法,原理未懂

参考链接:https://blog.csdn.net/weixin_39614561/article/details/110763018

原文标题:python神经网络模型调用后预测值不变_Keras构建神经网络踩坑(解决model.predict预测值全为0.0的问题)...

原文内容:

终于构建出了第一个神经网络,Keras真的很方便。

之前不知道Keras这么方便,在构建神经网络的过程中绕了很多弯路,最开始学的TensorFlow,后来才知道Keras。

TensorFlow和Keras的关系,就像c语言和python的关系,所以Keras是真的好用。

搞不清楚数据的标准化和归一化的关系,想对原始数据做归一化,却误把数据做了标准化,导致用model.predict预测出来的值全是0.0,在网上搜了好久但是没搜到答案,后来自己又把程序读了一遍,突然灵光一现好像是数据归一化出了问题,于是把数据预处理部分的标准化改成了归一化,修改过来之后才能正常预测出来值,才得到应有的数据趋势。(注记:具体就是简单修改了这一步,我自己做的入侵检测方向)

标准化:

(x-mean(x))/std(x) 这是使用z-score方法规范化

归一化:

(x-min(x))/(max(x)-min(x)) 这是常用的最小最大规范化方法

补充知识:keras加载已经训练好的模型文件,进行预测时却发现预测结果几乎为同一类(本人预测时几乎均为为第0类)**

原因:在进行keras训练时候,使用了keras内置的数据读取方式,但是在进行预测时候,使用了自定义的数据读取方式,本人为图片读取。

解决办法查看如下代码:

# 训练:

train_gen = ImageDataGenerator(rotation_range=10,

                                width_shift_range=0.2,

                                shear_range=0.2,

                                zoom_range=0.2,

                                fill_mode='constant',

                                cval=0)

train_generator = train_gen.flow_from_directory(train_path,

                                                target_size=(224, 224),

                                                batch_size=16,

                                                class_mode='categorical',

                                                save_to_dir=train_g,

                                                save_prefix='man',

                                                save_format='jpg')
​
# 预测

img = cv2.imread(img_path)

img = cv2.resize(img, (row, col))

img = np.expands(img, axis=0)

out = model.predict(img)

​

# 上述方法是不行的,仔细查看keras内置读取方式,可以观察到内置了load_img方式

注记:这段代码没看懂,不像是python代码?

# 因此,我们在预测时候,将读取图片的方式改为

from keras.preprocessing.image import load_img, img_to_array

img = load_img(img_path)

img = img_to_array(img, target_size=(row, col))

img = np.expands(img, axis=0)

out = model.predict(img)

注:本文意在说明 对训练数据和预测数据的读取、预处理方式上应该在某种程度上保持一致,从而避免训练结果和真实预测结果相差过大的情况。

以上这篇Keras构建神经网络踩坑(解决model.predict预测值全为0.0的问题)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

本文标题: Keras构建神经网络踩坑(解决model.predict预测值全为0.0的问题)

本文地址: http://www.cppcns.com/jiaoben/python/324713.html

相关资源:Keras构建神经网络踩坑(解决model.predict预测值全为0.0的问题...

2022.03.17后续注记,虽然准确率提升了,但是上升的很少,而且跳动幅度很大,怀疑是数据集或者训练有问题

np.isnull(Dataframe).any()和np.isinf(Dataframe).any() 

2022.03.17 

在有字符串的数据集中,np.isnull()可以正常使用,np.isinf()需删除掉有字符串的列才可以用

pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', None)
# 显示全部结果,全部行和全部列显示的最大数量不设限
x14.isnull().all()
np.isinf(x14).any()
#两个判断的用法也不一样

2022.04.28

TypeError: ufunc 'isinf' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

numpy.isfinite:Test element-wise for finiteness (not infinity and not Not a Number).

notes:Not a Number, positive infinity and negative infinity are considered to be non-finite.

但我在识别标签列的object对象时,就报上面的错,要把标签列删掉,只剩下float64和int数值类型时才可以用

numpy.isinf:Test element-wise for positive or negative infinity.

那这样的话两个函数就没什么区别了

原文链接:https://blog.csdn.net/lxdssg/article/details/81233837

这里有一个坑点要说明一下,在修改神经网络的过程中,发现精确度一直不变,这说明模型不收敛,一层一层的查找问题才发现是prediction的值可能为0,导致交叉熵出现-Naf这种情况。解决办法如上所示,在prediction的后面加一个极小数,防止log出现负无穷的情况。同时参考其他文章,在倒数第二层的激活函数上由ReLU改为sigmoid,原因是ReLU输出可能相差很大(比如0和几十),这时再经过softmax就会出现一个节点为1其它全0的情况。softmax的cost function里包含一项log(y),如果y正好是0就没法算了。

你可能感兴趣的:(深度学习,python,神经网络)