准备较为系统的来看下tensorflow,备注如下。
学习教材是tensorflow官网教程:TensorFlow Core
一开始就将eager execute?eager execute 到底有啥用?没有概念。。。
还是从张量开始看起吧
tf中的各种运算的结果还是张量,张量转换成numpy用.numpy(),
如:
a= tf.constant([0, 1, 1, 2, 3, 5, 8, 13, 21, 34])
a[0]
<tf.Tensor: shape=(), dtype=int32, numpy=0>
a[0].numpy()
0
reshape不能乱用,不改变轴的顺序,不打乱特征才有意义!
看完张量,直接跳到keras。
序贯模型,
计算一个layer的weights 个数 ,
model = keras.Sequential()
model.add(keras.Input(shape=(10, 10, 1))) # 10x10 ,1个channel
model.add(layers.Conv2D(1, 3, strides=1, activation="relu"))
param=10,1个(3*3的kernal+1个偏移量b)=10
model = keras.Sequential()
model.add(keras.Input(shape=(10, 10, 1)))
model.add(layers.Conv2D(3, 3, strides=1, activation="relu"))
param=30,3个(3*3的kernal+1个偏移量b)=30
model = keras.Sequential()
model.add(keras.Input(shape=(10, 10, 3))) #3个通道,共享一个偏移值b,
model.add(layers.Conv2D(3, 3, strides=1, activation="relu"))
param=84,3个(3*3的kernal*3个通道+1个偏移量b)=84
通道共享偏移值,一个卷积就是一个算子(过滤器),在整个图像上搜索过滤出一个特征
理解卷积,池化,全局最大池化,通过上面的计算对卷积应该有所了解,池化就是下采样。
如果把连接图输出出来就更加清楚了。
如下,这个模型,
model = keras.Sequential(
[
keras.Input(shape=input_shape),
layers.Conv2D(32, kernel_size=(3, 3), activation="relu"),
layers.MaxPooling2D(pool_size=(2, 2)),
layers.Conv2D(64, kernel_size=(3, 3), activation="relu"),
layers.MaxPooling2D(pool_size=(2, 2)),
layers.Flatten(),
layers.Dropout(0.5),
layers.Dense(num_classes, activation="softmax"),
]
)
tensorboard中看graph如下。网络结构已经一目了然了。注意到sequential几个字的3条灰色的线,是反向传播的3条路径