基于深度强化学习的绘画智能体 代码详解
Github源码链接
actor.py
导入库
import numpy as np
import torch
import torch. nn as nn
import torch. nn. functional as F
import torch. nn. utils. weight_norm as weightNorm
from torch. autograd import Variable
import sys
定义3*3的二维卷积模板
def conv3x3 ( in_planes, out_planes, stride= 1 ) :
return ( nn. Conv2d ( in_planes, out_planes, kernel_size= 3 , stride= stride, padding= 1 , bias= False) )
nn.Conv2d()详解 1.kernel_size:卷积核的大小,一般我们会使用5x5、3x3这种左右两个数相同的卷积核,因此这种情况只需要写kernel_size = 5这样的就行了。如果左右两个数不同,比如3x5的卷积核,那么写作kernel_size = (3, 5),注意需要写一个tuple,而不能写一个列表(list)。 2.stride:步幅,卷积核两次卷积左上角点之间的距离;通俗讲就是卷积核每隔几个像素进行一次卷积操作 3.padding:=0时,不填充,原图与卷积核进行卷积;=1时,在原图四边填充一行(一列),具体填充的数据由padding_mode控制,一般填0) 4.bias:偏差,会在网络训练后向传播过程中,给输出加上一个学得的偏差
定义基础模块BasicBlock
class BasicBlock ( nn. Module) :
expansion = 1
def __init__ ( self, in_planes, planes, stride= 1 ) :
super ( BasicBlock, self) . __init__ ( )
self. conv1 = conv3x3 ( in_planes, planes, stride)
self. bn1 = nn. BatchNorm2d ( planes)
self. conv2 = conv3x3 ( planes, planes)
self. bn2 = nn. BatchNorm2d ( planes)
self. shortcut = nn. Sequential ( )
if stride != 1 or in_planes != self. expansion * planes:
self. shortcut = nn. Sequential (
( nn. Conv2d ( in_planes, self. expansion* planes, kernel_size= 1 , stride= stride, bias= False)