1.keras中使用相同的loss与metrics,都指定为mse,为什么训练时每轮完成后它们数值不一样?

答:

此时的loss是指完成最后一个batch后得到的这轮epoch的loss的加权平均,权重就是每个batch的样本数,(因为最后一个batch样本数往往跟训练时指定的不一样),完成最后一个batch后,此时loss已经固定了,但是仍然需要反向更新网络中的参数。注意,metrics是在这次更新完参数后对标签值和预测值进行计算,这里的预测值是模型训练完成后再正向传播得到的ouput,因此相比于loss中的y_pred,metrics的y_pred使用新的神经网络参数计算的,自然数值也就不一样了。

链接:https://www.zhihu.com/question/323251494/answer/719247402


20200311

1.运行如下代码,会发现model.summary()那里报错了

from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense,Flatten
#categorical_labels = to_categorical(int_labels, num_classes=None)
(X_train, y_train), (X_test, y_test) = mnist.load_data()
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
X_train = X_train[:10000]/255.0
y_train = y_train[:10000]
X_test = X_test[:10000]/255.0
y_test = y_test[:10000]
model = Sequential()
model.add(Flatten())
model.add(Dense(units = 512, input_dim = 28*28,activation = 'relu'))
model.add(Dense(units = 32,activation = 'relu'))
model.add(Dense(units = 10,activation = 'softmax'))model.summary()# model.compile(loss='categorical_crossentropy', optimizer='adam',metrics = ['acc'])
# model.fit(X_train, y_train, epochs=5, batch_size=128, verbose=1)

ValueError: This model has not yet been built. Build the model first by calling `build()` or calling `fit()` with some data, or specify an `input_shape` argument in the first layer(s) for automatic build.

意思是你还没告诉模型输入的尺寸格式,他自然没法给你返回summary。

解决方式也告诉你了,有如下几种:

1.需要在model.summary()上面写一句:model.build((None,28, 28))

参数最开始的这个None,代表的意思应该是数据样本个数,这里你替换成其他任意数值都是可以的。甚至(None,28,28,1)也可以。

但是有个问题,summary是下图这样的,Output Shape的格式是multiple,不显示具体值,也不知道为啥?

Model: "sequential_4"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
flatten_4 (Flatten)          multiple                  0         
_________________________________________________________________
dense_9 (Dense)              multiple                  401920    
_________________________________________________________________
dense_10 (Dense)             multiple                  16416     
_________________________________________________________________
dense_11 (Dense)             multiple                  330       
=================================================================
Total params: 418,666
Trainable params: 418,666
Non-trainable params: 0

2.先调用下面注释掉的fit,让他自动识别input_shape(当然应该得先conpile一下)

3.也是最常用的一种方式,就是在第一层,也就是Flatten的时候指明input_shape。即:model.add(Flatten(input_shape = (28,28)))

注意这里inputshape就不需要加None了。上面第一种方式中是必须要加一维None

Model: "sequential_13"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
flatten_14 (Flatten)         (None, 784)               0         
_________________________________________________________________
dense_37 (Dense)             (None, 512)               401920    
_________________________________________________________________
dense_38 (Dense)             (None, 32)                16416     
_________________________________________________________________
dense_39 (Dense)             (None, 10)                330       
=================================================================
Total params: 418,666
Trainable params: 418,666
Non-trainable params: 0

分析一下:注意是每一层的输出节点,都需要对应一个偏置!所以401920是 (784+1) * 512得来的 !!不是输入节点的偏置,也不是参数的偏置,是一个输出节点对应一个偏置!

参考链接:

https://blog.csdn.net/sisiel/article/details/103163016


20200311

1.  各种定义和建立模型的方法,和input_shape,output_shape的输出方法

(下面代码中的模型还是昨天的那个模型)

from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense,Flatten
#categorical_labels = to_categorical(int_labels, num_classes=None)
(X_train, y_train), (X_test, y_test) = mnist.load_data()
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
X_train = X_train[:10000]/255.0
y_train = y_train[:10000]
X_test = X_test[:10000]/255.0
y_test = y_test[:10000]
model = Sequential()
model.add(Flatten(input_shape = (28,28) ))
model.add(Dense(units = 512, input_dim = 28*28,activation = 'relu'))
model.add(Dense(units = 32,activation = 'relu'))
model.add(Dense(units = 10,activation = 'softmax'))print('method 1:')
model.summary()print('method 2:')
for i in range(len(model.layers)):print(model.get_layer(index=i).output)print('method 3:')
for layer in model.layers:print(layer.output_shape)

输出:

2.MaxPooling1D和MaxPooling2D的区别

Class MaxPooling1D:1D输入的最大池化层

  • pool_size:一个整数或者一个单个整数的tuple/list,表示池化窗口的大小
  • strides:一个整数或者一个单个整数的tuple/list,指定池化操作的移动步幅
  • padding:一个字符串。padding的方法:”valid”或者’same’
  • data_format:一个字符串,channels_last(默认)或channels_first中的一个,输入中维度的排序,channels_last对应于具有形状(batch, length, channels)的输入,而channels_first对应于具有形状(batch, channels, length)的输入。
  • name:一个字符串,表示层的名称。

Class MaxPooling2D:2D输入的最大池化层

  • pool_size:一个整数或者2个整数的元组/列表:(pool_height,pool_width),指定池化窗口的大小。 可以是单个整数,以为所有空间维度指定相同值。
  • strides:一个整数或者2个整数的元组/列表,指定池操作的步幅。 可以是单个整数,以为所有空间维度指定相同值。
  • padding:字符串,“valid”或者”same”
  • data_format:一个字符串,channels_last(默认)或channels_first中的一个,输入中维度的排序,channels_last对应于具有形状(batch,height, width, channels)的输入,而channels_first对应于具有形状(batch, channels, height,width)的输入。
  • name:层的名称。

20200312

1.关于输入数据的格式

我们要明白几点内容,当我们用theano作为backend时候,我们在进行卷积等一些操作时候,系统都会自动按照channel_first的来,比如卷积后的深度那一维放到了H,W的前面。而我们如果用tensorflow作为backend时候,系统会默认是channel_last。你可以通过修改backend来达到你想要的效果,并且通过下面这个函数测试,你目前是什么类型:

tf.keras.backend.image_data_format()

这样就知道建立模型model的时候,input_shape()参数该怎么设置啦


20200313

1.关于keras模型和训练的可视化

1.模型可视化

关于模型的可视化,可以用keras自带的这个模块:plot_model

导入方式:

from tensorflow.keras.utils import plot_model

具体的使用方式可以看博客或者b站那个视频。

参考链接:https://blog.csdn.net/leviopku/article/details/81433867

2.训练过程可视化

关于keras训练过程的可视化,可以看之前写的一篇博客。

链接:https://blog.csdn.net/qq_41289920/article/details/104755617

【机器学习】 - 关于Keras的深入理解相关推荐

  1. 【人工智能与机器学习】——Keras编程分别实现人脸微笑和口罩数据集的识别模型训练和测试(卷积神经网络CNN) + 实时分类微笑和口罩识别检测

    机器学习练习目录 一.理解人脸图像特征提取的各种方法的特征 1.HOG 2.Dlib 3.卷积神经网络(CNN) 二.卷积神经网络(CNN)笑脸数据集(genki4k)正负样本的划分.模型训练和测试的 ...

  2. 【机器学习基础】(三):理解逻辑回归及二分类、多分类代码实践

    本文是机器学习系列的第三篇,算上前置机器学习系列是第八篇.本文的概念相对简单,主要侧重于代码实践. 上一篇文章说到,我们可以用线性回归做预测,但显然现实生活中不止有预测的问题还有分类的问题.我们可以从 ...

  3. 机器学习不会解决自然语言理解(NLU)问题

    作为唯一由人类自身创造的符号,自然语言处理一直是机器学习界不断研究的方向. 自然语言处理技术主要是让机器理解人类的语言的一门领域.在自然语言处理技术中,大量使用了编译原理相关的技术,例如词法分析,语法 ...

  4. 《机器学习实战》:通俗理解支持向量机

    代码.数据集.文章我都是放到了https://github.com/AAAZC/SVM_blog 上面了,文章在issues里面,建议上这个网站看 <机器学习实战>:通俗理解支持向量机 关 ...

  5. 机器学习加深了“知识”和“理解”之间的鸿沟

    https://www.toutiao.com/a6688113817760563726/ 无法理解人工智能"黑箱",人工智能就能帮我们理解世界吗? 编者按:机器学习和互联网意味着 ...

  6. 【机器学习】这次终于彻底理解了奇异值分解(SVD)原理及应用

    奇异值分解(Singular Value Decomposition,以下简称SVD)是在机器学习领域广泛应用的算法,有相当多的应用与奇异值都可以扯上关系,它不光可以用于降维算法中的特征分解,比如做f ...

  7. 【机器学习基础】(二):理解线性回归与梯度下降并做简单预测

    预测从瞎猜开始 按上一篇文章所说,机器学习是应用数学方法在数据中发现规律的过程.既然数学是对现实世界的解释,那么我们回归现实世界,做一些对照的想象. 想象我们面前有一块塑料泡沫做的白板,白板上分布排列 ...

  8. tf.keras.layers.Attention 理解总结

    官方链接:https://tensorflow.google.cn/versions/r2.1/api_docs/python/tf/keras/layers/Attention tf.keras.l ...

  9. 机器学习中的Inductive bias理解

    CNN的inductive bias应该是locality和spatial invariance,即空间相近的grid elements有联系而远的没有,和空间不变性(kernel权重共享) RNN的 ...

最新文章

  1. 银行卡大小的充电宝,买就送耳机!
  2. SharePoint 2013 关于自定义显示列表表单的bug
  3. 上海纽约大学发布2019届毕业生就业报告,出国深造比高达67%
  4. Ba Gua Zhen
  5. 贪心 区间覆盖最小值
  6. Scala:集合类型Collection和迭代器
  7. 可拖拽GridView代码解析
  8. 什么是WPF,对WPF的认识
  9. Tomcat官网下载旧版本
  10. c# 调用浏览器打开页面
  11. 诺基亚linux系统手机系统下载,智能手机操作平台大翻盘 诺基亚拥抱Linux
  12. wso2 esb 配置mysql_wso2esb简介
  13. 微信小程序(5)——下载图片
  14. 关于windows版本电脑版微信更新后无法显示好友头像以及接收图片和表情的解决方案
  15. Socket和Sock之间同步机制
  16. matlab 动态识别,基于matlab脸部动态特征的人脸表情识别程序
  17. 出走的门徒之二—摩拜 王晓峰:给岁月以文明
  18. Python实现用户输入国家名称,打印出所输入的国家名称和首都。
  19. 使用ARM-LPC3131上的nandflash实现U盘模式心得(一)
  20. 服务器怎么防勒索病毒

热门文章

  1. WinForm中使用WPF的控件
  2. Oracle高级SQL培训与讲解
  3. 在PHP中实现中文汉字验证码
  4. 几个颇有创意的网站推广方法(推荐)
  5. [Leedcode][JAVA][第50题][Pow(x, n)][快速幂][分治][转换类型]
  6. Leetcode 1559二维网格图中探测环 技巧DFS|剪枝
  7. python聚类分析结果很差_python中的聚类分析:value错误:x和y的大小必须相同
  8. 简易贪吃蛇c语言贴吧,熬书几个月,终于编出简易的贪吃蛇了,VS2013
  9. 7-8 德才论 (25 分)(C语言实现)
  10. c语言程序定义不知数量的一维数组,c语言程序设计10-第6章 利用数组处理批量数据 6.1 怎样定义和引用一维数组.ppt...