图片出至:https://blog.csdn.net/dcxhun3/article/details/46878999
CNN的特点:通过感受野减少了神经网络巡的参数。
nn.Conv2d(in_channels=3,out_channels=96,kernel_size=11,stride=4,padding=2)
in_channels=3:表示的是输入的通道数
out_channels=96:表示的是输出的通道数
kernel_size=12:表示卷积核的大小是12x12的
stride=4:表示的是步长为4,
padding=2:表示的是填充值的大小为2,也就是上面的P, P=2
N=(W-F+2P)/S+1 N为输出大小 =( 输入大小-卷积核大小+2倍填充值大小)/ 步长 +1
这个可以这么理解,如一个5x5大小的输入,你用一个3x3的卷积核,那么输出3x3在上面框一圈,如果每次能走1也就能向右或者向下走个2步长。5-3+1 = 3 输出就是3x3.
这么走太简单了而且越走越小。所以我们还要加一个padding,
如果想要输入输出相同, padding = (过滤器-1)/2 所以过滤器多是奇数。
加上了stride,感受野一次要走stride步,计算起来就是上面的那个公式了。
输出大小 =( 输入大小-卷积核大小+2倍填充值大小)/ 步长 +1
输出大小 = 输入的大小,减去第一个卷积核的长度,加上填充值上下填充的长度,然后将这些除以步长。最后加上1是初始感受野位置的1.很清楚。
参考:https://zhuanlan.zhihu.com/p/62760780
我们从这个NetV1来进行具体分析一下:
ef NetV1(): state_shape, action_dim = [80, 80, 4], 2 actions = Input([action_dim]) state = Input(state_shape) x = Conv2D(32, kernel_size=8, strides=4, padding="same")(state) x = Activation("relu")(x) x = MaxPool2D(pool_size=2)(x) x = Conv2D(64, kernel_size=4, strides=2, padding="same")(x) #padding = x = Activation('relu')(x) x = Conv2D(64, kernel_size=3, strides=1, padding="same")(x) x = Activation('relu')(x) x = Flatten()(x) x = Dense(512)(x) x = Activation('relu')(x) out1 = Dense(action_dim)(x) out2 = Dot(-1)([actions, out1]) model = keras.Model([state, actions], out2) optimizer = keras.optimizers.Adam(1e-6) # optimizer = keras.optimizers.SGD(lr=1e-5, decay=1e-6, momentum=0.9, nesterov=True) loss = keras.losses.mse model.compile(optimizer=optimizer, loss=loss) model.summary() return model
padding="valid" 不进行填充,不满了就舍弃。 padding=“same” 用0进行填充 maxpool 最大池化层,压缩数据和参数的量,减小过拟合。默认应该都是2x2 步长为2 也就是压缩一半的大小。 dense 全连接层,参数为神经元节点数。 input 用来实例化一个keras张量 dot 返回两个数组的点积 model.compile 告诉模型优化器和损失的评判标准 model.summary 输出模型的参数情况