MAIN_AND_SUB 2024-01-07 23:22 采纳率: 15.4%
浏览 9
已结题

Paddle项目报错

想问一下为什么复制paddle上的公开项目到本地运行,就出现了下面的报错,在AI studio直接运行就不会报错?
原项目地址:我发现了一篇高质量的实训项目,使用免费算力即可一键运行,还能额外获取8小时免费GPU运行时长,快来Fork一下体验吧。
胶囊神经网络paddle版实现(Capsule Network)(动态图):https://aistudio.baidu.com/projectdetail/657114?channel=0&channelType=0&sUid=939258&shared=1&ts=1704640503356
代码:

'''
@paddle实现完整代码 
@author Reatris 
使用minst数据集
'''
import numpy as np 
import paddle
import paddle.fluid as  fluid
import sys,os
import matplotlib.pylab as plt
from PIL import Image
import cv2

train_params = {
    'batch_size':32,
    'epoch_num':2,
    'save_model_name':'Capnet_class_and_rebuild',
    'm_plus':0.9,#计算损失值时大于这个值则loss=0
    'm_det':0.1,#计算损失值时大于这个值则loss=0
    'lambda_val':0.5,#错误概率loss权重
    'build_loss_scale':0.0005,#decode损失scale
    'with_decode':True,#是否训练decode部分
     'train_comparison':False,#是否使用CNN+POOL网络对比
     'challenge':False,#是否在训练过程中改变输入图片
     'train_data':'mnist',#'可以选择mnist'或者'cat12'数据集
}



class Capsule_Layer(fluid.dygraph.Layer):
    def __init__(self,pre_cap_num,pre_vector_units_num,cap_num,vector_units_num,use_Gaussian_distribution=False):
        '''
        胶囊层的实现类,可以直接同普通层一样使用
        Args:
            pre_vector_units_num(int):输入向量维度 
            vector_units_num(int):输出向量维度 
            pre_cap_num(int):输入胶囊数 
            cap_num(int):输出胶囊数 
            routing_iters(int):路由迭代次数,建议3次 
        Notes:
            胶囊数和向量维度影响着性能,可作为主调参数
        '''
        super(Capsule_Layer,self).__init__()
        self.use_Gaussian_distribution = use_Gaussian_distribution
        self.routing_iters = 3
        self.pre_cap_num = pre_cap_num
        self.cap_num = cap_num
        self.pre_vector_units_num = pre_vector_units_num
        self.vector_units_num = vector_units_num
        for j in range(self.cap_num):
            self.add_sublayer('u_hat_w'+str(j),fluid.dygraph.Linear(\
            input_dim=pre_vector_units_num,output_dim=vector_units_num))
    
    
    def squash(self,vector):
        '''
        压缩向量的函数,类似激活函数,向量归一化
        Args:
            vector:一个4维张量 [batch_size,vector_num,vector_units_num,1]
        Returns:
            一个和x形状相同,长度经过压缩的向量
            输入向量|v|(向量长度)越大,输出|v|越接近1
        '''
        vec_abs = fluid.layers.sqrt(fluid.layers.reduce_sum(fluid.layers.square(vector)))  # 一个标量|v|模长度
        scalar_factor = fluid.layers.square(vec_abs) / (1 + fluid.layers.square(vec_abs))
        vec_squashed = scalar_factor * fluid.layers.elementwise_div(vector, vec_abs)  # 对应元素相除
        return(vec_squashed)

    def capsule(self,x,B_ij,j,pre_cap_num):
        '''
        这是动态路由算法的精髓。
        Args:
            x:输入向量,一个四维张量 shape = (batch_size,pre_cap_num,pre_vector_units_num,1)
            B_ij: shape = (1,pre_cap_num,cap_num,1)路由分配权重,这里将会选取(split)其中的第j组权重进行计算
            j:表示当前计算第j个胶囊的路由
            pre_cap_num:输入胶囊数
        Returns:
            v_j:经过多次路由迭代之后输出的4维张量(单个胶囊)
            B_ij:计算完路由之后又拼接(concat)回去的权重
        Notes:
            B_ij,b_ij,C_ij,c_ij注意区分大小写哦
        '''
        x = fluid.layers.reshape(x,(x.shape[0],pre_cap_num,-1))
        u_hat = getattr(self,'u_hat_w'+str(j))(x)
        u_hat = fluid.layers.reshape(u_hat,(x.shape[0],pre_cap_num,-1,1))
        shape_list = B_ij.shape#(1,1152,10,1)
        split_size = [j,1,shape_list[2]-j-1]#取出当前加权项
        for i in range(self.routing_iters):
            C_ij = fluid.layers.softmax(B_ij,axis=2)
            b_il,b_ij,b_ir = fluid.layers.split(B_ij,split_size,dim=2)#b_il是已经完成分配的项
            c_il,c_ij,b_ir = fluid.layers.split(C_ij,split_size,dim=2)
            v_j = fluid.layers.elementwise_mul(u_hat,c_ij)#加权[1,1152,1,1]x[32,1152,16,1]-->每16个向量分配一个权重
            v_j = fluid.layers.reduce_sum(v_j,dim=1,keep_dim=True)#分配到同一个路由的向量相加[32,1,16,1]
            v_j = self.squash(v_j)   #[32,1,16,1]
            v_j_expand = fluid.layers.expand(v_j,(1,pre_cap_num,1,1))#平铺[32,1,16,1]-->[32,1152,16,1]
            u_v_produce = fluid.layers.elementwise_mul(u_hat,v_j_expand)#求内积
            u_v_produce = fluid.layers.reduce_sum(u_v_produce,dim=2,keep_dim=True) #[32,1152,16,1]-->[32,1152,1,1]
            b_ij += fluid.layers.reduce_sum(u_v_produce,dim=0,keep_dim=True)#内积累加,更新路由权重BIJ
            B_ij = fluid.layers.concat([b_il,b_ij,b_ir],axis=2)
        return v_j,B_ij
    
    def forward(self,x):
        '''
        Args:
            x:shape = (batch_size,pre_caps_num,vector_units_num,1) or (batch_size,C,H,W)
                如果是输入是shape=(batch_size,C,H,W)的张量,
                则将其向量化shape=(batch_size,pre_caps_num,vector_units_num,1)
                满足:C * H * W = vector_units_num * caps_num
                其中 C >= caps_num
        Returns:
            capsules:一个包含了caps_num个胶囊的list
        '''
        
        if x.shape[3]!=1:
            x = fluid.layers.reshape(x,(x.shape[0],self.pre_cap_num,-1))
            temp_x = fluid.layers.split(x,self.pre_vector_units_num,dim=2)
            temp_x = fluid.layers.concat(temp_x,axis=1)
            x = fluid.layers.reshape(temp_x,(x.shape[0],self.pre_cap_num,-1,1))
            x = self.squash(x)
        B_ij = fluid.layers.ones((1,x.shape[1],self.cap_num,1),dtype='float32')/self.cap_num#路由分配权重[1,1152,10,1]
        capsules = []
        for j in range(self.cap_num):
            cap_j,B_ij = self.capsule(x,B_ij,j,self.pre_cap_num)#进行路由分配
            capsules.append(cap_j)
        capsules = fluid.layers.concat(capsules,axis=1)
        return capsules   

class Capconv_Net(fluid.dygraph.Layer):
    def __init__(self,train_data='mnist'):
        '''
        Args:
            decode_layer_num:decode部分的全连接层层数,用于遍历
            self.caps_0:这个是实例化了定义的Capsule_Layer,用法和其他层基本相同
        Notes:
            这里只用了一个胶囊层,不知道叠加层数会如何
        '''
        super(Capconv_Net,self).__init__()
        self.decode_layer_num = 3
        self.train_data = train_data
        if(train_data=='mnist'):
            self.add_sublayer('conv0',fluid.dygraph.Conv2D(\
            num_channels=1,num_filters=32,filter_size=(9,9),padding=0,stride = 1,act='relu'))
            self.add_sublayer('conv1',fluid.dygraph.Conv2D(\
            num_channels=32,num_filters=512,filter_size=(9,9),padding=0,stride = 2,act='relu'))
            self.caps_0 = Capsule_Layer(72,256,10,32)#胶囊层
            self.add_sublayer('rebuid_fc0',fluid.dygraph.Linear(input_dim=32,output_dim=512))
            self.add_sublayer('rebuid_fc1',fluid.dygraph.Linear(input_dim=512,output_dim=1024))
            self.add_sublayer('rebuid_fc2',fluid.dygraph.Linear(input_dim=1024,output_dim=784))
        else:
            self.conv0=fluid.dygraph.Conv2D(num_channels=3,num_filters=64,filter_size=(3,3),stride=1,padding=1,act='relu')
            self.pool0 = fluid.dygraph.Pool2D(pool_size=2,pool_stride=2,pool_type='max')#32,256
            self.conv1=fluid.dygraph.Conv2D(num_channels=64,num_filters=128,filter_size=(3,3),stride=1,padding=1,act='relu')
            self.pool1 = fluid.dygraph.Pool2D(pool_size=2,pool_stride=2,pool_type='max')#32,256
            self.conv2=fluid.dygraph.Conv2D(num_channels=128,num_filters=256,filter_size=(3,3),stride=1,padding=1,act='relu')
            self.pool2 = fluid.dygraph.Pool2D(pool_size=2,pool_stride=2,pool_type='max')#32,256
            self.caps_0 = Capsule_Layer(784,256,12,32)
            self.conv3=fluid.dygraph.Conv2D(num_channels=256,num_filters=512,filter_size=(3,3),stride=1,padding=1,act='relu')
            self.pool3 = fluid.dygraph.Pool2D(pool_size=2,pool_stride=2,pool_type='max')#32,256
            self.caps_1 = Capsule_Layer(196,512,12,32)#胶囊层
    def get_loss_v(self,label):
        '''
        计算边缘损失
        Args:
            label:shape=(32,10) one-hot形式的标签
        Notes:
            这里我调用Relu把小于0的值筛除
            m_plus:正确输出项的概率(|v|)大于这个值则loss为0,越接近则loss越小
            m_det:错误输出项的概率(|v|)小于这个值则loss为0,越接近则loss越小
            (|v|即胶囊(向量)的模长)
        '''
        max_l =  fluid.layers.relu(train_params['m_plus'] - self.output_caps_v_lenth)#广播
        max_l = fluid.layers.reshape(fluid.layers.square(max_l),(train_params['batch_size'],-1))#32,10
        max_r =  fluid.layers.relu(self.output_caps_v_lenth - train_params['m_det'])
        max_r = fluid.layers.reshape(fluid.layers.square(max_r),(train_params['batch_size'],-1))#32,10
        margin_loss = fluid.layers.elementwise_mul(label,max_l)\
                        + fluid.layers.elementwise_mul(1-label,max_r)*train_params['lambda_val']
        self.margin_loss = fluid.layers.reduce_mean(margin_loss,dim=1)

    def loss(self,label):
        '''
        计算边缘损失和decode
        Args:
            label:shape=(32,10) one-hot形式的标签
        Returns:
            total_loss or margin(不训练decode部分时)
        Notes:
            decode重建图像的损失用欧式距离计算
        '''
        self.get_loss_v(label)
        if train_params['with_decode']:
            euclidean_metric = fluid.layers.square(self.decode_result - self.input_imgs)#求得欧式距离
            self.reconstruction_err = fluid.layers.mean(euclidean_metric)
            self.total_loss = self.margin_loss + self.reconstruction_err * train_params['build_loss_scale']
            return self.total_loss #返回总loss
        else:
            return self.margin_loss #只返回边缘loss
            
        #只返回decode loss 冻结之后用
    
    def accuracy(self,label):
        label = fluid.layers.argmax(label,axis=1)
        T_L = fluid.layers.reshape(self.argmax_idx,(label.shape[0],))
        mask = paddle.fluid.layers.equal(T_L,label)
        mask = np.argwhere(mask.numpy()==True)
        return len(mask)/label.shape[0]
        

    def forward(self,x):
        if self.train_data == 'mnist':
            if train_params['with_decode']:
                self.input_imgs = fluid.layers.reshape(x,(train_params['batch_size'],-1))
            x = self.conv0(x)
            x = self.conv1(x)       
            self.output_caps = self.caps_0(x)# 32,10,16,1
            self.output_caps_v_lenth = fluid.layers.sqrt(fluid.layers.reduce_sum(\
            fluid.layers.square(self.output_caps),dim=2,keep_dim=True))##计算模长32,10,1,1
            softmax_v = fluid.layers.softmax(self.output_caps_v_lenth,axis=1)#计算每个胶囊类概率 32,10,1,1
            argmax = fluid.layers.argmax(softmax_v,axis=1)#选取最大概率索引32,1,1
            mask_v = []
            self.argmax_idx = fluid.layers.reshape(argmax,(argmax.shape[0],1))
            
            if train_params['with_decode']:
                ######下面是decode部分######
                #选取正确胶囊
                for i in range(train_params['batch_size']):
                    v = self.output_caps[i][self.argmax_idx[i],:]
                    mask_v.append(fluid.layers.reshape(v,(1,self.output_caps.shape[2])))
                self.mask_v = fluid.layers.concat(mask_v,axis=0)#32,16
                #全连接层重构图像
                x = self.mask_v
                for i in range(self.decode_layer_num):
                    x = getattr(self,'rebuid_fc'+str(i))(x)
                self.decode_result = x
        else:
            capsule_list = []
            for i in range(4):
                x = getattr(self,'conv'+str(i))(x)
                x = getattr(self,'pool'+str(i))(x)
                if i>1:
                    capsule_list.append(x)
            output_cap_list = []
            for j in range(2):
                # print(capsule_list[j+1].shape)
                output_cap_list.append(getattr(self,'caps_'+str(j))(capsule_list[j]))
            self.output_caps = fluid.layers.concat(output_cap_list,axis=2)
            # print(self.output_caps.shape)
            self.output_caps_v_lenth = fluid.layers.sqrt(fluid.layers.reduce_sum(\
            fluid.layers.square(self.output_caps),dim=2,keep_dim=True))##计算模长32,10,1,1
            softmax_v = fluid.layers.softmax(self.output_caps_v_lenth,axis=1)#计算每个胶囊类概率 32,10,1,1
            argmax = fluid.layers.argmax(softmax_v,axis=1)#选取最大概率索引32,1,1
            mask_v = []
            self.argmax_idx = fluid.layers.reshape(argmax,(32,1))
            
#用同规模卷积神经网络+池化层对比
class Mnistnet(fluid.dygraph.Layer):
    def __init__(self,train_data='mnist'):
        super(Mnistnet,self).__init__()
        self.train_data = train_data
        if(train_data=='mnist'):
            self.add_sublayer('conv0',fluid.dygraph.Conv2D(\
            num_channels=1,num_filters=32,filter_size=(9,9),padding=0,stride = 1,act='relu'))
            self.add_sublayer('conv1',fluid.dygraph.Conv2D(\
            num_channels=32,num_filters=512,filter_size=(9,9),padding=0,stride = 2,act='relu'))
            self.pool = fluid.dygraph.Pool2D(global_pooling=True,pool_type='max')#32,256
            self.fc0=fluid.dygraph.Linear(input_dim=512,output_dim=128,act='relu')#[32,256] ==> [32,50]
            self.fc2=fluid.dygraph.Linear(input_dim=128,output_dim=10,act='softmax')
        else:
            self.block1_conv1_3_64=fluid.dygraph.Conv2D(num_channels=3,num_filters=64,filter_size=(3,3),stride=1,padding=1,act='relu')
            self.pool0 = fluid.dygraph.Pool2D(pool_size=2,pool_stride=2,pool_type='max')#32,256
            self.block1_conv2_3_64=fluid.dygraph.Conv2D(num_channels=64,num_filters=128,filter_size=(3,3),stride=1,padding=1,act='relu')
            self.pool1 = fluid.dygraph.Pool2D(pool_size=2,pool_stride=2,pool_type='max')#32,256
            self.block2_conv1_3_128=fluid.dygraph.Conv2D(num_channels=128,num_filters=256,filter_size=(3,3),stride=1,padding=1,act='relu')
            self.pool2 = fluid.dygraph.Pool2D(pool_size=2,pool_stride=2,pool_type='max')#32,256
            self.block2_conv2_3_128=fluid.dygraph.Conv2D(num_channels=256,num_filters=512,filter_size=(3,3),stride=1,padding=1,act='relu')
            self.g_poo1 = fluid.dygraph.Pool2D(global_pooling=True,pool_type='max')
            self.fc0 = fluid.dygraph.Linear(input_dim=896,output_dim=256,act='relu')
            self.fc1 = fluid.dygraph.Linear(input_dim=256,output_dim=12,act='softmax')
    def forward(self,x):
        if self.train_data =='mnist':
            for layers in self.sublayers():
                x = layers(x)
                x = fluid.layers.squeeze(x,axes=[])
            return x
        else:
            x =self.block1_conv1_3_64(x)
            x = self.pool0(x)
            x = self.block1_conv2_3_64(x)
            x = self.pool1(x)
            f1 =  fluid.layers.squeeze(self.g_poo1(x),axes=[])
            x = self.block2_conv1_3_128(x)
            x = self.pool2(x)
            f2 = fluid.layers.squeeze(self.g_poo1(x),axes=[])
            x = self.block2_conv2_3_128(x)
            f3 = fluid.layers.squeeze(self.g_poo1(x),axes=[])
            x = fluid.layers.concat((f1,f2,f3),axis=1)
            x = self.fc0(x)
            x = self.fc1(x)
            return x
   


#猫12分类数据读取
def data_load(train_list_path,batch_size):
    '''
    train_list_path:标注文件txt所在path
    '''
    train_dir_list=[]
    train_label=[]
    with open(train_list_path,'r') as train_dirs:
        #train_dir_list.append(train_dirs.readline())
        lines=[line.strip() for line in train_dirs]
        for line in lines:
            img_path,label=line.split()
            train_dir_list.append(img_path)
            train_label.append(label)
    def reader():
        imgs=[]
        labels=[]
        img_mask=np.arange(len(train_dir_list)) #生成索引
        np.random.shuffle(img_mask) #随机打乱索引
        count=0
        for i in img_mask:
            img=cv2.imread(train_dir_list[i])
            img=cv2.resize(img,(224,224),interpolation=cv2.INTER_CUBIC)/255
            img=np.transpose(img,(2,0,1))
            imgs.append(img)
            temp_labels_one_hot = np.zeros(12)
            temp_labels_one_hot[int(train_label[i])] = 1 
            labels.append(temp_labels_one_hot)
            count+=1
            if(count%train_params['batch_size']==0):
                yield np.asarray(imgs).astype('float32'),np.asarray(labels).astype('float32').reshape((train_params['batch_size'],12))
                imgs=[]
                labels=[]
    return reader


def draw_train_process(iters,accs_mnist,loss_mnist,accs,loss):
    '''
    训练可视化(对比)
    '''
    plt.title('CapsulesNet training',fontsize=24)
    plt.xlabel('iters',fontsize=20)
    plt.ylabel('acc/loss',fontsize=20)
    plt.plot(iters,loss_mnist,color='yellow',label='loss_of_cnn+pool')
    plt.plot(iters,accs_mnist,color='blue',label='accuracy_cnn+pool')
    plt.plot(iters,accs,color='red',label='accuracy_capsules_net')
    plt.plot(iters,loss,color='green',label='loss_of_capsule_net')
    plt.legend()
    plt.grid()
    plt.show()

def draw_train_process2(iters,accs,loss):
    '''
    训练可视化
    '''
    plt.title('CapsulesNet training',fontsize=24)
    plt.xlabel('iters',fontsize=20)
    plt.ylabel('acc/loss',fontsize=20)
    plt.plot(iters,accs,color='red',label='accuracy')
    plt.plot(iters,loss,color='green',label='loss')
    plt.legend()
    plt.grid()
    plt.show()

def fix_value(img_pixs):#像素拉伸
    '''
    img_pixs:featuremap的像素矩阵
    '''
    pix_max=np.max(img_pixs)#取最大像素
    pix_min=np.min(img_pixs)#取最小像素
    pix_range=np.abs(pix_max)+np.abs(pix_min)#获取像素距离
    if(pix_range==0): #如果所有值都是零则直接返回(下面不能除以零)
        return img_pixs
    pix_rate = 255/pix_range#获取像素缩放倍率
    pix_left = pix_min*pix_rate#获取最小还原像素值
    img_pixs = img_pixs*pix_rate-pix_left#整体像素值平移
    img_pixs[np.where(img_pixs<0)]=0. #增加鲁棒性,检查超出区间的像素值,np.where(a<x)与a<x等同
    img_pixs[np.where(img_pixs>255)]=255.
    return img_pixs

def show_array2img(array,title):
    rebuilded_img = Image.fromarray(array.astype('uint8')).convert('RGB')
    plt.imshow(rebuilded_img)
    plt.title(title)
    plt.show()

with fluid.dygraph.guard():
    if train_params['train_data']=='mnist':    
        train_reader = paddle.batch(reader=paddle.reader.shuffle(\
        paddle.dataset.mnist.train(),buf_size=512),batch_size=train_params['batch_size'])  
    else:
        train_reader = data_load('train_list.txt',train_params['batch_size'])
    if train_params['train_comparison']:
        train_params['with_decode']=False#对比时就不训练decode部分了
        print('start training CNN+POOL net')
        model_mnist=Mnistnet(train_params['train_data'])
        model_mnist.train()
        if train_params['train_data']=='mnist':
            opt_mnist=fluid.optimizer.AdamOptimizer(learning_rate=0.01,parameter_list=model_mnist.parameters())
            checkpoint=train_params['epoch_num']*1876*0.5
        else:
            opt_mnist=fluid.optimizer.AdamOptimizer(learning_rate=0.001,parameter_list=model_mnist.parameters())
            checkpoint=train_params['epoch_num']*68*0.5
        epoch_num_mnist = train_params['epoch_num']
        all_train_costs_mnist = []
        all_train_accs_mnist = []
        all_iter = 0
        for pass_num_mnist in range(epoch_num_mnist):
            for batch_id_mnist,data in enumerate(train_reader()):
                if train_params['train_data']=='mnist':
                    temp_images = []
                    temp_labels = []
                    for i in range(32):
                        if(all_iter>checkpoint and train_params['challenge']):
                            temp_images.append(np.transpose(np.reshape(data[i][0],(1,28,28)),(0,2,1)))
                        else: 
                            temp_images.append(np.reshape(data[i][0],(1,28,28)))
                        temp_labels.append(data[i][1])
                    temp_images=fluid.dygraph.to_variable(np.asarray(temp_images).reshape((32,1,28,28)))
                    temp_labels=fluid.dygraph.to_variable(np.asarray(temp_labels).reshape((32,1)))
                else:
                    temp_images,temp_labels = data
                    if(all_iter>checkpoint and train_params['challenge']):
                        temp_images=fluid.dygraph.to_variable(np.transpose(\
                        np.asarray(temp_images).reshape((32,3,224,224)),(0,1,3,2)))
                    else:
                        temp_images=fluid.dygraph.to_variable(np.asarray(temp_images).reshape((32,3,224,224)))
                    temp_labels=fluid.dygraph.to_variable(np.asarray(temp_labels).reshape((32,12)))
                    temp_labels = fluid.layers.reshape(fluid.layers.argmax(temp_labels,axis=1),(32,1))

                predict = model_mnist(temp_images)
                #计算loss
                loss_mnist= fluid.layers.cross_entropy(label=temp_labels,input=predict)
                    
                #计算accuracy
                acc_mnist=fluid.layers.accuracy(input=predict,label=temp_labels)
                avg_loss_mnist = fluid.layers.mean(loss_mnist)
                avg_loss_mnist.backward()#反向传播跟新weights
                opt_mnist.minimize(avg_loss_mnist)
                opt_mnist.clear_gradients()
                all_iter +=1
                if all_iter%100==0:
                    all_train_costs_mnist.append(avg_loss_mnist.numpy()[0])
                    all_train_accs_mnist.append(acc_mnist.numpy()[0])
                    print('pass_num:{},iters:{},loss:{},acc:{}'.format(\
                    pass_num_mnist,all_iter,avg_loss_mnist.numpy()[0],acc_mnist.numpy()[0]))
        print("Final loss of cnn+pool: {}".format(avg_loss_mnist.numpy()))
    
    print('start training CNN+Capsules')
    model = Capconv_Net(train_params['train_data'])  #实列化模型
    if os.path.exists(train_params['save_model_name'] + '.pdparams') and not train_params['train_comparison']:#存在模型参数则继续训练
        print('continue training')
        param_dict,_ = fluid.dygraph.load_dygraph(train_params['save_model_name'])
        model.load_dict(param_dict)
    model.train()
    all_iter = 0
    all_loss = []
    all_iters = []
    all_accs = []
    if train_params['train_data']=='mnist':
        opt=fluid.optimizer.AdamOptimizer(learning_rate=0.01,parameter_list=model.parameters())
        checkpoint=train_params['epoch_num']*1876*0.5
    else:
        opt=fluid.optimizer.AdamOptimizer(learning_rate=0.001,parameter_list=model.parameters())
        checkpoint=train_params['epoch_num']*68*0.5
    for pass_num in range(train_params['epoch_num']):
        for pass_id,data in enumerate(train_reader()):
            if train_params['train_data']=='mnist':
                temp_images = []
                temp_labels = []
                for i in range(32):
                    if(all_iter>checkpoint and train_params['challenge']):
                        temp_images.append(np.transpose(np.reshape(data[i][0],(1,28,28)),(0,2,1)))
                    else: 
                        temp_images.append(np.reshape(data[i][0],(1,28,28)))
                    temp_labels_one_hot = np.zeros(10)
                    temp_labels_one_hot[data[i][1]] = 1 
                    temp_labels.append(temp_labels_one_hot)
                temp_images = fluid.dygraph.to_variable(np.asarray(temp_images))#转换成tensor才能输入
                temp_labels = fluid.dygraph.to_variable(\
                np.asarray(temp_labels).reshape((32,10)).astype('float32'))
            else:
                temp_images,temp_labels = data
                if(all_iter>checkpoint and train_params['challenge']):
                    temp_images=fluid.dygraph.to_variable(np.transpose(\
                    np.asarray(temp_images).reshape((32,3,224,224)),(0,1,3,2)))
                else: 
                    temp_images=fluid.dygraph.to_variable(np.asarray(temp_images).reshape((32,3,224,224)))
                
                temp_labels=fluid.dygraph.to_variable(np.asarray(temp_labels).reshape((32,12)))
            model(temp_images)
            loss = model.loss(temp_labels)
            avg_loss=fluid.layers.mean(loss)
            avg_loss.backward()
            opt.minimize(avg_loss)
            opt.clear_gradients()
            all_iter+=1
            if all_iter%100==0:
                acc=model.accuracy(temp_labels)
                all_loss.append(avg_loss.numpy()[0])
                all_iters.append(all_iter)
                all_accs.append(acc)
                print('pass_epoch:{},iters:{},loss:{},acc:{}'.format(pass_num,all_iter,avg_loss.numpy()[0],acc))
    fluid.save_dygraph(model.state_dict(),train_params['save_model_name']) #保存模型参数
    if train_params['train_comparison']:
        draw_train_process(all_iters,all_train_accs_mnist,all_train_costs_mnist,all_accs,all_loss)
    else:
        draw_train_process2(all_iters,all_accs,all_loss)
    print('finished training')
    if train_params['with_decode']:
        #图像重构显示
        show_array2img(fix_value(np.reshape(model.input_imgs[0].numpy(),(28,28))),'imput_img')
        show_array2img(fix_value(np.asarray(np.reshape(model.decode_result[0].numpy(),(28,28)))),'rebuild_img')

img

img

  • 写回答

3条回答 默认 最新

  • IT工程师_二师兄 2024-01-08 07:05
    关注

    你把这个报错给他复制出来啊,然后复制到记事本里面发给我兄弟

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月18日
  • 创建了问题 1月7日