Closed 1286667673 closed 5 years ago
请问您的fetch_list
是怎么设置的呢,能否po一下代码
import random import cv2 import os import math import paddle import numpy as np import paddle.fluid as fluid class FCNN: def init(self,dataset): self.dataset = dataset self.LEARNING_RATE = 1e-4
def data_pre_train(self,kind,dataset):
img_path = './data/data8297/formatted_trainval_gray_resize1/shanghaitech_part_' + dataset + '_patches_9/' + kind + '/'
print(img_path)
den_path = './data/data8297/formatted_trainval_gray_resize1/shanghaitech_part_' + dataset + '_patches_9/' + kind + '_den/'
img_names = os.listdir(img_path)
img_num = len(img_names)
data = []
for i in range(1, img_num + 1):
print(i)
if i % 100 == 0:
print(i, '/', img_num)
name = img_names[i - 1]
img = cv2.imread(img_path + name, 0)
img = np.array(img)
height, width = img.shape[:2]
size = (int(width * 0.4), int(height * 0.4))
img = cv2.resize(img, size, interpolation=cv2.INTER_AREA)
img = (img - 127.5) / 128
den = np.loadtxt(open(den_path + name[:-4] + '.csv'), delimiter=",")
den_quarter = np.zeros((math.ceil(den.shape[0] / 4),math.ceil(den.shape[1] / 4)))
for i in range(len(den_quarter)-1):
for j in range(len(den_quarter[0])-1):
for p in range(4):
for q in range(4):
den_quarter[i][j] += den[i * 4 + p][j * 4 + q]
data.append([img, den_quarter])
print('load dataset finished')
return data
def conv2d_neural_network(self,img):
# 第一个卷积-池化层
S_conv_1 = fluid.layers.conv2d(input=img,filter_size=5,num_filters=24,act="relu")
S_conv_pool_1 = fluid.layers.pool2d(input=S_conv_1, pool_size=2, pool_stride=2)
# 第二个卷积-池化层
S_conv_2 = fluid.layers.conv2d(input=S_conv_pool_1,filter_size=3,num_filters=48,act="relu")
S_conv_pool_2 = fluid.layers.pool2d(input=S_conv_2, pool_size=2, pool_stride=2)
# 第三个卷积
S_conv_pool_3 = fluid.layers.conv2d(input =S_conv_pool_2,num_filters=24,filter_size=3,act="relu")
# 第四个卷积
S_conv_pool_4 = fluid.layers.conv2d(input =S_conv_pool_3,num_filters=12,filter_size=3,act="relu")
y_predict = fluid.layers.conv2d(input =S_conv_pool_4,num_filters=12,filter_size=1,stride=1)
return y_predict
def train(self,max_epoch):
model_save_dir = '/home/aistudio/data/data8297/MODELA/'
#定义输入数据的占位符
image= fluid.layers.data(name = 'image',shape = [-1,1,780,640], dtype='float32')
y_act = fluid.layers.data(name='y_act', shape=[-1,1,480,360], dtype='float32')
y_pre = self.conv2d_neural_network(image)
loss =fluid.layers.sqrt(fluid.layers.reduce_mean(fluid.layers.square_error_cost(input=y_act,label=y_pre)))
act_sum = fluid.layers.reduce_mean(y_act)
pre_sum = fluid.layers.reduce_mean(y_pre)
MAE = fluid.layers.abs(act_sum - pre_sum)
train_step = fluid.optimizer.AdamOptimizer(learning_rate=0.001).minimize(loss)
# 创建一个使用CPU的执行器
place = fluid.CPUPlace()
exe = fluid.Executor(place)
# 进行参数初始化
exe.run(fluid.default_startup_program())
data_train = self.data_pre_train('train', self.dataset)
data_val = self.data_pre_train('val', self.dataset)
#main_program = fluid.default_main_program()
#startup_program = fluid.default_startup_program()
#exe = fluid.Executor()
best_mae = 10000
for epoch in range(max_epoch):
#training process
epoch_mae = 0
random.shuffle(data_train)
for i in range(len(data_train)):
data = data_train[i]
print(data)
x_in = np.reshape(data[0], (-1,1, data[0].shape[0], data[0].shape[1]))
y_ground = np.reshape(data[1], (-1, 1,data[1].shape[0], data[1].shape[1]))
_,loss,y_pre, act_sum, pre_sum,MAE = exe.run(program=fluid.default_main_program(),
feed={'image':x_in,'y_act':y_ground},
fetch_list=[train_step,loss,y_pre, act_sum, pre_sum,MAE])
#_,loss = exe.run(program=fluid.default_main_program(),
# feed={'image':x_in,'y_act':y_ground},
# fetch_list=[train_step,loss])
if i % 500 == 0:
print('epoch', epoch, 'step', i, 'mae:', m)
epoch_mae += m
epoch_mae /= len(data_train)
print('epoch', epoch + 1, 'train_mae:', epoch_mae)
#validation process
val_mae = 0
val_mse = 0
for i in range(len(data_val)):
data = data_val[i]
x_in = np.reshape(data[0], (1, data[0].shape[0], data[0].shape[1], 1))
y_ground = np.reshape(data[1], (1, data[1].shape[0], data[1].shape[1], 1))
act_s, pre_s, m = exe.run(main_program,
feed=feeder.feed(x_in,y_ground),
fetch_list=[act_sum, pre_sum,MAE])
val_mae += m
val_mse += (act_s - pre_s) * (act_s - pre_s)
val_mae /= len(data_val)
val_mse = math.sqrt(val_mse / len(data_val))
print('epoch', epoch, 'valid_mae:', val_mae, 'valid_mse:', val_mse)
if val_mae < best_mae:
best_mae = val_mae
print('best mae so far, saving model.')
if not os.path.exists(model_save_dir):
os.makedirs(model_save_dir)
#print 'save models to %s' % (model_path)
# 保存模型
fluid.io.save_inference_model(model_path, ['img'], [predict], exe)
else:
print('best mae:', best_mae)
print('**************************')
EPOCH = 100 fcnn = FCNN('A') fcnn.train(EPOCH)
您好,代码已上传,真的不知道哪里有问题,麻烦您了
报错信息能贴一下么
### **133** EPOCH = 100
134 fcnn = FCNN('A')
--> 135 fcnn.train(EPOCH)
### **133** EPOCH = 100 134 fcnn = FCNN('A')
--> 135 fcnn.train(EPOCH)
in train(self, max_epoch)
92 _,loss,y_pre, act_sum, pre_sum,MAE = exe.run(program=fluid.default_main_program(), 93 feed={'image':x_in,'y_act':y_ground}, ---> 94 fetch_list=[train_step,loss,y_pre, act_sum, pre_sum,MAE])
95 #_,loss = exe.run(program=fluid.default_main_program(),
96 # feed={'image':x_in,'y_act':y_ground},
/opt/conda/envs/python35-paddle120-env/lib/python3.5/site-packages/paddle/fluid/executor.py in run(self, program, feed, fetch_list, feed_var_name, fetch_var_name, scope, return_numpy, use_program_cache)
563 scope=scope,
564 return_numpy=return_numpy,
--> 565 use_program_cache=use_program_cache)
566 else:
567 if fetch_list and program._is_data_parallel and program._program and (
/opt/conda/envs/python35-paddle120-env/lib/python3.5/site-packages/paddle/fluid/executor.py in _run(self, program, exe, feed, fetch_list, feed_var_name, fetch_var_name, scope, return_numpy, use_program_cache)
618 % (type(program)))
619
--> 620 cache_key = _get_program_cache_key(feed, fetch_list)
621 if use_program_cache:
622 cached_program = self._get_program_cache(cache_key)
/opt/conda/envs/python35-paddle120-env/lib/python3.5/site-packages/paddle/fluid/executor.py in _get_program_cache_key(feed, fetch_list)
226 def _get_program_cache_key(feed, fetch_list):
227 feed_var_names = list(feed.keys())
--> 228 fetch_var_names = list(map(_to_name_str, fetch_list))
229
230 return str(feed_var_names + fetch_var_names)
/opt/conda/envs/python35-paddle120-env/lib/python3.5/site-packages/paddle/fluid/executor.py in _to_name_str(var)
221 return str(var)
222 else:
--> 223 raise TypeError(str(var) + " should be Variable or str")
这个是报错的信息么。。。看起来像是调试的信息,您能把您执行时报错的信息贴一下么,我看下,谢谢
(most recent call last)
optimizer.minimize
的返回值会是优化器的op和参数的梯度,您这里fetch的train_step
获取的是op,所以在fetch的时候报错了,fetch只能fetch var,https://github.com/PaddlePaddle/Paddle/blob/6ed73830c251ad54de71dd2db69bb82391b5bd17/python/paddle/fluid/optimizer.py#L565
如题