本文整理汇总了Python中torch.from_numpy函数的典型用法代码示例。如果您正苦于以下问题:Python from_numpy函数的具体用法?Python from_numpy怎么用?Python from_numpy使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了from_numpy函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的Python代码示例。
示例1: get_hierarchical_features_till_spawn
def get_hierarchical_features_till_spawn(self, actions, backtrack_steps=0):
action_length = len(actions)-1
pa, ca, pq_idx, cq_idx, ph_idx = flat_to_hierarchical_actions(actions)
target_pos_idx = action_length - backtrack_steps
controller_step = True
if target_pos_idx in pq_idx:
controller_step = False
pq_idx_pruned = [v for v in pq_idx if v <= target_pos_idx]
pa_pruned = pa[:len(pq_idx_pruned)+1]
images = self.get_frames(
self.episode_house,
self.episode_pos_queue,
preprocess=True)
raw_img_feats = self.cnn(
Variable(torch.FloatTensor(images)
.cuda())).data.cpu().numpy().copy()
controller_img_feat, controller_action_in = False, False
if controller_step == True:
controller_img_feat = torch.from_numpy(raw_img_feats[target_pos_idx].copy())
controller_action_in = pa_pruned[-1] - 2
planner_img_feats = torch.from_numpy(raw_img_feats[pq_idx_pruned].copy())
planner_actions_in = torch.from_numpy(np.array(pa_pruned[:-1]) - 1)
return planner_actions_in, planner_img_feats, controller_step, controller_action_in, controller_img_feat, self.episode_pos_queue[target_pos_idx]
开发者ID:wooridle,项目名称:EmbodiedQA,代码行数:31,代码来源:data.py
示例2: predict_proba
def predict_proba(self, dataset):
"""Predict predict probability for dataset.
This method will only work with method logistic/multiclass
Parameters:
----------
dataset (dict): dictionary with the testing dataset -
X_wide_test, X_deep_test, target
Returns:
--------
array-like with the probability for dataset.
"""
X_w = Variable(torch.from_numpy(dataset.wide)).float()
X_d = Variable(torch.from_numpy(dataset.deep))
if use_cuda:
X_w, X_d = X_w.cuda(), X_d.cuda()
# set the model in evaluation mode so dropout is not applied
net = self.eval()
pred = net(X_w,X_d).cpu()
if self.method == "logistic":
pred = pred.squeeze(1).data.numpy()
probs = np.zeros([pred.shape[0],2])
probs[:,0] = 1-pred
probs[:,1] = pred
return probs
if self.method == "multiclass":
return pred.data.numpy()
开发者ID:KyrieChin,项目名称:Wide-and-Deep-PyTorch,代码行数:31,代码来源:torch_model.py
示例3: evaluate
def evaluate(attention_model,x_test,y_test):
"""
cv results
Args:
attention_model : {object} model
x_test : {nplist} x_test
y_test : {nplist} y_test
Returns:
cv-accuracy
"""
attention_model.batch_size = x_test.shape[0]
attention_model.hidden_state = attention_model.init_hidden()
x_test_var = Variable(torch.from_numpy(x_test).type(torch.LongTensor))
y_test_pred,_ = attention_model(x_test_var)
if bool(attention_model.type):
y_preds = torch.max(y_test_pred,1)[1]
y_test_var = Variable(torch.from_numpy(y_test).type(torch.LongTensor))
else:
y_preds = torch.round(y_test_pred.type(torch.DoubleTensor).squeeze(1))
y_test_var = Variable(torch.from_numpy(y_test).type(torch.DoubleTensor))
return torch.eq(y_preds,y_test_var).data.sum()/x_test_var.size(0)
开发者ID:daiyongya,项目名称:Structured-Self-Attention,代码行数:28,代码来源:train.py
示例4: im_detect
def im_detect(net, im):
blobs, im_scales = _get_blobs(im)
assert len(im_scales) == 1, "Only single-image batch implemented"
im_blob = blobs['data']
blobs['im_info'] = np.array(
[im_blob.shape[1], im_blob.shape[2], im_scales[0]], dtype=np.float32)
_, scores, bbox_pred, rois = net.test_image(blobs['data'],
blobs['im_info'])
boxes = rois[:, 1:5] / im_scales[0]
scores = np.reshape(scores, [scores.shape[0], -1])
bbox_pred = np.reshape(bbox_pred, [bbox_pred.shape[0], -1])
if cfg.TEST.BBOX_REG:
# Apply bounding-box regression deltas
box_deltas = bbox_pred
pred_boxes = bbox_transform_inv(
torch.from_numpy(boxes), torch.from_numpy(box_deltas)).numpy()
pred_boxes = _clip_boxes(pred_boxes, im.shape)
else:
# Simply repeat the boxes, once for each class
pred_boxes = np.tile(boxes, (1, scores.shape[1]))
return scores, pred_boxes
开发者ID:zvant,项目名称:pytorch-faster-rcnn,代码行数:25,代码来源:test.py
示例5: get_test_data
def get_test_data(num_train=1000, num_test=500,
input_shape=(10,), output_shape=(2,),
classification=True, num_classes=2):
"""Generates test data to train a model on.
classification=True overrides output_shape
(i.e. output_shape is set to (1,)) and the output
consists in integers in [0, num_class-1].
Otherwise: float output with shape output_shape.
"""
samples = num_train + num_test
if classification:
y = np.random.randint(0, num_classes, size=(samples,))
X = np.zeros((samples,) + input_shape)
for i in range(samples):
X[i] = np.random.normal(loc=y[i], scale=0.7, size=input_shape)
else:
y_loc = np.random.random((samples,))
X = np.zeros((samples,) + input_shape)
y = np.zeros((samples,) + output_shape)
for i in range(samples):
X[i] = np.random.normal(loc=y_loc[i], scale=0.7, size=input_shape)
y[i] = np.random.normal(loc=y_loc[i], scale=0.7, size=output_shape)
return (th.from_numpy(X[:num_train]), th.from_numpy(y[:num_train])), \
(th.from_numpy(X[num_train:]), th.from_numpy(y[num_train:]))
开发者ID:BrianDo2005,项目名称:torchsample,代码行数:27,代码来源:utils.py
示例6: resize
def resize(original, um_sizes, desired_res):
""" Resize array originally of um_sizes size to have desired_res resolution.
We preserve the center of original and resized arrays exactly in the middle. We also
make sure resolution is exactly the desired resolution. Given these two constraints,
we cannot hold FOV of original and resized arrays to be exactly the same.
:param np.array original: Array to resize.
:param tuple um_sizes: Size in microns of the array (one per axis).
:param int or tuple desired_res: Desired resolution (um/px) for the output array.
:return: Output array (np.float32) resampled to the desired resolution. Size in pixels
is round(um_sizes / desired_res).
"""
import torch.nn.functional as F
# Create grid to sample in microns
grid = create_grid(um_sizes, desired_res) # d x h x w x 3
# Re-express as a torch grid [-1, 1]
um_per_px = np.array([um / px for um, px in zip(um_sizes, original.shape)])
torch_ones = np.array(um_sizes) / 2 - um_per_px / 2 # sample position of last pixel in original
grid = grid / torch_ones[::-1].astype(np.float32)
# Resample
input_tensor = torch.from_numpy(original.reshape(1, 1, *original.shape).astype(
np.float32))
grid_tensor = torch.from_numpy(grid.reshape(1, *grid.shape))
resized_tensor = F.grid_sample(input_tensor, grid_tensor, padding_mode='border')
resized = resized_tensor.numpy().squeeze()
return resized
开发者ID:dimitri-yatsenko,项目名称:pipeline,代码行数:32,代码来源:registration.py
示例7: interpolate
def interpolate(ae, gg, z1, z2, vocab,
steps=5, sample=None, maxlen=None):
"""
Interpolating in z space
Assumes that type(z1) == type(z2)
"""
if type(z1) == Variable:
noise1 = z1
noise2 = z2
elif type(z1) == torch.FloatTensor or type(z1) == torch.cuda.FloatTensor:
noise1 = Variable(z1, volatile=True)
noise2 = Variable(z2, volatile=True)
elif type(z1) == np.ndarray:
noise1 = Variable(torch.from_numpy(z1).float(), volatile=True)
noise2 = Variable(torch.from_numpy(z2).float(), volatile=True)
else:
raise ValueError("Unsupported input type (noise): {}".format(type(z1)))
# interpolation weights
lambdas = [x*1.0/(steps-1) for x in range(steps)]
gens = []
for L in lambdas:
gens.append(generate(ae, gg, (1-L)*noise1 + L*noise2,
vocab, sample, maxlen))
interpolations = []
for i in range(len(gens[0])):
interpolations.append([s[i] for s in gens])
return interpolations
开发者ID:wangwang110,项目名称:ARAE,代码行数:30,代码来源:generate.py
示例8: average_without_padding
def average_without_padding(x, ids, padding_id, cuda=False, eps=1e-8):
if cuda:
mask = Variable(torch.from_numpy(np.not_equal(ids, padding_id).astype(int)[:,:,np.newaxis])).float().cuda().permute(1, 2, 0).expand_as(x)
else:
mask = Variable(torch.from_numpy(np.not_equal(ids, padding_id).astype(int)[:,:,np.newaxis])).float().permute(1, 2, 0).expand_as(x)
s = torch.sum(x*mask, dim=2) / (torch.sum(mask, dim=2)+eps)
return s
开发者ID:sepiatone,项目名称:information_retrieval,代码行数:7,代码来源:utils.py
示例9: artist_works_with_labels
def artist_works_with_labels(): # painting from the famous artist (real target)
a = np.random.uniform(1, 2, size=BATCH_SIZE)[:, np.newaxis]
paintings = a * np.power(PAINT_POINTS, 2) + (a-1)
labels = (a-1) > 0.5 # upper paintings (1), lower paintings (0), two classes
paintings = torch.from_numpy(paintings).float()
labels = torch.from_numpy(labels.astype(np.float32))
return paintings, labels
开发者ID:Chandan-IITI,项目名称:PyTorch-Tutorial,代码行数:7,代码来源:406_conditional_GAN.py
示例10: run_test
def run_test(self, args):
print("testing...")
self.eval()
game = DoomInstance(
args.vizdoom_config, args.wad_path, args.skiprate, visible=True, actions=args.action_set, bot_cmd=args.bot_cmd)
step_state = game.get_state_normalized()
state = NormalizedState(screen=None, depth=None, labels=None, variables=None)
state.screen = torch.Tensor(1, *args.screen_size)
state.variables = torch.Tensor(1, args.variable_num)
while True:
# convert state to torch tensors
state.screen[0, :] = torch.from_numpy(step_state.screen)
state.variables[0, :] = torch.from_numpy(step_state.variables)
# compute an action
action = self.get_action(state)
# render
step_state, _, finished = game.step_normalized(action[0][0])
#img = step_state.screen[0:3, :]
#img = img.transpose(1, 2, 0)
#plt.imsave('depth-plan.png', img)
if finished:
print("episode return: {}".format(game.get_episode_return()))
self.set_terminal(torch.zeros(1))
开发者ID:shubhampachori12110095,项目名称:doom-net-pytorch,代码行数:26,代码来源:aac_base.py
示例11: flow_resnet50_aux
def flow_resnet50_aux(pretrained=False, **kwargs):
"""Constructs a ResNet-50 model.
Args:
pretrained (bool): If True, returns a model pre-trained on ImageNet
"""
model = ResNet(Bottleneck, [3, 4, 6, 3], **kwargs)
if pretrained:
# model.load_state_dict(model_zoo.load_url(model_urls['resnet50']))
pretrained_dict = model_zoo.load_url(model_urls['resnet50'])
model_dict = model.state_dict()
fc_origin_weight = pretrained_dict["fc.weight"].data.numpy()
fc_origin_bias = pretrained_dict["fc.bias"].data.numpy()
# 1. filter out unnecessary keys
pretrained_dict = {k: v for k, v in pretrained_dict.items() if k in model_dict}
# 2. overwrite entries in the existing state dict
model_dict.update(pretrained_dict)
# print(model_dict)
fc_new_weight = model_dict["fc_aux.weight"].numpy()
fc_new_bias = model_dict["fc_aux.bias"].numpy()
fc_new_weight[:1000, :] = fc_origin_weight
fc_new_bias[:1000] = fc_origin_bias
model_dict["fc_aux.weight"] = torch.from_numpy(fc_new_weight)
model_dict["fc_aux.bias"] = torch.from_numpy(fc_new_bias)
# 3. load the new state dict
model.load_state_dict(model_dict)
return model
开发者ID:Alawaka,项目名称:two-stream-pytorch,代码行数:33,代码来源:flow_resnet.py
示例12: __init__
def __init__(self, height, width, lr = 1, aux_loss = False, ray_tracing = False):
super(Depth3DGridGen_with_mask, self).__init__()
self.height, self.width = height, width
self.aux_loss = aux_loss
self.lr = lr
self.ray_tracing = ray_tracing
self.grid = np.zeros( [self.height, self.width, 3], dtype=np.float32)
self.grid[:,:,0] = np.expand_dims(np.repeat(np.expand_dims(np.arange(-1, 1, 2.0/self.height), 0), repeats = self.width, axis = 0).T, 0)
self.grid[:,:,1] = np.expand_dims(np.repeat(np.expand_dims(np.arange(-1, 1, 2.0/self.width), 0), repeats = self.height, axis = 0), 0)
self.grid[:,:,2] = np.ones([self.height, width])
self.grid = torch.from_numpy(self.grid.astype(np.float32))
self.theta = self.grid[:,:,0] * np.pi/2 + np.pi/2
self.phi = self.grid[:,:,1] * np.pi
self.x = torch.sin(self.theta) * torch.cos(self.phi)
self.y = torch.sin(self.theta) * torch.sin(self.phi)
self.z = torch.cos(self.theta)
self.grid3d = torch.from_numpy(np.zeros( [self.height, self.width, 4], dtype=np.float32))
self.grid3d[:,:,0] = self.x
self.grid3d[:,:,1] = self.y
self.grid3d[:,:,2] = self.z
self.grid3d[:,:,3] = self.grid[:,:,2]
开发者ID:Dtean,项目名称:faster-rcnn.pytorch,代码行数:26,代码来源:gridgen.py
示例13: train
def train():
num_classses = 21
net = ssd.SSD300(num_classes=num_classses)
ssd_box_coder = ssd.SSDBoxCoder(net)
C, H, W = (3, 300, 300)
x = Variable(torch.randn(1, C, H, W))
boxes = torch.from_numpy(np.array([(0, 0, 100, 100), (25, 25, 125, 125), (200, 200, 250, 250), (0, 0, 300, 300)], dtype=np.float32))
labels = torch.from_numpy(np.array([1, 2, 3, 4], dtype=np.long))
loc_targets, cls_targets = ssd_box_coder.encode(boxes, labels)
loc_targets = loc_targets[None, :]
cls_targets = cls_targets[None, :]
# print('loc_targets.size():{}'.format(loc_targets.size()))
# print('cls_targets.size():{}'.format(cls_targets.size()))
optimizer = optim.SGD(net.parameters(), lr=1e-5, momentum=0.9, weight_decay=5e-4)
criterion = ssd.SSDLoss(num_classes=num_classses)
for epoch in range(100):
loc_preds, cls_preds = net(x)
# print('loc_preds.size():{}'.format(loc_preds.size()))
# print('cls_preds.size():{}'.format(cls_preds.size()))
optimizer.zero_grad()
loss = criterion(loc_preds, loc_targets, cls_preds, cls_targets)
loss.backward()
optimizer.step()
开发者ID:zhliue,项目名称:objdet,代码行数:27,代码来源:train_ssd.py
示例14: transform
def transform(self, img, lbl):
"""transform
:param img:
:param lbl:
"""
img = img[:, :, ::-1]
img = img.astype(np.float64)
img -= self.mean
img = m.imresize(img, (self.img_size[0], self.img_size[1]))
# Resize scales images from 0 to 255, thus we need
# to divide by 255.0
img = img.astype(float) / 255.0
# NHWC -> NCWH
img = img.transpose(2, 0, 1)
classes = np.unique(lbl)
lbl = lbl.astype(float)
lbl = m.imresize(lbl, (self.img_size[0], self.img_size[1]), 'nearest', mode='F')
lbl = lbl.astype(int)
if not np.all(classes == np.unique(lbl)):
print("WARN: resizing labels yielded fewer classes")
if not np.all(np.unique(lbl[lbl!=self.ignore_index]) < self.n_classes):
print('after det', classes, np.unique(lbl))
raise ValueError("Segmentation map contained invalid class values")
img = torch.from_numpy(img).float()
lbl = torch.from_numpy(lbl).long()
return img, lbl
开发者ID:clavichord93,项目名称:pytorch-semseg,代码行数:33,代码来源:cityscapes_loader.py
示例15: l2l_validate
def l2l_validate(model, cluster_center, n_epoch=100):
val_accuracy = []
for epoch in range(n_epoch):
data_l = generate_data_l(cluster_center)
data_n = generate_data_n(cluster_center, model.n_class_n)
x_l, y_l = Variable(torch.from_numpy(data_l[0])).float(), Variable(
torch.from_numpy(data_l[1]))
x_n, y_n = Variable(torch.from_numpy(data_n[0])).float(), Variable(
torch.from_numpy(data_n[1]))
pred_ll, pred_nl, w, b = model(x_l, x_n)
M = Variable(torch.zeros(model.n_class_n, model.n_dim))
B = Variable(torch.zeros(model.n_class_n))
for k in range(model.n_class_n):
M[k] = torch.cat((w[:, 0][y_n == model.n_class_l + k].view(-1, 1),
w[:, 1][y_n == model.n_class_l + k].view(-1, 1)), 1).mean(0)
B[k] = b[y_n == model.n_class_l + k].mean()
pred_ln = torch.mm(x_l, M.t()) + B.view(1, -1).expand_as(torch.mm(x_l, M.t()))
pred_nn = torch.mm(x_n, M.t()) + B.view(1, -1).expand_as(torch.mm(x_n, M.t()))
pred = torch.cat((torch.cat((pred_ll, pred_nl)), torch.cat((pred_ln, pred_nn))), 1)
pred = pred.data.max(1)[1]
y = torch.cat((y_l, y_n))
accuracy = pred.eq(y.data).cpu().sum() * 1.0 / y.size()[0]
# print('accuracy: %.2f' % accuracy)
val_accuracy.append(accuracy)
acc_l = pred.eq(y.data).cpu()[0:100].sum() * 1.0 / 100
acc_n = pred.eq(y.data).cpu()[100:150].sum() * 1.0 / 50
print('accuracy: %.2f, lifelong accuracy: %.2f, new accuracy: %.2f' % (accuracy, acc_l, acc_n))
return numpy.mean(numpy.asarray(val_accuracy))
开发者ID:yangyi02,项目名称:my-scripts,代码行数:29,代码来源:learning_to_learn_lifelong_newclass_trunc.py
示例16: __call__
def __call__(self, inputs):
if isinstance(inputs, Image.Image):
inputs = torch.from_numpy(np.array(inputs).transpose(2, 0, 1))
else:
inputs = torch.from_numpy(inputs.transpose(2, 0, 1))
return inputs.float()
开发者ID:shubhampachori12110095,项目名称:pytorch-cv,代码行数:7,代码来源:transforms.py
示例17: l2l_train
def l2l_train(model, cluster_center, n_epoch=10000, trunc_step=10):
optimizer = optim.Adam(model.parameters(), lr=0.01)
M_all = Variable(torch.zeros(model.n_class, model.n_dim))
B_all = Variable(torch.zeros(model.n_class))
for epoch in range(n_epoch):
loss = 0
M_step, B_step = [], []
for step in range(trunc_step):
data = generate_data(cluster_center)
optimizer.zero_grad()
x, y = Variable(torch.from_numpy(data[0])).float(), Variable(torch.from_numpy(data[1]))
w, b = model(x)
M = Variable(torch.zeros(model.n_class_n, model.n_dim))
B = Variable(torch.zeros(model.n_class_n))
for k in range(model.n_class_n):
M[k] = torch.cat((w[:, 0][y == model.n_class_l + k].view(-1, 1),
w[:, 1][y == model.n_class_l + k].view(-1, 1)), 1).mean(0)
B[k] = b[y == model.n_class_l + k].mean()
if step == 0:
M_ = M
B_ = B
else:
M_ = step / (step + 1) * M_step[-1] + 1 / (step + 1) * M
B_ = step / (step + 1) * B_step[-1] + 1 / (step + 1) * B
M_step.append(M_)
B_step.append(B_)
pred = torch.mm(x, M_.t()) + B_.view(1, -1).expand_as(torch.mm(x, M_.t()))
loss += F.cross_entropy(pred, y)
loss.backward()
optimizer.step()
print('Train Epoch: {}\tLoss: {:.6f}'.format(epoch, loss.data[0]))
return M_all, B_all, cluster_center
开发者ID:yangyi02,项目名称:my-scripts,代码行数:32,代码来源:learning_to_learn_lifelong_newclass_trunc.py
示例18: data_generator
def data_generator(args, screens, variables, labels, episodes):
# remove short episodes
episode_min_size = args.episode_size*args.skiprate
episodes = episodes[episodes[:, 1]-episodes[:, 0] > episode_min_size]
episodes_num = len(episodes)
#
batch_size = args.batch_size
step_idx = episodes[:, 0].copy() + np.random.randint(args.skiprate, size=episodes_num)
step_screens = np.ndarray(shape=(batch_size, *screens.shape[1:]), dtype=np.float32)
step_variables = np.ndarray(shape=(batch_size, *variables.shape[1:]), dtype=np.float32)
step_labels = np.ndarray(shape=(batch_size,), dtype=np.int)
step_terminals = np.ones(shape=(batch_size, 1), dtype=np.float32)
# select episodes for the initial batch
batch_episodes = np.random.randint(episodes_num, size=batch_size)
while True:
for i in range(batch_size):
idx = batch_episodes[i]
step_screens[i, :] = screens[step_idx[idx]] / 127.5 - 1.0
step_variables[i, :] = variables[step_idx[idx]] / 100
step_labels[i] = labels[step_idx[idx]]
step_idx[idx] += args.skiprate
if step_idx[idx] > episodes[idx][1]:
step_idx[idx] = episodes[idx][0] + np.random.randint(args.skiprate)
step_terminals[i] = 0
# reached terminal state, select a new episode
batch_episodes[i] = np.random.randint(episodes_num)
else:
step_terminals[i] = 1
yield torch.from_numpy(step_screens), \
torch.from_numpy(step_variables), \
torch.from_numpy(step_labels), \
torch.from_numpy(step_terminals)
开发者ID:shubhampachori12110095,项目名称:doom-net-pytorch,代码行数:33,代码来源:imitation_lstm.py
示例19: load_pretrained_npy
def load_pretrained_npy(faster_rcnn_model, fname):
params = np.load(fname).item()
# vgg16
vgg16_dict = faster_rcnn_model.rpn.features.state_dict()
for name, val in list(vgg16_dict.items()):
# # print name
# # print val.size()
# # print param.size()
if name.find('bn.') >= 0:
continue
i, j = int(name[4]), int(name[6]) + 1
ptype = 'weights' if name[-1] == 't' else 'biases'
key = 'conv{}_{}'.format(i, j)
param = torch.from_numpy(params[key][ptype])
if ptype == 'weights':
param = param.permute(3, 2, 0, 1)
val.copy_(param)
# fc6 fc7
frcnn_dict = faster_rcnn_model.state_dict()
pairs = {'fc6.fc': 'fc6', 'fc7.fc': 'fc7'}
for k, v in list(pairs.items()):
key = '{}.weight'.format(k)
param = torch.from_numpy(params[v]['weights']).permute(1, 0)
frcnn_dict[key].copy_(param)
key = '{}.bias'.format(k)
param = torch.from_numpy(params[v]['biases'])
frcnn_dict[key].copy_(param)
开发者ID:jjprincess,项目名称:yolo2-pytorch,代码行数:31,代码来源:network.py
示例20: corrupt
def corrupt(self, src, rel, dst):
prob = self.bern_prob[rel]
selection = torch.bernoulli(prob).numpy().astype('int64')
ent_random = choice(self.n_ent, len(src))
src_out = (1 - selection) * src.numpy() + selection * ent_random
dst_out = selection * dst.numpy() + (1 - selection) * ent_random
return torch.from_numpy(src_out), torch.from_numpy(dst_out)
开发者ID:cai-lw,项目名称:KBGAN,代码行数:7,代码来源:corrupter.py
注:本文中的torch.from_numpy函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论