diff --git a/CMakeLists.txt b/CMakeLists.txt index 5687b8e7a..e7dc1d2c4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,10 +29,10 @@ LIST(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/Thirdparty) #string(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" VERSION_PATCH "${VERSION}") -SET(PACKAGE_VERSION 4.2.0) # ${VERSION}) -SET(VERSION 4.2.0) +SET(PACKAGE_VERSION 4.3.0) # ${VERSION}) +SET(VERSION 4.3.0) SET(SINGA_MAJOR_VERSION 4) -SET(SINGA_MINOR_VERSION 2) +SET(SINGA_MINOR_VERSION 3) SET(SINGA_PATCH_VERSION 0) #SET(SINGA_MAJOR_VERSION ${VERSION_MAJOR}) # 0 - #SET(SINGA_MINOR_VERSION ${VERSION_MINOR}) # 0 - 9 diff --git a/RELEASE_NOTES b/RELEASE_NOTES index b475aed55..fe9384656 100644 --- a/RELEASE_NOTES +++ b/RELEASE_NOTES @@ -1,3 +1,31 @@ +Release Notes - SINGA - Version singa-4.3.0 + +SINGA is a distributed deep learning library. + +This release includes following changes: + + * Add the implementation for the Transformer example. + + * Enhance examples + * Update the readme file for the dynamic model slicing example. + * Update the HFL example by setting the maximum number of epochs. + * Add the multiprocess training implementation for the cnn ms example. + * Add the sparsification version of the model for the cnn ms example. + + * Extend the matrix multiplication operator to more dimensions. + + * Update the data types and tensor operations for model training. + + * Add the implementation for the new sum error loss. + + * Update the website + * Add the news for the SIGMOD Systems Award. + + * Fix bugs + * Fix the Github Actions for online code testing. + +---------------------------------------------------------------------------------------------- + Release Notes - SINGA - Version singa-4.2.0 SINGA is a distributed deep learning library. diff --git a/examples/cnn_ms/autograd/mnist_cnn.py b/examples/cnn_ms/autograd/mnist_cnn.py new file mode 100644 index 000000000..16752ceab --- /dev/null +++ b/examples/cnn_ms/autograd/mnist_cnn.py @@ -0,0 +1,304 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +from singa import singa_wrap as singa +from singa import autograd +from singa import layer +from singa import tensor +from singa import device +from singa import opt +import numpy as np +import os +import sys +import gzip +import codecs +import time + + +class CNN: + + def __init__(self): + self.conv1 = layer.Conv2d(1, 20, 5, padding=0) + self.conv2 = layer.Conv2d(20, 50, 5, padding=0) + self.linear1 = layer.Linear(4 * 4 * 50, 500) + self.linear2 = layer.Linear(500, 10) + self.pooling1 = layer.MaxPool2d(2, 2, padding=0) + self.pooling2 = layer.MaxPool2d(2, 2, padding=0) + self.relu1 = layer.ReLU() + self.relu2 = layer.ReLU() + self.relu3 = layer.ReLU() + self.flatten = layer.Flatten() + + def forward(self, x): + y = self.conv1(x) + y = self.relu1(y) + y = self.pooling1(y) + y = self.conv2(y) + y = self.relu2(y) + y = self.pooling2(y) + y = self.flatten(y) + y = self.linear1(y) + y = self.relu3(y) + y = self.linear2(y) + return y + + +def check_dataset_exist(dirpath): + if not os.path.exists(dirpath): + print( + 'The MNIST dataset does not exist. Please download the mnist dataset using download_mnist.py (e.g. python3 download_mnist.py)' + ) + sys.exit(0) + return dirpath + + +def load_dataset(): + train_x_path = '/tmp/train-images-idx3-ubyte.gz' + train_y_path = '/tmp/train-labels-idx1-ubyte.gz' + valid_x_path = '/tmp/t10k-images-idx3-ubyte.gz' + valid_y_path = '/tmp/t10k-labels-idx1-ubyte.gz' + + train_x = read_image_file(check_dataset_exist(train_x_path)).astype( + np.float32) + train_y = read_label_file(check_dataset_exist(train_y_path)).astype( + np.float32) + valid_x = read_image_file(check_dataset_exist(valid_x_path)).astype( + np.float32) + valid_y = read_label_file(check_dataset_exist(valid_y_path)).astype( + np.float32) + return train_x, train_y, valid_x, valid_y + + +def read_label_file(path): + with gzip.open(path, 'rb') as f: + data = f.read() + assert get_int(data[:4]) == 2049 + length = get_int(data[4:8]) + parsed = np.frombuffer(data, dtype=np.uint8, offset=8).reshape((length)) + return parsed + + +def get_int(b): + return int(codecs.encode(b, 'hex'), 16) + + +def read_image_file(path): + with gzip.open(path, 'rb') as f: + data = f.read() + assert get_int(data[:4]) == 2051 + length = get_int(data[4:8]) + num_rows = get_int(data[8:12]) + num_cols = get_int(data[12:16]) + parsed = np.frombuffer(data, dtype=np.uint8, offset=16).reshape( + (length, 1, num_rows, num_cols)) + return parsed + + +def to_categorical(y, num_classes): + y = np.array(y, dtype="int") + n = y.shape[0] + categorical = np.zeros((n, num_classes)) + categorical[np.arange(n), y] = 1 + categorical = categorical.astype(np.float32) + return categorical + + +def accuracy(pred, target): + y = np.argmax(pred, axis=1) + t = np.argmax(target, axis=1) + a = y == t + return np.array(a, "int").sum() + + +# Function to all reduce NUMPY accuracy and loss from multiple devices +def reduce_variable(variable, dist_opt, reducer): + reducer.copy_from_numpy(variable) + dist_opt.all_reduce(reducer.data) + dist_opt.wait() + output = tensor.to_numpy(reducer) + return output + + +# Function to sychronize SINGA TENSOR initial model parameters +def synchronize(tensor, dist_opt): + dist_opt.all_reduce(tensor.data) + dist_opt.wait() + tensor /= dist_opt.world_size + + +# Data augmentation +def augmentation(x, batch_size): + xpad = np.pad(x, [[0, 0], [0, 0], [4, 4], [4, 4]], 'symmetric') + for data_num in range(0, batch_size): + offset = np.random.randint(8, size=2) + x[data_num, :, :, :] = xpad[data_num, :, offset[0]:offset[0] + 28, + offset[1]:offset[1] + 28] + if_flip = np.random.randint(2) + if (if_flip): + x[data_num, :, :, :] = x[data_num, :, :, ::-1] + return x + + +# Data partition +def data_partition(dataset_x, dataset_y, global_rank, world_size): + data_per_rank = dataset_x.shape[0] // world_size + idx_start = global_rank * data_per_rank + idx_end = (global_rank + 1) * data_per_rank + return dataset_x[idx_start:idx_end], dataset_y[idx_start:idx_end] + + +def train_mnist_cnn(DIST=False, + local_rank=None, + world_size=None, + nccl_id=None, + spars=0, + topK=False, + corr=True): + + # Define the hypermeters for the mnist_cnn + max_epoch = 10 + batch_size = 64 + sgd = opt.SGD(lr=0.005, momentum=0.9, weight_decay=1e-5) + + # Prepare training and valadiation data + train_x, train_y, test_x, test_y = load_dataset() + IMG_SIZE = 28 + num_classes = 10 + train_y = to_categorical(train_y, num_classes) + test_y = to_categorical(test_y, num_classes) + + # Normalization + train_x = train_x / 255 + test_x = test_x / 255 + + if DIST: + # For distributed GPU training + sgd = opt.DistOpt(sgd, + nccl_id=nccl_id, + local_rank=local_rank, + world_size=world_size) + dev = device.create_cuda_gpu_on(sgd.local_rank) + + # Dataset partition for distributed training + train_x, train_y = data_partition(train_x, train_y, sgd.global_rank, + sgd.world_size) + test_x, test_y = data_partition(test_x, test_y, sgd.global_rank, + sgd.world_size) + world_size = sgd.world_size + else: + # For single GPU + dev = device.create_cuda_gpu() + world_size = 1 + + # Create model + model = CNN() + + tx = tensor.Tensor((batch_size, 1, IMG_SIZE, IMG_SIZE), dev, tensor.float32) + ty = tensor.Tensor((batch_size, num_classes), dev, tensor.int32) + num_train_batch = train_x.shape[0] // batch_size + num_test_batch = test_x.shape[0] // batch_size + idx = np.arange(train_x.shape[0], dtype=np.int32) + + if DIST: + #Sychronize the initial parameters + autograd.training = True + x = np.random.randn(batch_size, 1, IMG_SIZE, + IMG_SIZE).astype(np.float32) + y = np.zeros(shape=(batch_size, num_classes), dtype=np.int32) + tx.copy_from_numpy(x) + ty.copy_from_numpy(y) + out = model.forward(tx) + loss = autograd.softmax_cross_entropy(out, ty) + for p, g in autograd.backward(loss): + synchronize(p, sgd) + + # Training and evaulation loop + for epoch in range(max_epoch): + start_time = time.time() + np.random.shuffle(idx) + + if ((DIST == False) or (sgd.global_rank == 0)): + print('Starting Epoch %d:' % (epoch)) + + # Training phase + autograd.training = True + train_correct = np.zeros(shape=[1], dtype=np.float32) + test_correct = np.zeros(shape=[1], dtype=np.float32) + train_loss = np.zeros(shape=[1], dtype=np.float32) + + for b in range(num_train_batch): + x = train_x[idx[b * batch_size:(b + 1) * batch_size]] + x = augmentation(x, batch_size) + y = train_y[idx[b * batch_size:(b + 1) * batch_size]] + tx.copy_from_numpy(x) + ty.copy_from_numpy(y) + out = model.forward(tx) + loss = autograd.softmax_cross_entropy(out, ty) + train_correct += accuracy(tensor.to_numpy(out), y) + train_loss += tensor.to_numpy(loss)[0] + if DIST: + if (spars == 0): + sgd.backward_and_update(loss, threshold=50000) + else: + sgd.backward_and_sparse_update(loss, + spars=spars, + topK=topK, + corr=corr) + else: + sgd(loss) + + if DIST: + # Reduce the evaluation accuracy and loss from multiple devices + reducer = tensor.Tensor((1,), dev, tensor.float32) + train_correct = reduce_variable(train_correct, sgd, reducer) + train_loss = reduce_variable(train_loss, sgd, reducer) + + # Output the training loss and accuracy + if ((DIST == False) or (sgd.global_rank == 0)): + print('Training loss = %f, training accuracy = %f' % + (train_loss, train_correct / + (num_train_batch * batch_size * world_size)), + flush=True) + + # Evaluation phase + autograd.training = False + for b in range(num_test_batch): + x = test_x[b * batch_size:(b + 1) * batch_size] + y = test_y[b * batch_size:(b + 1) * batch_size] + tx.copy_from_numpy(x) + ty.copy_from_numpy(y) + out_test = model.forward(tx) + test_correct += accuracy(tensor.to_numpy(out_test), y) + + if DIST: + # Reduce the evaulation accuracy from multiple devices + test_correct = reduce_variable(test_correct, sgd, reducer) + + # Output the evaluation accuracy + if ((DIST == False) or (sgd.global_rank == 0)): + print('Evaluation accuracy = %f, Elapsed Time = %fs' % + (test_correct / (num_test_batch * batch_size * world_size), + time.time() - start_time), + flush=True) + + +if __name__ == '__main__': + + DIST = False + train_mnist_cnn(DIST=DIST) diff --git a/examples/cnn_ms/autograd/mnist_dist.py b/examples/cnn_ms/autograd/mnist_dist.py new file mode 100644 index 000000000..3586127c4 --- /dev/null +++ b/examples/cnn_ms/autograd/mnist_dist.py @@ -0,0 +1,25 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +from mnist_cnn import * + +if __name__ == '__main__': + + DIST = True + train_mnist_cnn(DIST=DIST) diff --git a/examples/cnn_ms/autograd/mnist_multiprocess.py b/examples/cnn_ms/autograd/mnist_multiprocess.py new file mode 100644 index 000000000..a1a1fe58e --- /dev/null +++ b/examples/cnn_ms/autograd/mnist_multiprocess.py @@ -0,0 +1,39 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +from mnist_cnn import * +import multiprocessing +import sys + +if __name__ == '__main__': + + # Generate a NCCL ID to be used for collective communication + nccl_id = singa.NcclIdHolder() + + # Number of GPUs to be used + world_size = int(sys.argv[1]) + + process = [] + for local_rank in range(0, world_size): + process.append( + multiprocessing.Process(target=train_mnist_cnn, + args=(True, local_rank, world_size, nccl_id))) + + for p in process: + p.start() \ No newline at end of file diff --git a/examples/cnn_ms/autograd/resnet_cifar10.py b/examples/cnn_ms/autograd/resnet_cifar10.py new file mode 100644 index 000000000..d71e0f29b --- /dev/null +++ b/examples/cnn_ms/autograd/resnet_cifar10.py @@ -0,0 +1,292 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +try: + import pickle +except ImportError: + import cPickle as pickle + +from singa import singa_wrap as singa +from singa import autograd +from singa import tensor +from singa import device +from singa import opt +from PIL import Image +import numpy as np +import os +import sys +import time + + +def load_dataset(filepath): + with open(filepath, 'rb') as fd: + try: + cifar10 = pickle.load(fd, encoding='latin1') + except TypeError: + cifar10 = pickle.load(fd) + image = cifar10['data'].astype(dtype=np.uint8) + image = image.reshape((-1, 3, 32, 32)) + label = np.asarray(cifar10['labels'], dtype=np.uint8) + label = label.reshape(label.size, 1) + return image, label + + +def load_train_data(dir_path='cifar-10-batches-py', num_batches=5): + labels = [] + batchsize = 10000 + images = np.empty((num_batches * batchsize, 3, 32, 32), dtype=np.uint8) + for did in range(1, num_batches + 1): + fname_train_data = dir_path + "/data_batch_{}".format(did) + image, label = load_dataset(check_dataset_exist(fname_train_data)) + images[(did - 1) * batchsize:did * batchsize] = image + labels.extend(label) + images = np.array(images, dtype=np.float32) + labels = np.array(labels, dtype=np.int32) + return images, labels + + +def load_test_data(dir_path='cifar-10-batches-py'): + images, labels = load_dataset(check_dataset_exist(dir_path + "/test_batch")) + return np.array(images, dtype=np.float32), np.array(labels, dtype=np.int32) + + +def check_dataset_exist(dirpath): + if not os.path.exists(dirpath): + print( + 'Please download the cifar10 dataset using download_data.py (e.g. python ~/singa/examples/cifar10/download_data.py py)' + ) + sys.exit(0) + return dirpath + + +def normalize_for_resnet(train_x, test_x): + mean = [0.4914, 0.4822, 0.4465] + std = [0.2023, 0.1994, 0.2010] + train_x /= 255 + test_x /= 255 + for ch in range(0, 2): + train_x[:, ch, :, :] -= mean[ch] + train_x[:, ch, :, :] /= std[ch] + test_x[:, ch, :, :] -= mean[ch] + test_x[:, ch, :, :] /= std[ch] + return train_x, test_x + + +def resize_dataset(x, IMG_SIZE): + num_data = x.shape[0] + dim = x.shape[1] + X = np.zeros(shape=(num_data, dim, IMG_SIZE, IMG_SIZE), dtype=np.float32) + for n in range(0, num_data): + for d in range(0, dim): + X[n, d, :, :] = np.array(Image.fromarray(x[n, d, :, :]).resize( + (IMG_SIZE, IMG_SIZE), Image.BILINEAR), + dtype=np.float32) + return X + + +def augmentation(x, batch_size): + xpad = np.pad(x, [[0, 0], [0, 0], [4, 4], [4, 4]], 'symmetric') + for data_num in range(0, batch_size): + offset = np.random.randint(8, size=2) + x[data_num, :, :, :] = xpad[data_num, :, offset[0]:offset[0] + 32, + offset[1]:offset[1] + 32] + if_flip = np.random.randint(2) + if (if_flip): + x[data_num, :, :, :] = x[data_num, :, :, ::-1] + return x + + +def accuracy(pred, target): + y = np.argmax(pred, axis=1) + t = np.argmax(target, axis=1) + a = y == t + return np.array(a, "int").sum() + + +def to_categorical(y, num_classes): + y = np.array(y, dtype="int") + n = y.shape[0] + categorical = np.zeros((n, num_classes)) + for i in range(0, n): + categorical[i, y[i]] = 1 + categorical = categorical.astype(np.float32) + return categorical + + +# Function to all reduce NUMPY accuracy and loss from multiple devices +def reduce_variable(variable, dist_opt, reducer): + reducer.copy_from_numpy(variable) + dist_opt.all_reduce(reducer.data) + dist_opt.wait() + output = tensor.to_numpy(reducer) + return output + + +# Function to sychronize SINGA TENSOR initial model parameters +def synchronize(tensor, dist_opt): + dist_opt.all_reduce(tensor.data) + dist_opt.wait() + tensor /= dist_opt.world_size + + +# Data partition +def data_partition(dataset_x, dataset_y, global_rank, world_size): + data_per_rank = dataset_x.shape[0] // world_size + idx_start = global_rank * data_per_rank + idx_end = (global_rank + 1) * data_per_rank + return dataset_x[idx_start:idx_end], dataset_y[idx_start:idx_end] + + +def train_cifar10(DIST=False, + local_rank=None, + world_size=None, + nccl_id=None, + partial_update=False): + + # Define the hypermeters for the train_cifar10 + sgd = opt.SGD(lr=0.005, momentum=0.9, weight_decay=1e-5) + max_epoch = 5 + batch_size = 32 + + train_x, train_y = load_train_data() + test_x, test_y = load_test_data() + train_x, test_x = normalize_for_resnet(train_x, test_x) + IMG_SIZE = 224 + num_classes = 10 + + if DIST: + # For distributed GPU training + sgd = opt.DistOpt(sgd, + nccl_id=nccl_id, + local_rank=local_rank, + world_size=world_size) + dev = device.create_cuda_gpu_on(sgd.local_rank) + + # Dataset partition for distributed training + train_x, train_y = data_partition(train_x, train_y, sgd.global_rank, + sgd.world_size) + test_x, test_y = data_partition(test_x, test_y, sgd.global_rank, + sgd.world_size) + world_size = sgd.world_size + else: + # For single GPU + dev = device.create_cuda_gpu() + world_size = 1 + + from resnet import resnet50 + model = resnet50(num_classes=num_classes) + + tx = tensor.Tensor((batch_size, 3, IMG_SIZE, IMG_SIZE), dev, tensor.float32) + ty = tensor.Tensor((batch_size,), dev, tensor.int32) + num_train_batch = train_x.shape[0] // batch_size + num_test_batch = test_x.shape[0] // batch_size + idx = np.arange(train_x.shape[0], dtype=np.int32) + + if DIST: + # Sychronize the initial parameters + autograd.training = True + x = np.random.randn(batch_size, 3, IMG_SIZE, + IMG_SIZE).astype(np.float32) + y = np.zeros(shape=(batch_size,), dtype=np.int32) + tx.copy_from_numpy(x) + ty.copy_from_numpy(y) + out = model(tx) + loss = autograd.softmax_cross_entropy(out, ty) + param = [] + for p, _ in autograd.backward(loss): + synchronize(p, sgd) + param.append(p) + + for epoch in range(max_epoch): + start_time = time.time() + np.random.shuffle(idx) + + if ((DIST == False) or (sgd.global_rank == 0)): + print('Starting Epoch %d:' % (epoch)) + + # Training phase + autograd.training = True + train_correct = np.zeros(shape=[1], dtype=np.float32) + test_correct = np.zeros(shape=[1], dtype=np.float32) + train_loss = np.zeros(shape=[1], dtype=np.float32) + + for b in range(num_train_batch): + x = train_x[idx[b * batch_size:(b + 1) * batch_size]] + x = augmentation(x, batch_size) + x = resize_dataset(x, IMG_SIZE) + y = train_y[idx[b * batch_size:(b + 1) * batch_size]] + tx.copy_from_numpy(x) + ty.copy_from_numpy(y) + out = model(tx) + loss = autograd.softmax_cross_entropy(out, ty) + train_correct += accuracy(tensor.to_numpy(out), + to_categorical(y, num_classes)).astype( + np.float32) + train_loss += tensor.to_numpy(loss)[0] + if not partial_update: + sgd.backward_and_update(loss) + else: + sgd.backward_and_partial_update(loss) + + if DIST: + # Reduce the evaluation accuracy and loss from multiple devices + reducer = tensor.Tensor((1,), dev, tensor.float32) + train_correct = reduce_variable(train_correct, sgd, reducer) + train_loss = reduce_variable(train_loss, sgd, reducer) + + # Output the training loss and accuracy + if ((DIST == False) or (sgd.global_rank == 0)): + print('Training loss = %f, training accuracy = %f' % + (train_loss, train_correct / + (num_train_batch * batch_size * world_size)), + flush=True) + + if partial_update: + # Sychronize parameters before evaluation phase + for p in param: + synchronize(p, sgd) + + # Evaulation phase + autograd.training = False + for b in range(num_test_batch): + x = test_x[b * batch_size:(b + 1) * batch_size] + x = resize_dataset(x, IMG_SIZE) + y = test_y[b * batch_size:(b + 1) * batch_size] + tx.copy_from_numpy(x) + ty.copy_from_numpy(y) + out_test = model(tx) + test_correct += accuracy(tensor.to_numpy(out_test), + to_categorical(y, num_classes)) + + if DIST: + # Reduce the evaulation accuracy from multiple devices + test_correct = reduce_variable(test_correct, sgd, reducer) + + # Output the evaluation accuracy + if ((DIST == False) or (sgd.global_rank == 0)): + print('Evaluation accuracy = %f, Elapsed Time = %fs' % + (test_correct / (num_test_batch * batch_size * world_size), + time.time() - start_time), + flush=True) + + +if __name__ == '__main__': + + DIST = False + train_cifar10(DIST=DIST) diff --git a/examples/cnn_ms/autograd/resnet_dist.py b/examples/cnn_ms/autograd/resnet_dist.py new file mode 100644 index 000000000..6f9b56cee --- /dev/null +++ b/examples/cnn_ms/autograd/resnet_dist.py @@ -0,0 +1,87 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +# the code is modified from +# https://github.com/pytorch/vision/blob/master/torchvision/models/resnet.py + +from singa import autograd +from singa import tensor +from singa import device +from singa import opt + +import numpy as np +from tqdm import trange + +if __name__ == "__main__": + sgd = opt.SGD(lr=0.1, momentum=0.9, weight_decay=1e-5) + sgd = opt.DistOpt(sgd) + + if (sgd.global_rank == 0): + print("Start intialization...........", flush=True) + + dev = device.create_cuda_gpu_on(sgd.local_rank) + + from resnet import resnet50 + model = resnet50() + + niters = 100 + batch_size = 32 + IMG_SIZE = 224 + + tx = tensor.Tensor((batch_size, 3, IMG_SIZE, IMG_SIZE), dev) + ty = tensor.Tensor((batch_size,), dev, tensor.int32) + autograd.training = True + x = np.random.randn(batch_size, 3, IMG_SIZE, IMG_SIZE).astype(np.float32) + y = np.random.randint(0, 1000, batch_size, dtype=np.int32) + tx.copy_from_numpy(x) + ty.copy_from_numpy(y) + + import time + + dev.Sync() + start = time.time() + fd = 0 + softmax = 0 + update = 0 + with trange(niters) as t: + for _ in t: + dev.Sync() + tick = time.time() + x = model(tx) + dev.Sync() + fd += time.time() - tick + tick = time.time() + loss = autograd.softmax_cross_entropy(x, ty) + dev.Sync() + softmax += time.time() - tick + sgd.backward_and_update(loss) + + dev.Sync() + end = time.time() + throughput = float(sgd.world_size * niters * batch_size) / (end - start) + titer = (end - start) / float(niters) + tforward = float(fd) / float(niters) + tsoftmax = float(softmax) / float(niters) + tbackward = titer - tforward - tsoftmax + + if (sgd.global_rank == 0): + print("\nThroughput = {} per second".format(throughput), flush=True) + print("Total={}, forward={}, softmax={}, backward={}".format( + titer, tforward, tsoftmax, tbackward), + flush=True) diff --git a/examples/cnn_ms/autograd/sparsification_mnist.py b/examples/cnn_ms/autograd/sparsification_mnist.py new file mode 100644 index 000000000..315605acd --- /dev/null +++ b/examples/cnn_ms/autograd/sparsification_mnist.py @@ -0,0 +1,45 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +from mnist_cnn import * +import multiprocessing +import sys + +if __name__ == '__main__': + + # Generate a NCCL ID to be used for collective communication + nccl_id = singa.NcclIdHolder() + + # Number of GPUs to be used + world_size = int(sys.argv[1]) + + # Use sparsification with parameters + topK = False # When topK = False, Sparsification based on a constant absolute threshold + corr = True # If True, uses local accumulate gradient for the correction + sparsThreshold = 0.05 # The constant absolute threshold for sparsification + + process = [] + for local_rank in range(0, world_size): + process.append( + multiprocessing.Process(target=train_mnist_cnn, + args=(True, local_rank, world_size, nccl_id, + sparsThreshold, topK, corr))) + + for p in process: + p.start() diff --git a/examples/cnn_ms/data/cifar10.py b/examples/cnn_ms/data/cifar10.py new file mode 100644 index 000000000..74230d0de --- /dev/null +++ b/examples/cnn_ms/data/cifar10.py @@ -0,0 +1,89 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +try: + import pickle +except ImportError: + import cPickle as pickle + +import numpy as np +import os +import sys + + +def load_dataset(filepath): + with open(filepath, 'rb') as fd: + try: + cifar10 = pickle.load(fd, encoding='latin1') + except TypeError: + cifar10 = pickle.load(fd) + image = cifar10['data'].astype(dtype=np.uint8) + image = image.reshape((-1, 3, 32, 32)) + label = np.asarray(cifar10['labels'], dtype=np.uint8) + label = label.reshape(label.size, 1) + return image, label + + +def load_train_data(dir_path='/tmp/cifar-10-batches-py', num_batches=5): # need to save to specific local directories + labels = [] + batchsize = 10000 + images = np.empty((num_batches * batchsize, 3, 32, 32), dtype=np.uint8) + for did in range(1, num_batches + 1): + fname_train_data = dir_path + "/data_batch_{}".format(did) + image, label = load_dataset(check_dataset_exist(fname_train_data)) + images[(did - 1) * batchsize:did * batchsize] = image + labels.extend(label) + images = np.array(images, dtype=np.float32) + labels = np.array(labels, dtype=np.int32) + return images, labels + + +def load_test_data(dir_path='/tmp/cifar-10-batches-py'): # need to save to specific local directories + images, labels = load_dataset(check_dataset_exist(dir_path + "/test_batch")) + return np.array(images, dtype=np.float32), np.array(labels, dtype=np.int32) + + +def check_dataset_exist(dirpath): + if not os.path.exists(dirpath): + print( + 'Please download the cifar10 dataset using python data/download_cifar10.py' + ) + sys.exit(0) + return dirpath + + +def normalize(train_x, val_x): + mean = [0.4914, 0.4822, 0.4465] + std = [0.2023, 0.1994, 0.2010] + train_x /= 255 + val_x /= 255 + for ch in range(0, 2): + train_x[:, ch, :, :] -= mean[ch] + train_x[:, ch, :, :] /= std[ch] + val_x[:, ch, :, :] -= mean[ch] + val_x[:, ch, :, :] /= std[ch] + return train_x, val_x + +def load(): + train_x, train_y = load_train_data() + val_x, val_y = load_test_data() + train_x, val_x = normalize(train_x, val_x) + train_y = train_y.flatten() + val_y = val_y.flatten() + return train_x, train_y, val_x, val_y diff --git a/examples/cnn_ms/data/cifar100.py b/examples/cnn_ms/data/cifar100.py new file mode 100644 index 000000000..b9f121b0a --- /dev/null +++ b/examples/cnn_ms/data/cifar100.py @@ -0,0 +1,81 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +try: + import pickle +except ImportError: + import cPickle as pickle + +import numpy as np +import os +import sys + + +def load_dataset(filepath): + with open(filepath, 'rb') as fd: + try: + cifar100 = pickle.load(fd, encoding='latin1') + except TypeError: + cifar100 = pickle.load(fd) + image = cifar100['data'].astype(dtype=np.uint8) + image = image.reshape((-1, 3, 32, 32)) + label = np.asarray(cifar100['fine_labels'], dtype=np.uint8) + label = label.reshape(label.size, 1) + return image, label + + +def load_train_data(dir_path='/tmp/cifar-100-python'): + images, labels = load_dataset(check_dataset_exist(dir_path + "/train")) + return np.array(images, dtype=np.float32), np.array(labels, dtype=np.int32) + + +def load_test_data(dir_path='/tmp/cifar-100-python'): + images, labels = load_dataset(check_dataset_exist(dir_path + "/test")) + return np.array(images, dtype=np.float32), np.array(labels, dtype=np.int32) + + +def check_dataset_exist(dirpath): + if not os.path.exists(dirpath): + print( + 'Please download the cifar100 dataset using python data/download_cifar100.py' + ) + sys.exit(0) + return dirpath + + +def normalize(train_x, val_x): + mean = [0.4914, 0.4822, 0.4465] + std = [0.2023, 0.1994, 0.2010] + train_x /= 255 + val_x /= 255 + for ch in range(0, 2): + train_x[:, ch, :, :] -= mean[ch] + train_x[:, ch, :, :] /= std[ch] + val_x[:, ch, :, :] -= mean[ch] + val_x[:, ch, :, :] /= std[ch] + return train_x, val_x + + +def load(): + train_x, train_y = load_train_data() + val_x, val_y = load_test_data() + train_x, val_x = normalize(train_x, val_x) + train_y = train_y.flatten() + val_y = val_y.flatten() + return train_x, train_y, val_x, val_y diff --git a/examples/cnn_ms/data/download_cifar10.py b/examples/cnn_ms/data/download_cifar10.py new file mode 100644 index 000000000..3a597be42 --- /dev/null +++ b/examples/cnn_ms/data/download_cifar10.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +from __future__ import print_function +from future import standard_library +standard_library.install_aliases() +import urllib.request, urllib.parse, urllib.error +import tarfile +import os +import sys + + +def extract_tarfile(filepath): + if os.path.exists(filepath): + print('The tar file does exist. Extracting it now..') + with tarfile.open(filepath, 'r') as f: + f.extractall('/tmp/') # need to specify a local directory + print('Finished!') + sys.exit(0) + + +def do_download(dirpath, gzfile, url): + print('Downloading CIFAR from %s' % (url)) + urllib.request.urlretrieve(url, gzfile) + extract_tarfile(gzfile) + print('Finished!') + + +if __name__ == '__main__': + dirpath = '/tmp/' # need to specify a local directory + gzfile = dirpath + 'cifar-10-python.tar.gz' + url = 'http://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz' + do_download(dirpath, gzfile, url) \ No newline at end of file diff --git a/examples/cnn_ms/data/download_cifar100.py b/examples/cnn_ms/data/download_cifar100.py new file mode 100644 index 000000000..5f1e21b78 --- /dev/null +++ b/examples/cnn_ms/data/download_cifar100.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +from download_cifar10 import do_download + +if __name__ == '__main__': + dirpath = '/tmp/' # need to specify a local directory + gzfile = dirpath + 'cifar-100-python.tar.gz' + url = 'http://www.cs.toronto.edu/~kriz/cifar-100-python.tar.gz' + do_download(dirpath, gzfile, url) diff --git a/examples/cnn_ms/data/download_mnist.py b/examples/cnn_ms/data/download_mnist.py new file mode 100644 index 000000000..137461a2d --- /dev/null +++ b/examples/cnn_ms/data/download_mnist.py @@ -0,0 +1,49 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +import os +import urllib.request + + +def check_exist_or_download(url): + + download_dir = '/tmp/' + name = url.rsplit('/', 1)[-1] + filename = os.path.join(download_dir, name) + + if not os.path.isfile(filename): + print("Downloading %s" % url) + urllib.request.urlretrieve(url, filename) + else: + print("Already Downloaded: %s" % url) + + +if __name__ == '__main__': + + #url of the mnist dataset + train_x_url = 'http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz' + train_y_url = 'http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz' + valid_x_url = 'http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz' + valid_y_url = 'http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz' + + #download the mnist dataset + check_exist_or_download(train_x_url) + check_exist_or_download(train_y_url) + check_exist_or_download(valid_x_url) + check_exist_or_download(valid_y_url) \ No newline at end of file diff --git a/examples/cnn_ms/data/mnist.py b/examples/cnn_ms/data/mnist.py new file mode 100644 index 000000000..071d45d20 --- /dev/null +++ b/examples/cnn_ms/data/mnist.py @@ -0,0 +1,92 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +import numpy as np +import os +import sys +import gzip +import codecs + + +def check_dataset_exist(dirpath): + if not os.path.exists(dirpath): + print( + 'The MNIST dataset does not exist. Please download the mnist dataset using python data/download_mnist.py' + ) + sys.exit(0) + return dirpath + + +def load_dataset(): + train_x_path = '/tmp/train-images-idx3-ubyte.gz' # need to change to local disk + train_y_path = '/tmp/train-labels-idx1-ubyte.gz' # need to change to local disk + valid_x_path = '/tmp/t10k-images-idx3-ubyte.gz' # need to change to local disk + valid_y_path = '/tmp/t10k-labels-idx1-ubyte.gz' # need to change to local disk + + train_x = read_image_file(check_dataset_exist(train_x_path)).astype( + np.float32) + train_y = read_label_file(check_dataset_exist(train_y_path)).astype( + np.float32) + valid_x = read_image_file(check_dataset_exist(valid_x_path)).astype( + np.float32) + valid_y = read_label_file(check_dataset_exist(valid_y_path)).astype( + np.float32) + return train_x, train_y, valid_x, valid_y + + +def read_label_file(path): + with gzip.open(path, 'rb') as f: + data = f.read() + assert get_int(data[:4]) == 2049 + length = get_int(data[4:8]) + parsed = np.frombuffer(data, dtype=np.uint8, offset=8).reshape((length)) + return parsed + + +def get_int(b): + return int(codecs.encode(b, 'hex'), 16) + + +def read_image_file(path): + with gzip.open(path, 'rb') as f: + data = f.read() + assert get_int(data[:4]) == 2051 + length = get_int(data[4:8]) + num_rows = get_int(data[8:12]) + num_cols = get_int(data[12:16]) + parsed = np.frombuffer(data, dtype=np.uint8, offset=16).reshape( + (length, 1, num_rows, num_cols)) + return parsed + + +def normalize(train_x, val_x): + train_x /= 255 + val_x /= 255 + return train_x, val_x + + +def load(): + train_x, train_y, val_x, val_y = load_dataset() + train_x, val_x = normalize(train_x, val_x) + train_x = train_x.astype(np.float32) + val_x = val_x.astype(np.float32) + train_y = train_y.astype(np.int32) + val_y = val_y.astype(np.int32) + return train_x, train_y, val_x, val_y + \ No newline at end of file diff --git a/examples/cnn_ms/model/alexnet.py b/examples/cnn_ms/model/alexnet.py new file mode 100644 index 000000000..85209f63f --- /dev/null +++ b/examples/cnn_ms/model/alexnet.py @@ -0,0 +1,118 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +from singa import layer +from singa import model + + +class AlexNet(model.Model): + + def __init__(self, num_classes=10, num_channels=1): + super(AlexNet, self).__init__() + self.num_classes = num_classes + self.input_size = 224 + self.dimension = 4 + self.conv1 = layer.Conv2d(num_channels, 64, 11, stride=4, padding=2) + self.conv2 = layer.Conv2d(64, 192, 5, padding=2) + self.conv3 = layer.Conv2d(192, 384, 3, padding=1) + self.conv4 = layer.Conv2d(384, 256, 3, padding=1) + self.conv5 = layer.Conv2d(256, 256, 3, padding=1) + self.linear1 = layer.Linear(4096) + self.linear2 = layer.Linear(4096) + self.linear3 = layer.Linear(num_classes) + self.pooling1 = layer.MaxPool2d(2, 2, padding=0) + self.pooling2 = layer.MaxPool2d(2, 2, padding=0) + self.pooling3 = layer.MaxPool2d(2, 2, padding=0) + self.avg_pooling1 = layer.AvgPool2d(3, 2, padding=0) + self.relu1 = layer.ReLU() + self.relu2 = layer.ReLU() + self.relu3 = layer.ReLU() + self.relu4 = layer.ReLU() + self.relu5 = layer.ReLU() + self.relu6 = layer.ReLU() + self.relu7 = layer.ReLU() + self.flatten = layer.Flatten() + self.dropout1 = layer.Dropout() + self.dropout2 = layer.Dropout() + self.softmax_cross_entropy = layer.SoftMaxCrossEntropy() + + def forward(self, x): + y = self.conv1(x) + y = self.relu1(y) + y = self.pooling1(y) + y = self.conv2(y) + y = self.relu2(y) + y = self.pooling2(y) + y = self.conv3(y) + y = self.relu3(y) + y = self.conv4(y) + y = self.relu4(y) + y = self.conv5(y) + y = self.relu5(y) + y = self.pooling3(y) + y = self.avg_pooling1(y) + y = self.flatten(y) + y = self.dropout1(y) + y = self.linear1(y) + y = self.relu6(y) + y = self.dropout2(y) + y = self.linear2(y) + y = self.relu7(y) + y = self.linear3(y) + return y + + def train_one_batch(self, x, y, dist_option, spars): + out = self.forward(x) + loss = self.softmax_cross_entropy(out, y) + + if dist_option == 'plain': + self.optimizer(loss) + elif dist_option == 'half': + self.optimizer.backward_and_update_half(loss) + elif dist_option == 'partialUpdate': + self.optimizer.backward_and_partial_update(loss) + elif dist_option == 'sparseTopK': + self.optimizer.backward_and_sparse_update(loss, + topK=True, + spars=spars) + elif dist_option == 'sparseThreshold': + self.optimizer.backward_and_sparse_update(loss, + topK=False, + spars=spars) + return out, loss + + def set_optimizer(self, optimizer): + self.optimizer = optimizer + + +def create_model(pretrained=False, **kwargs): + """Constructs a AlexNet model. + Args: + pretrained (bool): If True, returns a pre-trained model. + + Returns: + The created AlexNet model. + + """ + model = AlexNet(**kwargs) + + return model + + +__all__ = ['AlexNet', 'create_model'] \ No newline at end of file diff --git a/examples/cnn_ms/model/cnn.py b/examples/cnn_ms/model/cnn.py new file mode 100644 index 000000000..b5829d880 --- /dev/null +++ b/examples/cnn_ms/model/cnn.py @@ -0,0 +1,88 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +from singa import layer +from singa import model + + +class CNN(model.Model): + + def __init__(self, num_classes=10, num_channels=1): + super(CNN, self).__init__() + self.num_classes = num_classes + self.input_size = 28 + self.dimension = 4 + self.conv1 = layer.Conv2d(num_channels, 20, 5, padding=0, activation="RELU") + self.conv2 = layer.Conv2d(20, 50, 5, padding=0, activation="RELU") + self.linear1 = layer.Linear(500) + self.linear2 = layer.Linear(num_classes) + self.pooling1 = layer.MaxPool2d(2, 2, padding=0) + self.pooling2 = layer.MaxPool2d(2, 2, padding=0) + self.relu = layer.ReLU() + self.flatten = layer.Flatten() + self.softmax_cross_entropy = layer.SoftMaxCrossEntropy() + + def forward(self, x): + y = self.conv1(x) + y = self.pooling1(y) + y = self.conv2(y) + y = self.pooling2(y) + y = self.flatten(y) + y = self.linear1(y) + y = self.relu(y) + y = self.linear2(y) + return y + + def train_one_batch(self, x, y, dist_option, spars): + out = self.forward(x) + loss = self.softmax_cross_entropy(out, y) + + if dist_option == 'plain': + self.optimizer(loss) + elif dist_option == 'half': + self.optimizer.backward_and_update_half(loss) + elif dist_option == 'partialUpdate': + self.optimizer.backward_and_partial_update(loss) + elif dist_option == 'sparseTopK': + self.optimizer.backward_and_sparse_update(loss, + topK=True, + spars=spars) + elif dist_option == 'sparseThreshold': + self.optimizer.backward_and_sparse_update(loss, + topK=False, + spars=spars) + return out, loss + + def set_optimizer(self, optimizer): + self.optimizer = optimizer + + +def create_model(pretrained=False, **kwargs): + """Constructs a CNN model. + Args: + pretrained (bool): If True, returns a pre-trained model. + Returns: + The created CNN model. + """ + model = CNN(**kwargs) + + return model + + +__all__ = ['CNN', 'create_model'] \ No newline at end of file diff --git a/examples/cnn_ms/model/resnet.py b/examples/cnn_ms/model/resnet.py new file mode 100644 index 000000000..26900c8a5 --- /dev/null +++ b/examples/cnn_ms/model/resnet.py @@ -0,0 +1,291 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +# the code is modified from +# https://github.com/pytorch/vision/blob/master/torchvision/models/resnet.py + +from singa import layer +from singa import model + + +def conv3x3(in_planes, out_planes, stride=1): + """3x3 convolution with padding""" + return layer.Conv2d( + in_planes, + out_planes, + 3, + stride=stride, + padding=1, + bias=False, + ) + + +class BasicBlock(layer.Layer): + expansion = 1 + + def __init__(self, inplanes, planes, stride=1, downsample=None): + super(BasicBlock, self).__init__() + self.conv1 = conv3x3(inplanes, planes, stride) + self.bn1 = layer.BatchNorm2d(planes) + self.conv2 = conv3x3(planes, planes) + self.bn2 = layer.BatchNorm2d(planes) + self.relu1 = layer.ReLU() + self.add = layer.Add() + self.relu2 = layer.ReLU() + self.downsample = downsample + self.stride = stride + + def forward(self, x): + residual = x + + out = self.conv1(x) + out = self.bn1(out) + out = self.relu1(out) + + out = self.conv2(out) + out = self.bn2(out) + + if self.downsample is not None: + residual = self.downsample(x) + + out = self.add(out, residual) + out = self.relu2(out) + + return out + + +class Bottleneck(layer.Layer): + expansion = 4 + + def __init__(self, inplanes, planes, stride=1, downsample=None): + super(Bottleneck, self).__init__() + self.conv1 = layer.Conv2d(inplanes, planes, 1, bias=False) + self.bn1 = layer.BatchNorm2d(planes) + self.relu1 = layer.ReLU() + self.conv2 = layer.Conv2d(planes, + planes, + 3, + stride=stride, + padding=1, + bias=False) + self.bn2 = layer.BatchNorm2d(planes) + self.relu2 = layer.ReLU() + self.conv3 = layer.Conv2d(planes, + planes * self.expansion, + 1, + bias=False) + self.bn3 = layer.BatchNorm2d(planes * self.expansion) + + self.add = layer.Add() + self.relu3 = layer.ReLU() + + self.downsample = downsample + self.stride = stride + + def forward(self, x): + residual = x + + out = self.conv1(x) + out = self.bn1(out) + out = self.relu1(out) + + out = self.conv2(out) + out = self.bn2(out) + out = self.relu2(out) + + out = self.conv3(out) + out = self.bn3(out) + + if self.downsample is not None: + residual = self.downsample(x) + + out = self.add(out, residual) + out = self.relu3(out) + + return out + + +__all__ = [ + 'ResNet', 'resnet18', 'resnet34', 'resnet50', 'resnet101', 'resnet152' +] + + +class ResNet(model.Model): + + def __init__(self, block, layers, num_classes=10, num_channels=3): + self.inplanes = 64 + super(ResNet, self).__init__() + self.num_classes = num_classes + self.input_size = 224 + self.dimension = 4 + self.conv1 = layer.Conv2d(num_channels, + 64, + 7, + stride=2, + padding=3, + bias=False) + self.bn1 = layer.BatchNorm2d(64) + self.relu = layer.ReLU() + self.maxpool = layer.MaxPool2d(kernel_size=3, stride=2, padding=1) + self.layer1, layers1 = self._make_layer(block, 64, layers[0]) + self.layer2, layers2 = self._make_layer(block, 128, layers[1], stride=2) + self.layer3, layers3 = self._make_layer(block, 256, layers[2], stride=2) + self.layer4, layers4 = self._make_layer(block, 512, layers[3], stride=2) + self.avgpool = layer.AvgPool2d(7, stride=1) + self.flatten = layer.Flatten() + self.fc = layer.Linear(num_classes) + self.softmax_cross_entropy = layer.SoftMaxCrossEntropy() + + self.register_layers(*layers1, *layers2, *layers3, *layers4) + + def _make_layer(self, block, planes, blocks, stride=1): + downsample = None + if stride != 1 or self.inplanes != planes * block.expansion: + conv = layer.Conv2d( + self.inplanes, + planes * block.expansion, + 1, + stride=stride, + bias=False, + ) + bn = layer.BatchNorm2d(planes * block.expansion) + + def _downsample(x): + return bn(conv(x)) + + downsample = _downsample + + layers = [] + layers.append(block(self.inplanes, planes, stride, downsample)) + self.inplanes = planes * block.expansion + for i in range(1, blocks): + layers.append(block(self.inplanes, planes)) + + def forward(x): + for layer in layers: + x = layer(x) + return x + + return forward, layers + + def forward(self, x): + x = self.conv1(x) + x = self.bn1(x) + x = self.relu(x) + x = self.maxpool(x) + + x = self.layer1(x) + x = self.layer2(x) + x = self.layer3(x) + x = self.layer4(x) + + x = self.avgpool(x) + x = self.flatten(x) + x = self.fc(x) + + return x + + def train_one_batch(self, x, y, dist_option, spars): + out = self.forward(x) + loss = self.softmax_cross_entropy(out, y) + + if dist_option == 'plain': + self.optimizer(loss) + elif dist_option == 'half': + self.optimizer.backward_and_update_half(loss) + elif dist_option == 'partialUpdate': + self.optimizer.backward_and_partial_update(loss) + elif dist_option == 'sparseTopK': + self.optimizer.backward_and_sparse_update(loss, + topK=True, + spars=spars) + elif dist_option == 'sparseThreshold': + self.optimizer.backward_and_sparse_update(loss, + topK=False, + spars=spars) + return out, loss + + def set_optimizer(self, optimizer): + self.optimizer = optimizer + + +def resnet18(pretrained=False, **kwargs): + """Constructs a ResNet-18 model. + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet. + + Returns: + The created ResNet-18 model. + """ + model = ResNet(BasicBlock, [2, 2, 2, 2], **kwargs) + + return model + + +def resnet34(pretrained=False, **kwargs): + """Constructs a ResNet-34 model. + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet. + Returns: + The created ResNet-34 model. + """ + model = ResNet(BasicBlock, [3, 4, 6, 3], **kwargs) + + return model + + +def resnet50(pretrained=False, **kwargs): + """Constructs a ResNet-50 model. + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet. + Returns: + The created ResNet-50 model. + """ + model = ResNet(Bottleneck, [3, 4, 6, 3], **kwargs) + + return model + + +def resnet101(pretrained=False, **kwargs): + """Constructs a ResNet-101 model. + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet. + Returns: + The created ResNet-101 model. + """ + model = ResNet(Bottleneck, [3, 4, 23, 3], **kwargs) + + return model + + +def resnet152(pretrained=False, **kwargs): + """Constructs a ResNet-152 model. + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet. + Returns: + The created ResNet-152 model. + """ + model = ResNet(Bottleneck, [3, 8, 36, 3], **kwargs) + + return model + + +__all__ = [ + 'ResNet', 'resnet18', 'resnet34', 'resnet50', 'resnet101', 'resnet152' +] \ No newline at end of file diff --git a/examples/cnn_ms/model/xceptionnet.py b/examples/cnn_ms/model/xceptionnet.py new file mode 100644 index 000000000..52e5027c3 --- /dev/null +++ b/examples/cnn_ms/model/xceptionnet.py @@ -0,0 +1,309 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= + +# the code is modified from +# https://github.com/Cadene/pretrained-models.pytorch/blob/master/pretrainedmodels/models/xception.py + +from singa import layer +from singa import model + + +class Block(layer.Layer): + + def __init__(self, + in_filters, + out_filters, + reps, + strides=1, + padding=0, + start_with_relu=True, + grow_first=True): + super(Block, self).__init__() + + if out_filters != in_filters or strides != 1: + self.skip = layer.Conv2d(in_filters, + out_filters, + 1, + stride=strides, + padding=padding, + bias=False) + self.skipbn = layer.BatchNorm2d(out_filters) + else: + self.skip = None + + self.layers = [] + + filters = in_filters + if grow_first: + self.layers.append(layer.ReLU()) + self.layers.append( + layer.SeparableConv2d(in_filters, + out_filters, + 3, + stride=1, + padding=1, + bias=False)) + self.layers.append(layer.BatchNorm2d(out_filters)) + filters = out_filters + + for i in range(reps - 1): + self.layers.append(layer.ReLU()) + self.layers.append( + layer.SeparableConv2d(filters, + filters, + 3, + stride=1, + padding=1, + bias=False)) + self.layers.append(layer.BatchNorm2d(filters)) + + if not grow_first: + self.layers.append(layer.ReLU()) + self.layers.append( + layer.SeparableConv2d(in_filters, + out_filters, + 3, + stride=1, + padding=1, + bias=False)) + self.layers.append(layer.BatchNorm2d(out_filters)) + + if not start_with_relu: + self.layers = self.layers[1:] + else: + self.layers[0] = layer.ReLU() + + if strides != 1: + self.layers.append(layer.MaxPool2d(3, strides, padding + 1)) + + self.register_layers(*self.layers) + + self.add = layer.Add() + + def forward(self, x): + y = self.layers[0](x) + for layer in self.layers[1:]: + if isinstance(y, tuple): + y = y[0] + y = layer(y) + + if self.skip is not None: + skip = self.skip(x) + skip = self.skipbn(skip) + else: + skip = x + y = self.add(y, skip) + return y + + +class Xception(model.Model): + """ + Xception optimized for the ImageNet dataset, as specified in + https://arxiv.org/pdf/1610.02357.pdf + """ + + def __init__(self, num_classes=10, num_channels=3): + """ Constructor + Args: + num_classes: number of classes + """ + super(Xception, self).__init__() + self.num_classes = num_classes + self.input_size = 299 + self.dimension = 4 + + self.conv1 = layer.Conv2d(num_channels, 32, 3, 2, 0, bias=False) + self.bn1 = layer.BatchNorm2d(32) + self.relu1 = layer.ReLU() + + self.conv2 = layer.Conv2d(32, 64, 3, 1, 1, bias=False) + self.bn2 = layer.BatchNorm2d(64) + self.relu2 = layer.ReLU() + # do relu here + + self.block1 = Block(64, + 128, + 2, + 2, + padding=0, + start_with_relu=False, + grow_first=True) + self.block2 = Block(128, + 256, + 2, + 2, + padding=0, + start_with_relu=True, + grow_first=True) + self.block3 = Block(256, + 728, + 2, + 2, + padding=0, + start_with_relu=True, + grow_first=True) + + self.block4 = Block(728, + 728, + 3, + 1, + start_with_relu=True, + grow_first=True) + self.block5 = Block(728, + 728, + 3, + 1, + start_with_relu=True, + grow_first=True) + self.block6 = Block(728, + 728, + 3, + 1, + start_with_relu=True, + grow_first=True) + self.block7 = Block(728, + 728, + 3, + 1, + start_with_relu=True, + grow_first=True) + + self.block8 = Block(728, + 728, + 3, + 1, + start_with_relu=True, + grow_first=True) + self.block9 = Block(728, + 728, + 3, + 1, + start_with_relu=True, + grow_first=True) + self.block10 = Block(728, + 728, + 3, + 1, + start_with_relu=True, + grow_first=True) + self.block11 = Block(728, + 728, + 3, + 1, + start_with_relu=True, + grow_first=True) + + self.block12 = Block(728, + 1024, + 2, + 2, + start_with_relu=True, + grow_first=False) + + self.conv3 = layer.SeparableConv2d(1024, 1536, 3, 1, 1) + self.bn3 = layer.BatchNorm2d(1536) + self.relu3 = layer.ReLU() + + # do relu here + self.conv4 = layer.SeparableConv2d(1536, 2048, 3, 1, 1) + self.bn4 = layer.BatchNorm2d(2048) + + self.relu4 = layer.ReLU() + self.globalpooling = layer.MaxPool2d(10, 1) + self.flatten = layer.Flatten() + self.fc = layer.Linear(num_classes) + + self.softmax_cross_entropy = layer.SoftMaxCrossEntropy() + + def features(self, input): + x = self.conv1(input) + x = self.bn1(x) + x = self.relu1(x) + + x = self.conv2(x) + x = self.bn2(x) + x = self.relu2(x) + + x = self.block1(x) + x = self.block2(x) + x = self.block3(x) + x = self.block4(x) + x = self.block5(x) + x = self.block6(x) + x = self.block7(x) + x = self.block8(x) + x = self.block9(x) + x = self.block10(x) + x = self.block11(x) + x = self.block12(x) + + x = self.conv3(x) + x = self.bn3(x) + x = self.relu3(x) + + x = self.conv4(x) + x = self.bn4(x) + return x + + def logits(self, features): + x = self.relu4(features) + x = self.globalpooling(x) + x = self.flatten(x) + x = self.fc(x) + return x + + def forward(self, x): + x = self.features(x) + x = self.logits(x) + return x + + def train_one_batch(self, x, y, dist_option, spars): + out = self.forward(x) + loss = self.softmax_cross_entropy(out, y) + if dist_option == 'plain': + self.optimizer(loss) + elif dist_option == 'half': + self.optimizer.backward_and_update_half(loss) + elif dist_option == 'partialUpdate': + self.optimizer.backward_and_partial_update(loss) + elif dist_option == 'sparseTopK': + self.optimizer.backward_and_sparse_update(loss, + topK=True, + spars=spars) + elif dist_option == 'sparseThreshold': + self.optimizer.backward_and_sparse_update(loss, + topK=False, + spars=spars) + return out, loss + + def set_optimizer(self, optimizer): + self.optimizer = optimizer + + +def create_model(pretrained=False, **kwargs): + """Constructs a Xceptionnet model. + Args: + pretrained (bool): If True, returns a pre-trained model. + Returns: + The created Xceptionnet model. + """ + model = Xception(**kwargs) + + return model + + +__all__ = ['Xception', 'create_model'] \ No newline at end of file diff --git a/examples/cnn_ms/msmlp/model.py b/examples/cnn_ms/msmlp/model.py new file mode 100644 index 000000000..f6e2a2e72 --- /dev/null +++ b/examples/cnn_ms/msmlp/model.py @@ -0,0 +1,199 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +from singa import layer +from singa import model +from singa import tensor +from singa import opt +from singa import device +from singa.autograd import Operator +from singa.layer import Layer +from singa import singa_wrap as singa +import argparse +import numpy as np + +np_dtype = {"float16": np.float16, "float32": np.float32} + +singa_dtype = {"float16": tensor.float16, "float32": tensor.float32} + +#### self-defined loss begin + +### from autograd.py +class SumError(Operator): + + def __init__(self): + super(SumError, self).__init__() + # self.t = t.data + + def forward(self, x): + # self.err = singa.__sub__(x, self.t) + self.data_x = x + # sqr = singa.Square(self.err) + # loss = singa.SumAll(sqr) + loss = singa.SumAll(x) + # self.n = 1 + # for s in x.shape(): + # self.n *= s + # loss /= self.n + return loss + + def backward(self, dy=1.0): + # dx = self.err + dev = device.get_default_device() + dx = tensor.Tensor(self.data_x.shape, dev, singa_dtype['float32']) + dx.copy_from_numpy(np.ones(self.data_x.shape)) + # dx *= float(2 / self.n) + dx *= dy + return dx + +def se_loss(x): + # assert x.shape == t.shape, "input and target shape different: %s, %s" % ( + # x.shape, t.shape) + return SumError()(x)[0] + +### from layer.py +class SumErrorLayer(Layer): + """ + Generate a MeanSquareError operator + """ + + def __init__(self): + super(SumErrorLayer, self).__init__() + + def forward(self, x): + return se_loss(x) + +#### self-defined loss end + +class MSMLP(model.Model): + + def __init__(self, data_size=10, perceptron_size=100, num_classes=10): + super(MSMLP, self).__init__() + self.num_classes = num_classes + self.dimension = 2 + + self.relu = layer.ReLU() + self.linear1 = layer.Linear(perceptron_size) + self.linear2 = layer.Linear(num_classes) + self.softmax_cross_entropy = layer.SoftMaxCrossEntropy() + + self.sum_error = SumErrorLayer() + + def forward(self, inputs): + y = self.linear1(inputs) + y = self.relu(y) + y = self.linear2(y) + return y + + def train_one_batch(self, x, y, synflow_flag, dist_option, spars): + out = self.forward(x) + loss = self.softmax_cross_entropy(out, y) + + if dist_option == 'plain': + pn_p_g_list = self.optimizer(loss) + elif dist_option == 'half': + self.optimizer.backward_and_update_half(loss) + elif dist_option == 'partialUpdate': + self.optimizer.backward_and_partial_update(loss) + elif dist_option == 'sparseTopK': + self.optimizer.backward_and_sparse_update(loss, + topK=True, + spars=spars) + elif dist_option == 'sparseThreshold': + self.optimizer.backward_and_sparse_update(loss, + topK=False, + spars=spars) + return pn_p_g_list, out, loss + + def set_optimizer(self, optimizer): + self.optimizer = optimizer + + +def create_model(pretrained=False, **kwargs): + """Constructs a CNN model. + Args: + pretrained (bool): If True, returns a pre-trained model. + + Returns: + The created CNN model. + """ + model = MSMLP(**kwargs) + + return model + + +__all__ = ['MLP', 'create_model'] + +if __name__ == "__main__": + np.random.seed(0) + + parser = argparse.ArgumentParser() + parser.add_argument('-p', + choices=['float32', 'float16'], + default='float32', + dest='precision') + parser.add_argument('-g', + '--disable-graph', + default='True', + action='store_false', + help='disable graph', + dest='graph') + parser.add_argument('-m', + '--max-epoch', + default=1001, + type=int, + help='maximum epochs', + dest='max_epoch') + args = parser.parse_args() + + # generate the boundary + f = lambda x: (5 * x + 1) + bd_x = np.linspace(-1.0, 1, 200) + bd_y = f(bd_x) + + # generate the training data + x = np.random.uniform(-1, 1, 400) + y = f(x) + 2 * np.random.randn(len(x)) + + # choose one precision + precision = singa_dtype[args.precision] + np_precision = np_dtype[args.precision] + + # convert training data to 2d space + label = np.asarray([5 * a + 1 > b for (a, b) in zip(x, y)]).astype(np.int32) + data = np.array([[a, b] for (a, b) in zip(x, y)], dtype=np_precision) + + dev = device.create_cuda_gpu_on(0) + sgd = opt.SGD(0.1, 0.9, 1e-5, dtype=singa_dtype[args.precision]) + tx = tensor.Tensor((400, 2), dev, precision) + ty = tensor.Tensor((400,), dev, tensor.int32) + model = MLP(data_size=2, perceptron_size=3, num_classes=2) + + # attach model to graph + model.set_optimizer(sgd) + model.compile([tx], is_train=True, use_graph=args.graph, sequential=True) + model.train() + + for i in range(args.max_epoch): + tx.copy_from_numpy(data) + ty.copy_from_numpy(label) + out, loss = model(tx, ty, 'fp32', spars=None) + + if i % 100 == 0: + print("training loss = ", tensor.to_numpy(loss)[0]) diff --git a/examples/cnn_ms/msmlp/native.py b/examples/cnn_ms/msmlp/native.py new file mode 100644 index 000000000..359d5cd47 --- /dev/null +++ b/examples/cnn_ms/msmlp/native.py @@ -0,0 +1,135 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +from singa import tensor +from singa.tensor import Tensor +from singa import autograd +from singa import opt +import numpy as np +from singa import device +import argparse + +np_dtype = {"float16": np.float16, "float32": np.float32} + +singa_dtype = {"float16": tensor.float16, "float32": tensor.float32} + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument('-p', + choices=['float32', 'float16'], + default='float32', + dest='precision') + parser.add_argument('-m', + '--max-epoch', + default=1001, + type=int, + help='maximum epochs', + dest='max_epoch') + args = parser.parse_args() + + np.random.seed(0) + + autograd.training = True + + # prepare training data in numpy array + + # generate the boundary + f = lambda x: (5 * x + 1) + bd_x = np.linspace(-1.0, 1, 200) + bd_y = f(bd_x) + + # generate the training data + x = np.random.uniform(-1, 1, 400) + y = f(x) + 2 * np.random.randn(len(x)) + + # convert training data to 2d space + label = np.asarray([5 * a + 1 > b for (a, b) in zip(x, y)]) + data = np.array([[a, b] for (a, b) in zip(x, y)], dtype=np.float32) + + def to_categorical(y, num_classes): + """ + Converts a class vector (integers) to binary class matrix. + Args: + y: class vector to be converted into a matrix + (integers from 0 to num_classes). + num_classes: total number of classes. + Returns: + A binary matrix representation of the input. + """ + y = np.array(y, dtype="int") + n = y.shape[0] + categorical = np.zeros((n, num_classes)) + categorical[np.arange(n), y] = 1 + return categorical + + label = to_categorical(label, 2).astype(np.float32) + print("train_data_shape:", data.shape) + print("train_label_shape:", label.shape) + + precision = singa_dtype[args.precision] + np_precision = np_dtype[args.precision] + + dev = device.create_cuda_gpu() + + inputs = Tensor(data=data, device=dev) + target = Tensor(data=label, device=dev) + + inputs = inputs.as_type(precision) + target = target.as_type(tensor.int32) + + w0_np = np.random.normal(0, 0.1, (2, 3)).astype(np_precision) + w0 = Tensor(data=w0_np, + device=dev, + dtype=precision, + requires_grad=True, + stores_grad=True) + b0 = Tensor(shape=(3,), + device=dev, + dtype=precision, + requires_grad=True, + stores_grad=True) + b0.set_value(0.0) + + w1_np = np.random.normal(0, 0.1, (3, 2)).astype(np_precision) + w1 = Tensor(data=w1_np, + device=dev, + dtype=precision, + requires_grad=True, + stores_grad=True) + b1 = Tensor(shape=(2,), + device=dev, + dtype=precision, + requires_grad=True, + stores_grad=True) + b1.set_value(0.0) + + sgd = opt.SGD(0.05, 0.8) + + # training process + for i in range(args.max_epoch): + x = autograd.matmul(inputs, w0) + x = autograd.add_bias(x, b0) + x = autograd.relu(x) + x = autograd.matmul(x, w1) + x = autograd.add_bias(x, b1) + loss = autograd.softmax_cross_entropy(x, target) + sgd(loss) + + if i % 100 == 0: + print("%d, training loss = " % i, tensor.to_numpy(loss)[0]) \ No newline at end of file diff --git a/examples/trans/README.md b/examples/trans/README.md new file mode 100644 index 000000000..43066fab2 --- /dev/null +++ b/examples/trans/README.md @@ -0,0 +1,52 @@ + + +# Machine translation model using Transformer Example +This example trains a Transformer model on a machine translation task. By default, the training script uses the anki dataset, provided. +You can download from http://www.manythings.org/anki/. This example uses the Chinese and English sentence pairs provided by this dataset +to complete the translation task. The dataset contains 29909 sentence pairs in both English and Chinese. + +Data format: English + TAB + Chinese + TAB + Attribution. + +Example: +``` +Hi. 嗨。 CC-BY 2.0 (France) Attribution: tatoeba.org #538123 (CM) & #891077 (Martha) +Hi. 你好。 CC-BY 2.0 (France) Attribution: tatoeba.org #538123 (CM) & #4857568 (musclegirlxyp) +``` + +The train.py script accepts the following arguments: +``` +optional arguments: + [arg] [type] [desc] [default] + --dataset string location of the dataset + --max-epoch int maximum epochs default 100 + --batch_size int batch size default 64 + --shuffle bool shuffle the dataset default True + --lr float learning rate default 0.005 + --seed int random seed default 0 + --d_model int transformer model d_model default 512 + --n_head int transformer model n_head default 8 + --dim_feedforward int transformer model dim_feedforward default 2048 + --n_layers int transformer model n_layers default 6 +``` + +run the example +``` +python train.py --dataset cmn-2000.txt --max-epoch 100 --batch-size 32 --lr 0.01 +``` diff --git a/examples/trans/cmn-eng/cmn-2000.txt b/examples/trans/cmn-eng/cmn-2000.txt new file mode 100644 index 000000000..9ec7af791 --- /dev/null +++ b/examples/trans/cmn-eng/cmn-2000.txt @@ -0,0 +1,2000 @@ +Hi. 嗨。 CC-BY 2.0 (France) Attribution: tatoeba.org #538123 (CM) & #891077 (Martha) +Hi. 你好。 CC-BY 2.0 (France) Attribution: tatoeba.org #538123 (CM) & #4857568 (musclegirlxyp) +Run. 你用跑的。 CC-BY 2.0 (France) Attribution: tatoeba.org #4008918 (JSakuragi) & #3748344 (egg0073) +Stop! 住手! CC-BY 2.0 (France) Attribution: tatoeba.org #448320 (CM) & #448321 (GlossaMatik) +Wait! 等等! CC-BY 2.0 (France) Attribution: tatoeba.org #1744314 (belgavox) & #4970122 (wzhd) +Wait! 等一下! CC-BY 2.0 (France) Attribution: tatoeba.org #1744314 (belgavox) & #5092613 (mirrorvan) +Begin. 开始! CC-BY 2.0 (France) Attribution: tatoeba.org #6102432 (mailohilohi) & #5094852 (Jin_Dehong) +Hello! 你好。 CC-BY 2.0 (France) Attribution: tatoeba.org #373330 (CK) & #4857568 (musclegirlxyp) +I try. 我试试。 CC-BY 2.0 (France) Attribution: tatoeba.org #20776 (CK) & #8870261 (will66) +I won! 我赢了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2005192 (CK) & #5102367 (mirrorvan) +Oh no! 不会吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #1299275 (CK) & #5092475 (mirrorvan) +Cheers! 乾杯! CC-BY 2.0 (France) Attribution: tatoeba.org #487006 (human600) & #765577 (Martha) +Got it? 知道了没有? CC-BY 2.0 (France) Attribution: tatoeba.org #455353 (CM) & #455357 (GlossaMatik) +Got it? 懂了吗? CC-BY 2.0 (France) Attribution: tatoeba.org #455353 (CM) & #2032276 (ydcok) +Got it? 你懂了吗? CC-BY 2.0 (France) Attribution: tatoeba.org #455353 (CM) & #7768205 (jiangche) +He ran. 他跑了。 CC-BY 2.0 (France) Attribution: tatoeba.org #672229 (CK) & #5092389 (mirrorvan) +Hop in. 跳进来。 CC-BY 2.0 (France) Attribution: tatoeba.org #1111548 (Scott) & #5092444 (mirrorvan) +I know. 我知道。 CC-BY 2.0 (France) Attribution: tatoeba.org #319990 (CK) & #3378015 (GlossaMatik) +I quit. 我退出。 CC-BY 2.0 (France) Attribution: tatoeba.org #731636 (Eldad) & #5102253 (mirrorvan) +I quit. 我不干了。 CC-BY 2.0 (France) Attribution: tatoeba.org #731636 (Eldad) & #9569182 (MiracleQ) +I'm OK. 我沒事。 CC-BY 2.0 (France) Attribution: tatoeba.org #433763 (CK) & #819304 (Martha) +I'm up. 我已经起来了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2765357 (arnxy20) & #8727845 (crescat) +Listen. 听着。 CC-BY 2.0 (France) Attribution: tatoeba.org #1913088 (CK) & #5092137 (mirrorvan) +No way! 不可能! CC-BY 2.0 (France) Attribution: tatoeba.org #2175 (CM) & #503298 (fucongcong) +No way! 没门! CC-BY 2.0 (France) Attribution: tatoeba.org #2175 (CM) & #2052721 (sadhen) +Really? 真的? CC-BY 2.0 (France) Attribution: tatoeba.org #373216 (kotobaboke) & #1397360 (mtdot) +Really? 你确定? CC-BY 2.0 (France) Attribution: tatoeba.org #373216 (kotobaboke) & #4208543 (Ethan_lin) +Thanks! 谢谢! CC-BY 2.0 (France) Attribution: tatoeba.org #448645 (CK) & #4878949 (musclegirlxyp) +Try it. 试试吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #4756252 (cairnhead) & #4757237 (ryanwoo) +We try. 我们来试试。 CC-BY 2.0 (France) Attribution: tatoeba.org #247763 (CK) & #5102171 (mirrorvan) +Why me? 为什么是我? CC-BY 2.0 (France) Attribution: tatoeba.org #24958 (CK) & #796834 (fucongcong) +Ask Tom. 去问汤姆。 CC-BY 2.0 (France) Attribution: tatoeba.org #1954263 (CK) & #2017428 (sadhen) +Awesome! 好棒! CC-BY 2.0 (France) Attribution: tatoeba.org #433512 (CK) & #4970070 (wzhd) +Be calm. 冷静点。 CC-BY 2.0 (France) Attribution: tatoeba.org #1916317 (CK) & #5092667 (mirrorvan) +Be fair. 公平点。 CC-BY 2.0 (France) Attribution: tatoeba.org #1916316 (CK) & #5092666 (mirrorvan) +Be kind. 友善点。 CC-BY 2.0 (France) Attribution: tatoeba.org #1916315 (CK) & #5092663 (mirrorvan) +Be kind. 友好點。 CC-BY 2.0 (France) Attribution: tatoeba.org #1916315 (CK) & #5571916 (verdastelo9604) +Be nice. 和气点。 CC-BY 2.0 (France) Attribution: tatoeba.org #1916314 (CK) & #5092659 (mirrorvan) +Be nice. 友善点。 CC-BY 2.0 (France) Attribution: tatoeba.org #1916314 (CK) & #5092663 (mirrorvan) +Call me. 联系我。 CC-BY 2.0 (France) Attribution: tatoeba.org #1553532 (CK) & #5102283 (mirrorvan) +Call us. 联系我们。 CC-BY 2.0 (France) Attribution: tatoeba.org #1916313 (CK) & #5092654 (mirrorvan) +Come in. 进来。 CC-BY 2.0 (France) Attribution: tatoeba.org #348091 (Hertz) & #5102310 (mirrorvan) +Get Tom. 找到汤姆。 CC-BY 2.0 (France) Attribution: tatoeba.org #1972633 (CK) & #5092681 (mirrorvan) +Get out! 滾出去! CC-BY 2.0 (France) Attribution: tatoeba.org #266790 (CK) & #819288 (Martha) +Get out! 出去! CC-BY 2.0 (France) Attribution: tatoeba.org #266790 (CK) & #7768017 (jiangche) +Go away! 走開! CC-BY 2.0 (France) Attribution: tatoeba.org #433518 (CK) & #819289 (Martha) +Go away! 滾! CC-BY 2.0 (France) Attribution: tatoeba.org #433518 (CK) & #884704 (Tajfun) +Go away. 走開! CC-BY 2.0 (France) Attribution: tatoeba.org #433491 (CK) & #819289 (Martha) +Go home. 回家。 CC-BY 2.0 (France) Attribution: tatoeba.org #2230769 (CK) & #3212768 (GlossaMatik) +Go home. 回家吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #2230769 (CK) & #5102214 (mirrorvan) +Goodbye! 再见! CC-BY 2.0 (France) Attribution: tatoeba.org #516745 (minshirui) & #336477 (fucongcong) +Goodbye! 告辞! CC-BY 2.0 (France) Attribution: tatoeba.org #516745 (minshirui) & #4887737 (musclegirlxyp) +Hang on! 坚持。 CC-BY 2.0 (France) Attribution: tatoeba.org #1894404 (Spamster) & #5092492 (mirrorvan) +Hang on! 等一下! CC-BY 2.0 (France) Attribution: tatoeba.org #1894404 (Spamster) & #5092613 (mirrorvan) +Hang on. 坚持。 CC-BY 2.0 (France) Attribution: tatoeba.org #1972640 (CK) & #5092492 (mirrorvan) +He came. 他来了。 CC-BY 2.0 (France) Attribution: tatoeba.org #853153 (piksea) & #437438 (fucongcong) +He runs. 他跑。 CC-BY 2.0 (France) Attribution: tatoeba.org #672254 (CK) & #5092396 (mirrorvan) +Help me. 帮我一下。 CC-BY 2.0 (France) Attribution: tatoeba.org #266065 (Zifre) & #332800 (fucongcong) +Help us. 帮帮我们吧! CC-BY 2.0 (France) Attribution: tatoeba.org #2187193 (CK) & #7771852 (jiangche) +Hit Tom. 去打汤姆。 CC-BY 2.0 (France) Attribution: tatoeba.org #2203859 (CK) & #8696225 (crescat) +Hold on. 坚持。 CC-BY 2.0 (France) Attribution: tatoeba.org #1357000 (sacredceltic) & #5092492 (mirrorvan) +Hug Tom. 抱抱汤姆! CC-BY 2.0 (France) Attribution: tatoeba.org #2203860 (CK) & #4759957 (ryanwoo) +Hug Tom. 请抱紧汤姆。 CC-BY 2.0 (France) Attribution: tatoeba.org #2203860 (CK) & #5096784 (mirrorvan) +I agree. 我同意。 CC-BY 2.0 (France) Attribution: tatoeba.org #436281 (lukaszpp) & #333224 (fucongcong) +I'm hot. 我觉得很热。 CC-BY 2.0 (France) Attribution: tatoeba.org #455953 (lukaszpp) & #489080 (GlossaMatik) +I'm ill. 我生病了。 CC-BY 2.0 (France) Attribution: tatoeba.org #448236 (CK) & #780291 (Martha) +I'm sad. 我很难过。 CC-BY 2.0 (France) Attribution: tatoeba.org #317741 (CK) & #333736 (fucongcong) +I'm shy. 我很害羞。 CC-BY 2.0 (France) Attribution: tatoeba.org #2203346 (CK) & #6535146 (xjjAstrus) +I'm wet. 我濕了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1780075 (Spamster) & #8388737 (wangchou) +It's OK. 没关系。 CC-BY 2.0 (France) Attribution: tatoeba.org #413756 (CK) & #333730 (fucongcong) +It's me. 是我。 CC-BY 2.0 (France) Attribution: tatoeba.org #42400 (sysko) & #335161 (fucongcong) +Join us. 来加入我们吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #1745546 (belgavox) & #5092554 (mirrorvan) +Keep it. 留着吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #1913087 (CK) & #5092637 (mirrorvan) +Kiss me. 吻我。 CC-BY 2.0 (France) Attribution: tatoeba.org #565931 (Fish) & #5092385 (mirrorvan) +Perfect! 完美! CC-BY 2.0 (France) Attribution: tatoeba.org #374568 (blay_paul) & #5092133 (mirrorvan) +See you. 再见! CC-BY 2.0 (France) Attribution: tatoeba.org #1151432 (Roggy) & #336477 (fucongcong) +Shut up! 閉嘴! CC-BY 2.0 (France) Attribution: tatoeba.org #462430 (lukaszpp) & #3718928 (egg0073) +Skip it. 不管它。 CC-BY 2.0 (France) Attribution: tatoeba.org #1953076 (ozzie) & #5102320 (mirrorvan) +Take it. 拿走吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #1913089 (CK) & #5092645 (mirrorvan) +Tell me. 告诉我! CC-BY 2.0 (France) Attribution: tatoeba.org #1913090 (CK) & #9965594 (GlossaMatik) +Tom won. 汤姆胜利了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2005191 (CK) & #4956754 (musclegirlxyp) +Wake up! 醒醒! CC-BY 2.0 (France) Attribution: tatoeba.org #323780 (CK) & #5102191 (mirrorvan) +Wash up. 去清洗一下。 CC-BY 2.0 (France) Attribution: tatoeba.org #20763 (CK) & #5092178 (mirrorvan) +We know. 我们知道。 CC-BY 2.0 (France) Attribution: tatoeba.org #1556167 (shanghainese) & #5102291 (mirrorvan) +Welcome. 欢迎。 CC-BY 2.0 (France) Attribution: tatoeba.org #138919 (CM) & #343770 (fucongcong) +Who won? 谁赢了? CC-BY 2.0 (France) Attribution: tatoeba.org #2005190 (CK) & #5102365 (mirrorvan) +Why not? 为什么不? CC-BY 2.0 (France) Attribution: tatoeba.org #30545 (CK) & #796839 (fucongcong) +You run. 你跑。 CC-BY 2.0 (France) Attribution: tatoeba.org #672252 (CK) & #5092393 (mirrorvan) +You win. 算你狠。 CC-BY 2.0 (France) Attribution: tatoeba.org #8645635 (hamsolo474) & #2485289 (fenfang557) +Back off! 往后退点。 CC-BY 2.0 (France) Attribution: tatoeba.org #1954264 (CK) & #5102285 (mirrorvan) +Back off! 后退! CC-BY 2.0 (France) Attribution: tatoeba.org #1954264 (CK) & #10981524 (Elaineeeeee) +Back off. 往后退点。 CC-BY 2.0 (France) Attribution: tatoeba.org #1553533 (CK) & #5102285 (mirrorvan) +Be still. 静静的,别动。 CC-BY 2.0 (France) Attribution: tatoeba.org #1954265 (CK) & #5102329 (mirrorvan) +Beats me. 我一无所知。 CC-BY 2.0 (France) Attribution: tatoeba.org #320001 (blay_paul) & #7772071 (jiangche) +Cuff him. 把他铐上。 CC-BY 2.0 (France) Attribution: tatoeba.org #1954267 (CK) & #5102333 (mirrorvan) +Drive on. 往前开。 CC-BY 2.0 (France) Attribution: tatoeba.org #1954268 (CK) & #5102335 (mirrorvan) +Get away! 走開! CC-BY 2.0 (France) Attribution: tatoeba.org #240634 (CM) & #819289 (Martha) +Get away! 滾! CC-BY 2.0 (France) Attribution: tatoeba.org #240634 (CM) & #884704 (Tajfun) +Get down! 趴下! CC-BY 2.0 (France) Attribution: tatoeba.org #268087 (CM) & #5102178 (mirrorvan) +Get lost! 滾! CC-BY 2.0 (France) Attribution: tatoeba.org #623565 (Dorenda) & #884704 (Tajfun) +Get lost! 滚。 CC-BY 2.0 (France) Attribution: tatoeba.org #623565 (Dorenda) & #8696338 (crescat) +Get lost. 滚。 CC-BY 2.0 (France) Attribution: tatoeba.org #854500 (CK) & #8696338 (crescat) +Get real. 醒醒吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #1324400 (Scott) & #5092481 (mirrorvan) +Good job! 做得好! CC-BY 2.0 (France) Attribution: tatoeba.org #1021038 (Quazel) & #4261676 (egg0073) +Good job! 干的好! CC-BY 2.0 (France) Attribution: tatoeba.org #1021038 (Quazel) & #7767580 (jiangche) +Grab Tom. 抓住汤姆。 CC-BY 2.0 (France) Attribution: tatoeba.org #1972639 (CK) & #5092688 (mirrorvan) +Grab him. 抓住他。 CC-BY 2.0 (France) Attribution: tatoeba.org #285184 (CK) & #5092265 (mirrorvan) +Have fun. 玩得開心。 CC-BY 2.0 (France) Attribution: tatoeba.org #21267 (CK) & #819292 (Martha) +He tries. 他来试试。 CC-BY 2.0 (France) Attribution: tatoeba.org #288166 (CM) & #5092267 (mirrorvan) +How cute! 多可爱啊! CC-BY 2.0 (France) Attribution: tatoeba.org #36097 (CM) & #5092632 (mirrorvan) +Humor me. 你就随了我的意吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #1954271 (CM) & #5102344 (mirrorvan) +Hurry up. 趕快! CC-BY 2.0 (France) Attribution: tatoeba.org #1329 (brauliobezerra) & #46 (fucongcong) +Hurry up. 快点! CC-BY 2.0 (France) Attribution: tatoeba.org #1329 (brauliobezerra) & #512039 (fucongcong) +Hurry up. 快点。 CC-BY 2.0 (France) Attribution: tatoeba.org #1329 (brauliobezerra) & #5092239 (mirrorvan) +I did it. 我做到了! CC-BY 2.0 (France) Attribution: tatoeba.org #2549832 (CK) & #8709238 (crescat) +I forgot. 我忘了。 CC-BY 2.0 (France) Attribution: tatoeba.org #436603 (lukaszpp) & #335875 (fucongcong) +I resign. 我放弃。 CC-BY 2.0 (France) Attribution: tatoeba.org #731590 (Eldad) & #5102250 (mirrorvan) +I'll pay. 我來付錢。 CC-BY 2.0 (France) Attribution: tatoeba.org #411285 (CK) & #819298 (Martha) +I'm back. 我回来了! CC-BY 2.0 (France) Attribution: tatoeba.org #564159 (darinmex) & #10153684 (GlossaMatik) +I'm busy. 我很忙。 CC-BY 2.0 (France) Attribution: tatoeba.org #261721 (CK) & #819333 (Martha) +I'm cold. 我冷。 CC-BY 2.0 (France) Attribution: tatoeba.org #455947 (lukaszpp) & #471387 (fucongcong) +I'm cool. 我很酷。 CC-BY 2.0 (France) Attribution: tatoeba.org #2202692 (CK) & #8933590 (crescat) +I'm fine. 我很好。 CC-BY 2.0 (France) Attribution: tatoeba.org #257272 (Eldad) & #794004 (fucongcong) +I'm free! 我自由了! CC-BY 2.0 (France) Attribution: tatoeba.org #1888443 (Spamster) & #9956709 (GlossaMatik) +I'm full. 我吃飽了。 CC-BY 2.0 (France) Attribution: tatoeba.org #433863 (CK) & #819300 (Martha) +I'm home. 我在家裡。 CC-BY 2.0 (France) Attribution: tatoeba.org #2111725 (CK) & #919764 (Martha) +I'm lost. 我迷失了。 CC-BY 2.0 (France) Attribution: tatoeba.org #455833 (lukaszpp) & #5092558 (mirrorvan) +I'm sick. 我生病了。 CC-BY 2.0 (France) Attribution: tatoeba.org #780304 (vgigregg) & #780291 (Martha) +I'm sick. 我病了。 CC-BY 2.0 (France) Attribution: tatoeba.org #780304 (vgigregg) & #2757252 (cienias) +I'm tall. 我个子高。 CC-BY 2.0 (France) Attribution: tatoeba.org #2764439 (CK) & #7772132 (jiangche) +Leave me. 让我一个人呆会儿。 CC-BY 2.0 (France) Attribution: tatoeba.org #1954273 (CK) & #5102345 (mirrorvan) +Let's go! 走吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #241077 (CK) & #334277 (fucongcong) +Let's go! 我們開始吧! CC-BY 2.0 (France) Attribution: tatoeba.org #241077 (CK) & #819358 (Martha) +Let's go! 我們走吧! CC-BY 2.0 (France) Attribution: tatoeba.org #241077 (CK) & #819359 (Martha) +Look out! 当心! CC-BY 2.0 (France) Attribution: tatoeba.org #20719 (CK) & #5092162 (mirrorvan) +Say what? 啥? CC-BY 2.0 (France) Attribution: tatoeba.org #8453907 (shekitten) & #8463674 (gumblex) +She runs. 她跑。 CC-BY 2.0 (France) Attribution: tatoeba.org #672264 (CM) & #765935 (Martha) +Sit down. 请坐。 CC-BY 2.0 (France) Attribution: tatoeba.org #1553397 (CK) & #5780574 (verdastelo9604) +Stand up. 起立。 CC-BY 2.0 (France) Attribution: tatoeba.org #1573801 (donkirkby) & #1746081 (sadhen) +Terrific! 很棒! CC-BY 2.0 (France) Attribution: tatoeba.org #52022 (Zifre) & #5092136 (mirrorvan) +They won. 他们赢了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1618734 (CK) & #5092506 (mirrorvan) +Tom died. 汤姆去世了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2005188 (CK) & #5102363 (mirrorvan) +Tom lied. 汤姆说谎了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2005179 (CK) & #5100135 (mirrorvan) +Tom lost. 汤姆输了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2005180 (CK) & #5094682 (musclegirlxyp) +Tom quit. 汤姆不干了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2005183 (CK) & #5102347 (mirrorvan) +Tom swam. 汤姆游泳了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2203845 (CK) & #4977423 (musclegirlxyp) +Tom swam. Tom游泳。 CC-BY 2.0 (France) Attribution: tatoeba.org #2203845 (CK) & #5529807 (egg0073) +Trust me. 相信我。 CC-BY 2.0 (France) Attribution: tatoeba.org #954991 (CM) & #5092404 (mirrorvan) +Try hard. 努力。 CC-BY 2.0 (France) Attribution: tatoeba.org #271901 (Zifre) & #5102184 (mirrorvan) +Try some. 试试吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #1916312 (CK) & #4757237 (ryanwoo) +Try this. 试试这个。 CC-BY 2.0 (France) Attribution: tatoeba.org #1916311 (CK) & #8715853 (crescat) +Use this. 请用这个。 CC-BY 2.0 (France) Attribution: tatoeba.org #1954278 (CK) & #9490109 (jin1) +Who died? 谁死了? CC-BY 2.0 (France) Attribution: tatoeba.org #2005187 (CK) & #5102361 (mirrorvan) +Am I dead? 我死了吗? CC-BY 2.0 (France) Attribution: tatoeba.org #7921513 (maaster) & #9958169 (GlossaMatik) +Answer me. 回答我。 CC-BY 2.0 (France) Attribution: tatoeba.org #251060 (Eldad) & #784532 (fucongcong) +Birds fly. 鳥類飛行。 CC-BY 2.0 (France) Attribution: tatoeba.org #278213 (CK) & #819282 (Martha) +Call home! 打电话回家! CC-BY 2.0 (France) Attribution: tatoeba.org #1730009 (CK) & #5092540 (mirrorvan) +Calm down. 冷静点。 CC-BY 2.0 (France) Attribution: tatoeba.org #435575 (CK) & #5092667 (mirrorvan) +Catch him. 抓住他。 CC-BY 2.0 (France) Attribution: tatoeba.org #449029 (CK) & #5092265 (mirrorvan) +Come home. 回家吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #413767 (Scott) & #5102214 (mirrorvan) +Cool down. 冷静点。 CC-BY 2.0 (France) Attribution: tatoeba.org #1860739 (CK) & #5092667 (mirrorvan) +Do it now. 現在就做。 CC-BY 2.0 (France) Attribution: tatoeba.org #435763 (CK) & #771521 (Martha) +Dogs bark. 狗会叫。 CC-BY 2.0 (France) Attribution: tatoeba.org #1357070 (sacredceltic) & #5092504 (mirrorvan) +Don't cry. 别哭。 CC-BY 2.0 (France) Attribution: tatoeba.org #953247 (CK) & #4265201 (notabene) +Excuse me. 对不起。 CC-BY 2.0 (France) Attribution: tatoeba.org #433504 (CK) & #472304 (fucongcong) +Fantastic! 好棒! CC-BY 2.0 (France) Attribution: tatoeba.org #433511 (CK) & #4970070 (wzhd) +Fantastic! 很棒! CC-BY 2.0 (France) Attribution: tatoeba.org #433511 (CK) & #5092136 (mirrorvan) +Feel this. 来感受一下这个。 CC-BY 2.0 (France) Attribution: tatoeba.org #1972624 (CK) & #5092677 (mirrorvan) +Follow me. 请跟我来。 CC-BY 2.0 (France) Attribution: tatoeba.org #250135 (CK) & #466246 (fucongcong) +Follow me. 跟我走。 CC-BY 2.0 (France) Attribution: tatoeba.org #250135 (CK) & #10699375 (GlossaMatik) +Follow us. 请跟着我们。 CC-BY 2.0 (France) Attribution: tatoeba.org #1972627 (CK) & #5092678 (mirrorvan) +Forget it. 算了。 CC-BY 2.0 (France) Attribution: tatoeba.org #20398 (Eldad) & #400312 (GlossaMatik) +Good luck. 祝你好运。 CC-BY 2.0 (France) Attribution: tatoeba.org #239431 (sacredceltic) & #812490 (fucongcong) +Goodnight. 晚安。 CC-BY 2.0 (France) Attribution: tatoeba.org #7822164 (sharris123) & #4463431 (maple) +Grab that. 抓住那个。 CC-BY 2.0 (France) Attribution: tatoeba.org #1972635 (CK) & #5092684 (mirrorvan) +Grab this. 抓住这个。 CC-BY 2.0 (France) Attribution: tatoeba.org #1972637 (CK) & #5092685 (mirrorvan) +Hands off. 别碰! CC-BY 2.0 (France) Attribution: tatoeba.org #268620 (CM) & #8870260 (will66) +He's a DJ. 他是一个 DJ 。 CC-BY 2.0 (France) Attribution: tatoeba.org #1383444 (CK) & #1878329 (sadhen) +He's busy. 他很忙。 CC-BY 2.0 (France) Attribution: tatoeba.org #2535641 (CM) & #343715 (fucongcong) +He's lazy. 他很懒。 CC-BY 2.0 (France) Attribution: tatoeba.org #2030108 (Spamster) & #343917 (fucongcong) +Hold fire. 停火。 CC-BY 2.0 (France) Attribution: tatoeba.org #1972642 (CK) & #5092693 (mirrorvan) +How awful! 太可怕了。 CC-BY 2.0 (France) Attribution: tatoeba.org #72077 (CM) & #5102161 (mirrorvan) +How weird! 真奇怪。 CC-BY 2.0 (France) Attribution: tatoeba.org #4462562 (CK) & #1705791 (sadhen) +How weird! 多怪啊! CC-BY 2.0 (France) Attribution: tatoeba.org #4462562 (CK) & #5092629 (mirrorvan) +I am cold. 我冷。 CC-BY 2.0 (France) Attribution: tatoeba.org #436325 (lukaszpp) & #471387 (fucongcong) +I am full. 我吃飽了。 CC-BY 2.0 (France) Attribution: tatoeba.org #620122 (ulyssemc1) & #819300 (Martha) +I am okay. 我沒事。 CC-BY 2.0 (France) Attribution: tatoeba.org #376402 (saeb) & #819304 (Martha) +I am sick. 我生病了。 CC-BY 2.0 (France) Attribution: tatoeba.org #436427 (lukaszpp) & #780291 (Martha) +I am tall. 我个子高。 CC-BY 2.0 (France) Attribution: tatoeba.org #436275 (lukaszpp) & #7772132 (jiangche) +I clapped. 我拍手。 CC-BY 2.0 (France) Attribution: tatoeba.org #6196262 (CK) & #920090 (Martha) +I get you. 我了解你。 CC-BY 2.0 (France) Attribution: tatoeba.org #904789 (Trailsend) & #904787 (kanaorange) +I give up. 我放弃。 CC-BY 2.0 (France) Attribution: tatoeba.org #241200 (CK) & #5102250 (mirrorvan) +I hope so. 我希望如此。 CC-BY 2.0 (France) Attribution: tatoeba.org #51142 (CK) & #333103 (fucongcong) +I laughed. 我笑了。 CC-BY 2.0 (France) Attribution: tatoeba.org #258713 (CK) & #335165 (fucongcong) +I promise. 我向你保证。 CC-BY 2.0 (France) Attribution: tatoeba.org #2111800 (CK) & #502727 (fucongcong) +I saw Tom. 我看見湯姆了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2244569 (CK) & #6623201 (verdastelo9604) +I was shy. 我害羞。 CC-BY 2.0 (France) Attribution: tatoeba.org #4695537 (Hybrid) & #8215726 (verdastelo9604) +I'll swim. 我要游泳。 CC-BY 2.0 (France) Attribution: tatoeba.org #5576197 (CK) & #6994070 (verdastelo9604) +I'm a man. 我是个男人。 CC-BY 2.0 (France) Attribution: tatoeba.org #580774 (CM) & #333655 (fucongcong) +I'm bored. 我覺得很無聊。 CC-BY 2.0 (France) Attribution: tatoeba.org #431539 (Clavain) & #3668663 (egg0073) +I'm first. 我是第一。 CC-BY 2.0 (France) Attribution: tatoeba.org #2202863 (CK) & #8686688 (crescat) +I'm lucky. 我运气很好。 CC-BY 2.0 (France) Attribution: tatoeba.org #2111713 (CK) & #437296 (fucongcong) +I'm right. 我是對的。 CC-BY 2.0 (France) Attribution: tatoeba.org #321343 (CK) & #816721 (Martha) +I'm sober. 我很清醒。 CC-BY 2.0 (France) Attribution: tatoeba.org #2361904 (CK) & #9961281 (GlossaMatik) +I'm sorry. 对不起。 CC-BY 2.0 (France) Attribution: tatoeba.org #38387 (CK) & #472304 (fucongcong) +I'm sorry. 我很抱歉。 CC-BY 2.0 (France) Attribution: tatoeba.org #38387 (CK) & #824688 (Martha) +I'm tired. 我很累。 CC-BY 2.0 (France) Attribution: tatoeba.org #1705 (brauliobezerra) & #397734 (GlossaMatik) +I'm young. 我還年輕。 CC-BY 2.0 (France) Attribution: tatoeba.org #321850 (CK) & #832459 (Martha) +Ignore it. 不放在眼裡。 CC-BY 2.0 (France) Attribution: tatoeba.org #2649249 (CK) & #5396469 (xjjAstrus) +Is it far? 遠嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #1308427 (CK) & #6559044 (xjjAstrus) +Is it you? 是你吗? CC-BY 2.0 (France) Attribution: tatoeba.org #1259560 (Scott) & #10696048 (GlossaMatik) +It rained. 下了雨。 CC-BY 2.0 (France) Attribution: tatoeba.org #1435651 (mattpbooth) & #2481833 (alvations) +It snowed. 下雪了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1181168 (Eldad) & #780269 (Martha) +It's 3:30. 3点半了。 CC-BY 2.0 (France) Attribution: tatoeba.org #456175 (lukaszpp) & #795758 (fucongcong) +It's 7:45. 现在是七点四十五分。 CC-BY 2.0 (France) Attribution: tatoeba.org #2762784 (CK) & #2041218 (Venki) +It's 7:45. 现在是7点45分。 CC-BY 2.0 (France) Attribution: tatoeba.org #2762784 (CK) & #2041220 (Venki) +It's cold. 天很冷。 CC-BY 2.0 (France) Attribution: tatoeba.org #1813 (CK) & #334647 (fucongcong) +It's food. 它是食物。 CC-BY 2.0 (France) Attribution: tatoeba.org #2187210 (CK) & #4887700 (musclegirlxyp) +It's free. 它是免費的。 CC-BY 2.0 (France) Attribution: tatoeba.org #435782 (CK) & #825127 (Martha) +It's late. 很晚了。 CC-BY 2.0 (France) Attribution: tatoeba.org #31195 (CK) & #745892 (fucongcong) +It's true. 這是真的。 CC-BY 2.0 (France) Attribution: tatoeba.org #54868 (CK) & #771357 (Martha) +Keep them. 留着吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #2111633 (CK) & #5092637 (mirrorvan) +Kill them. 殺了他們 CC-BY 2.0 (France) Attribution: tatoeba.org #6049439 (mailohilohi) & #6049579 (magicalrpetz47) +Let me in. 让我进去。 CC-BY 2.0 (France) Attribution: tatoeba.org #277466 (CK) & #333350 (fucongcong) +Lie still. 躺着不动。 CC-BY 2.0 (France) Attribution: tatoeba.org #1839430 (CK) & #5092579 (mirrorvan) +Look back! 回头看! CC-BY 2.0 (France) Attribution: tatoeba.org #240166 (CK) & #5102163 (mirrorvan) +Move over. 腾一下地方。 CC-BY 2.0 (France) Attribution: tatoeba.org #1553407 (CK) & #5102267 (mirrorvan) +Of course! 當然! CC-BY 2.0 (France) Attribution: tatoeba.org #433730 (CK) & #771439 (Martha) +Of course! 当然哪! CC-BY 2.0 (France) Attribution: tatoeba.org #433730 (CK) & #11698263 (Jokubas) +Of course. 当然是的。 CC-BY 2.0 (France) Attribution: tatoeba.org #433492 (CK) & #421347 (GlossaMatik) +Of course. 當然。 CC-BY 2.0 (France) Attribution: tatoeba.org #433492 (CK) & #825987 (Martha) +Of course. 当然了。 CC-BY 2.0 (France) Attribution: tatoeba.org #433492 (CK) & #4970077 (wzhd) +Open fire! 开火! CC-BY 2.0 (France) Attribution: tatoeba.org #1108002 (Scott) & #5092433 (mirrorvan) +Read this. 念这个。 CC-BY 2.0 (France) Attribution: tatoeba.org #1098659 (cntrational) & #5092431 (mirrorvan) +See above. 参见上文。 CC-BY 2.0 (France) Attribution: tatoeba.org #273621 (CM) & #333511 (fucongcong) +Seriously? 真的? CC-BY 2.0 (France) Attribution: tatoeba.org #1327057 (bmaynard87) & #1397360 (mtdot) +Seriously? 认真的? CC-BY 2.0 (France) Attribution: tatoeba.org #1327057 (bmaynard87) & #10983988 (Elaineeeeee) +She cried. 她哭了。 CC-BY 2.0 (France) Attribution: tatoeba.org #313193 (CK) & #5092280 (mirrorvan) +She tried. 她试过了。 CC-BY 2.0 (France) Attribution: tatoeba.org #309976 (CK) & #5092274 (mirrorvan) +She walks. 她在行走。 CC-BY 2.0 (France) Attribution: tatoeba.org #316925 (CK) & #5092290 (mirrorvan) +Sit tight. 耐心等着。 CC-BY 2.0 (France) Attribution: tatoeba.org #40196 (CM) & #5092221 (mirrorvan) +Slow down. 慢一點。 CC-BY 2.0 (France) Attribution: tatoeba.org #2187252 (CK) & #4754645 (egg0073) +Stay calm. 保持冷靜。 CC-BY 2.0 (France) Attribution: tatoeba.org #788304 (hrin) & #778870 (Martha) +Stay down! 趴着! CC-BY 2.0 (France) Attribution: tatoeba.org #1777435 (Spamster) & #5092568 (mirrorvan) +Stop that! 住手。 CC-BY 2.0 (France) Attribution: tatoeba.org #651592 (orbpic) & #5092387 (mirrorvan) +Take care! 照顾好自己。 CC-BY 2.0 (France) Attribution: tatoeba.org #324861 (CK) & #510765 (fucongcong) +Take care. 照顾好自己。 CC-BY 2.0 (France) Attribution: tatoeba.org #20362 (sacredceltic) & #510765 (fucongcong) +Take care. 保重。 CC-BY 2.0 (France) Attribution: tatoeba.org #20362 (sacredceltic) & #1762971 (sadhen) +Take mine. 拿我的。 CC-BY 2.0 (France) Attribution: tatoeba.org #2111483 (CK) & #9958257 (GlossaMatik) +Thank you. 谢谢。 CC-BY 2.0 (France) Attribution: tatoeba.org #1876041 (Asma) & #5094881 (musclegirlxyp) +Then what? 那又怎樣? CC-BY 2.0 (France) Attribution: tatoeba.org #53035 (CM) & #51 (fucongcong) +They left. 他们离开了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2111368 (CK) & #8696255 (crescat) +Time's up. 时间到了。 CC-BY 2.0 (France) Attribution: tatoeba.org #6611926 (Eccles17) & #5094825 (Jin_Dehong) +Tom slept. 汤姆睡了。 CC-BY 2.0 (France) Attribution: tatoeba.org #6645778 (CK) & #7768193 (jiangche) +Tom swims. Tom游泳。 CC-BY 2.0 (France) Attribution: tatoeba.org #5190879 (CK) & #5529807 (egg0073) +Tom waved. 汤姆挥手了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2005185 (CK) & #5102356 (mirrorvan) +Tom'll go. 湯姆要走。 CC-BY 2.0 (France) Attribution: tatoeba.org #2123528 (CK) & #6939445 (verdastelo9604) +Try again. 再試一次。 CC-BY 2.0 (France) Attribution: tatoeba.org #31723 (CK) & #824621 (Martha) +Try again. 再试一下。 CC-BY 2.0 (France) Attribution: tatoeba.org #31723 (CK) & #8496264 (maxine) +Turn left. 向左转。 CC-BY 2.0 (France) Attribution: tatoeba.org #464284 (lukaszpp) & #465034 (fucongcong) +Wait here. 在这等着。 CC-BY 2.0 (France) Attribution: tatoeba.org #1841188 (CK) & #5102308 (mirrorvan) +Watch out! 当心! CC-BY 2.0 (France) Attribution: tatoeba.org #375828 (megamanenm) & #5092162 (mirrorvan) +Well done! 做得好! CC-BY 2.0 (France) Attribution: tatoeba.org #464478 (lukaszpp) & #4261676 (egg0073) +Well done! 干的好! CC-BY 2.0 (France) Attribution: tatoeba.org #464478 (lukaszpp) & #7767580 (jiangche) +Who cares? 爱谁谁。 CC-BY 2.0 (France) Attribution: tatoeba.org #40434 (CK) & #5092226 (mirrorvan) +Who knows? 谁知道? CC-BY 2.0 (France) Attribution: tatoeba.org #276369 (CK) & #395531 (GlossaMatik) +Who's Tom? 汤姆是谁? CC-BY 2.0 (France) Attribution: tatoeba.org #1886548 (CK) & #4956713 (musclegirlxyp) +Who's she? 她是谁? CC-BY 2.0 (France) Attribution: tatoeba.org #2203797 (CK) & #4887707 (musclegirlxyp) +Wonderful! 很棒! CC-BY 2.0 (France) Attribution: tatoeba.org #433510 (CK) & #5092136 (mirrorvan) +You idiot! 蠢货! CC-BY 2.0 (France) Attribution: tatoeba.org #418475 (Scott) & #462028 (fucongcong) +You stink. 你身上发臭了。 CC-BY 2.0 (France) Attribution: tatoeba.org #4834656 (shekitten) & #7771683 (jiangche) +All aboard! 请上船! CC-BY 2.0 (France) Attribution: tatoeba.org #22121 (CM) & #5092195 (mirrorvan) +Am I wrong? 我錯了嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #410779 (CK) & #825125 (Martha) +Are you up? 你起床了嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #1841739 (CK) & #10221072 (xjjAstrus) +Be careful! 小心! CC-BY 2.0 (France) Attribution: tatoeba.org #2047579 (CK) & #11207038 (klzlueylx) +Be on time. 要守时! CC-BY 2.0 (France) Attribution: tatoeba.org #2244995 (CK) & #8743793 (crescat) +Be patient. 耐心等着。 CC-BY 2.0 (France) Attribution: tatoeba.org #1486456 (Spamster) & #5092221 (mirrorvan) +Birds sing. 鳥兒歌唱。 CC-BY 2.0 (France) Attribution: tatoeba.org #278174 (CK) & #819283 (Martha) +Can I help? 我可以幫忙嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #266051 (CK) & #908384 (Martha) +Come on in. 进来。 CC-BY 2.0 (France) Attribution: tatoeba.org #348107 (Zifre) & #5102310 (mirrorvan) +Definitely! 必须的! CC-BY 2.0 (France) Attribution: tatoeba.org #30542 (CM) & #4505064 (dongwang) +Definitely! 当然哪! CC-BY 2.0 (France) Attribution: tatoeba.org #30542 (CM) & #11698263 (Jokubas) +Don't fret. 別擔心。 CC-BY 2.0 (France) Attribution: tatoeba.org #1520777 (Spamster) & #395933 (Martha) +Don't move! 别动! CC-BY 2.0 (France) Attribution: tatoeba.org #2111911 (CK) & #2531345 (fenfang557) +Don't move. 不要动。 CC-BY 2.0 (France) Attribution: tatoeba.org #433502 (CK) & #461602 (fucongcong) +Don't move. 不要动. CC-BY 2.0 (France) Attribution: tatoeba.org #433502 (CK) & #6850362 (mao) +Don't wait. 不要等待! CC-BY 2.0 (France) Attribution: tatoeba.org #1292208 (CK) & #4970132 (wzhd) +Fill it up. 把它填滿。 CC-BY 2.0 (France) Attribution: tatoeba.org #322631 (CK) & #825952 (Martha) +Follow him. 跟著他走。 CC-BY 2.0 (France) Attribution: tatoeba.org #433754 (CK) & #819287 (Martha) +Go on home. 回家吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #2230772 (CK) & #5102214 (mirrorvan) +Go wash up. 去洗洗吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #2230782 (CK) & #8696177 (crescat) +God exists. 上帝存在。 CC-BY 2.0 (France) Attribution: tatoeba.org #433457 (CK) & #819291 (Martha) +Good night. 晚安。 CC-BY 2.0 (France) Attribution: tatoeba.org #2362724 (NotApplicable) & #4463431 (maple) +He gave in. 他让步了. CC-BY 2.0 (France) Attribution: tatoeba.org #296376 (CK) & #1424209 (asosan) +He is a DJ. 他是一个 DJ 。 CC-BY 2.0 (France) Attribution: tatoeba.org #288669 (CK) & #1878329 (sadhen) +He is busy. 他很忙。 CC-BY 2.0 (France) Attribution: tatoeba.org #1349951 (sacredceltic) & #343715 (fucongcong) +He is lazy. 他很懒。 CC-BY 2.0 (France) Attribution: tatoeba.org #299797 (CK) & #343917 (fucongcong) +He is mean. 他很凶。 CC-BY 2.0 (France) Attribution: tatoeba.org #482973 (minshirui) & #334863 (fucongcong) +He is poor. 他很穷。 CC-BY 2.0 (France) Attribution: tatoeba.org #516601 (kebukebu) & #336441 (fucongcong) +He is tall. 他高。 CC-BY 2.0 (France) Attribution: tatoeba.org #773336 (marloncori) & #4887716 (musclegirlxyp) +Hello, Tom. 你好,汤姆。 CC-BY 2.0 (France) Attribution: tatoeba.org #54604 (Zifre) & #5092241 (mirrorvan) +Hey, relax. 嘿,放松点。 CC-BY 2.0 (France) Attribution: tatoeba.org #325177 (CM) & #5102212 (mirrorvan) +How lovely! 多可爱啊! CC-BY 2.0 (France) Attribution: tatoeba.org #1913086 (CK) & #5092632 (mirrorvan) +How's work? 工作怎么样? CC-BY 2.0 (France) Attribution: tatoeba.org #245394 (CK) & #5100103 (mirrorvan) +Hurry home. 赶快回家。 CC-BY 2.0 (France) Attribution: tatoeba.org #1841177 (CK) & #5092584 (mirrorvan) +I am a man. 我是个男人。 CC-BY 2.0 (France) Attribution: tatoeba.org #386704 (Mouseneb) & #333655 (fucongcong) +I am short. 我个头矮。 CC-BY 2.0 (France) Attribution: tatoeba.org #436273 (lukaszpp) & #4265202 (notabene) +I can cook. 我会做饭。 CC-BY 2.0 (France) Attribution: tatoeba.org #2245639 (CK) & #4456369 (plutowu) +I can swim. 我會游泳。 CC-BY 2.0 (France) Attribution: tatoeba.org #256178 (CK) & #918075 (Martha) +I can't go. 我不能走。 CC-BY 2.0 (France) Attribution: tatoeba.org #1951742 (CK) & #7771688 (jiangche) +I can't go. 我走不了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1951742 (CK) & #7771689 (jiangche) +I chew gum. 我嚼口香糖。 CC-BY 2.0 (France) Attribution: tatoeba.org #2528462 (BoriQa) & #9956903 (GlossaMatik) +I eat here. 我在這裡吃。 CC-BY 2.0 (France) Attribution: tatoeba.org #449105 (CK) & #826251 (Martha) +I envy her. 我嫉妒她。 CC-BY 2.0 (France) Attribution: tatoeba.org #1414039 (Eldad) & #5359462 (egg0073) +I envy him. 我羡慕他。 CC-BY 2.0 (France) Attribution: tatoeba.org #259949 (CK) & #2076343 (sadhen) +I feel sad. 我很难过。 CC-BY 2.0 (France) Attribution: tatoeba.org #5263414 (CK) & #333736 (fucongcong) +I hate you. 我恨你。 CC-BY 2.0 (France) Attribution: tatoeba.org #827295 (RaspaKrusto) & #827522 (Martha) +I heard it. 我聽到了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2245911 (CK) & #8730182 (shou) +I know Tom. 我认识汤姆。 CC-BY 2.0 (France) Attribution: tatoeba.org #2235724 (CK) & #3630139 (suitchic) +I know him. 我認識他。 CC-BY 2.0 (France) Attribution: tatoeba.org #71751 (CK) & #825892 (Martha) +I like tea. 我喜欢茶。 CC-BY 2.0 (France) Attribution: tatoeba.org #253293 (CK) & #399985 (fucongcong) +I like you. 我喜歡你。 CC-BY 2.0 (France) Attribution: tatoeba.org #410751 (CK) & #762004 (Martha) +I like you. 我喜欢你。 CC-BY 2.0 (France) Attribution: tatoeba.org #410751 (CK) & #1424394 (sadhen) +I like you. 我喜欢你! CC-BY 2.0 (France) Attribution: tatoeba.org #410751 (CK) & #9992041 (GlossaMatik) +I love her. 我愛她。 CC-BY 2.0 (France) Attribution: tatoeba.org #261221 (CK) & #759035 (Martha) +I love you. 我爱您。 CC-BY 2.0 (France) Attribution: tatoeba.org #1434 (awael58) & #380195 (Martha) +I miss him. 我想念他。 CC-BY 2.0 (France) Attribution: tatoeba.org #479775 (AniDeer) & #482707 (biglion) +I miss you. 我想你。 CC-BY 2.0 (France) Attribution: tatoeba.org #1308 (brauliobezerra) & #813490 (fucongcong) +I miss you. 我想念你。 CC-BY 2.0 (France) Attribution: tatoeba.org #1308 (brauliobezerra) & #2180625 (egg0073) +I need you. 我需要你。 CC-BY 2.0 (France) Attribution: tatoeba.org #17735 (CK) & #512853 (fucongcong) +I promised. 我答应了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2123633 (CK) & #10194942 (GlossaMatik) +I think so. 我想是這樣的。 CC-BY 2.0 (France) Attribution: tatoeba.org #254072 (CK) & #824631 (Martha) +I use this. 我使用这个。 CC-BY 2.0 (France) Attribution: tatoeba.org #1356774 (sacredceltic) & #1533414 (CLARET) +I want you. 我想要你。 CC-BY 2.0 (France) Attribution: tatoeba.org #17707 (CK) & #604627 (CLARET) +I'll do it. 我會做的。 CC-BY 2.0 (France) Attribution: tatoeba.org #433474 (CK) & #819461 (Martha) +I'm 30 now. 我现在30岁了。 CC-BY 2.0 (France) Attribution: tatoeba.org #5865062 (Ricardo14) & #335364 (fucongcong) +I'm a hero. 我是個英雄。 CC-BY 2.0 (France) Attribution: tatoeba.org #25509 (CK) & #826001 (Martha) +I'm a liar. 我是个骗子。 CC-BY 2.0 (France) Attribution: tatoeba.org #1468181 (AMIKEMA) & #8685539 (crescat) +I'm buying. 我买了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1844179 (CK) & #389383 (fucongcong) +I'm coming. 我来啦。 CC-BY 2.0 (France) Attribution: tatoeba.org #52081 (CK) & #419683 (GlossaMatik) +I'm eating. 我正在吃东西。 CC-BY 2.0 (France) Attribution: tatoeba.org #1189719 (Vortarulo) & #1790133 (sadhen) +I'm faster. 我更快。 CC-BY 2.0 (France) Attribution: tatoeba.org #3378201 (CK) & #3378200 (GlossaMatik) +I'm humble. 我是謙虛的。 CC-BY 2.0 (France) Attribution: tatoeba.org #2202962 (CK) & #5611553 (verdastelo9604) +I'm single. 我单身。 CC-BY 2.0 (France) Attribution: tatoeba.org #2111685 (CK) & #4977440 (musclegirlxyp) +I'm single. 我單身。 CC-BY 2.0 (France) Attribution: tatoeba.org #2111685 (CK) & #5691850 (xjjAstrus) +I'm sleepy. 我困了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1438701 (tim1452) & #1358461 (sadhen) +I'm so fat. 我好胖哦。 CC-BY 2.0 (France) Attribution: tatoeba.org #1339 (Zifre) & #50 (fucongcong) +I'm thirty. 我三十歲。 CC-BY 2.0 (France) Attribution: tatoeba.org #2111679 (CK) & #8767504 (xjjAstrus) +I'm twelve. 我十二岁了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2069142 (halfb1t) & #9959852 (GlossaMatik) +Ignore Tom. 别理汤姆。 CC-BY 2.0 (France) Attribution: tatoeba.org #1868480 (CK) & #5102314 (mirrorvan) +Is he tall? 他长得高吗? CC-BY 2.0 (France) Attribution: tatoeba.org #302406 (CK) & #8866914 (crescat) +Is it love? 那是愛嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #663921 (bluepie88) & #3957684 (egg0073) +Is it true? 是真的吗? CC-BY 2.0 (France) Attribution: tatoeba.org #378827 (CK) & #3377988 (GlossaMatik) +It is 7:45. 现在是七点四十五分。 CC-BY 2.0 (France) Attribution: tatoeba.org #456101 (lukaszpp) & #2041218 (Venki) +It is 7:45. 现在是7点45分。 CC-BY 2.0 (France) Attribution: tatoeba.org #456101 (lukaszpp) & #2041220 (Venki) +It's great. 真是太好了。 CC-BY 2.0 (France) Attribution: tatoeba.org #3824325 (CK) & #5942060 (verdastelo9604) +It's night. 是晚上了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2187224 (CK) & #6047459 (verdastelo9604) +It's wrong. 不对。 CC-BY 2.0 (France) Attribution: tatoeba.org #1537010 (Spamster) & #10961087 (xjjAstrus) +Just relax. 放松点吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #1555685 (Spamster) & #5102290 (mirrorvan) +Keep it up! 坚持。 CC-BY 2.0 (France) Attribution: tatoeba.org #45024 (CK) & #5092492 (mirrorvan) +Keep it up. 坚持。 CC-BY 2.0 (France) Attribution: tatoeba.org #45026 (CK) & #5092492 (mirrorvan) +Keep quiet! 保持安静! CC-BY 2.0 (France) Attribution: tatoeba.org #272075 (CK) & #5102187 (mirrorvan) +Keep quiet. 保持安静! CC-BY 2.0 (France) Attribution: tatoeba.org #272043 (CK) & #5102187 (mirrorvan) +Let him in. 让他进来。 CC-BY 2.0 (France) Attribution: tatoeba.org #464814 (CK) & #3032023 (sadhen) +Let me die. 让我去死。 CC-BY 2.0 (France) Attribution: tatoeba.org #1020543 (CK) & #4845112 (pig8322) +Let me see. 让我想一想。 CC-BY 2.0 (France) Attribution: tatoeba.org #65316 (CK) & #707208 (Yashanti) +Let me try. 让我试试。 CC-BY 2.0 (France) Attribution: tatoeba.org #1554612 (CK) & #333051 (fucongcong) +Let me try. 让我来。 CC-BY 2.0 (France) Attribution: tatoeba.org #1554612 (CK) & #5092185 (mirrorvan) +Let's play. 让我们玩耍吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #324520 (CK) & #9956028 (GlossaMatik) +Let's pray. 让我们开始祈祷吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #2187249 (CK) & #8673663 (crescat) +Let's walk. 我们走走吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #2007935 (CK) & #5897892 (verdastelo9604) +Look there. 看那里。 CC-BY 2.0 (France) Attribution: tatoeba.org #1635351 (Amastan) & #5092523 (mirrorvan) +No comment. 无可奉告。 CC-BY 2.0 (France) Attribution: tatoeba.org #873323 (U2FS) & #7774602 (jiangche) +No kidding? 真的? CC-BY 2.0 (France) Attribution: tatoeba.org #1585482 (ngdongit) & #1397360 (mtdot) +No kidding? 认真的? CC-BY 2.0 (France) Attribution: tatoeba.org #1585482 (ngdongit) & #10983988 (Elaineeeeee) +No problem! 没问题! CC-BY 2.0 (France) Attribution: tatoeba.org #413611 (blay_paul) & #2043289 (sadhen) +No problem. 没关系。 CC-BY 2.0 (France) Attribution: tatoeba.org #551443 (CM) & #333730 (fucongcong) +No problem. 没问题。 CC-BY 2.0 (France) Attribution: tatoeba.org #551443 (CM) & #343630 (fucongcong) +No problem. 没事。 CC-BY 2.0 (France) Attribution: tatoeba.org #551443 (CM) & #551441 (GlossaMatik) +Oh, really? 噢,真的嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #2570909 (Hybrid) & #2771144 (cienias) +Once again. 再一次。 CC-BY 2.0 (France) Attribution: tatoeba.org #433729 (CK) & #826049 (Martha) +Please sit. 请用座。 CC-BY 2.0 (France) Attribution: tatoeba.org #478180 (CK) & #8500212 (black333) +She smiled. 她笑了。 CC-BY 2.0 (France) Attribution: tatoeba.org #311898 (CK) & #5092276 (mirrorvan) +Stand back! 往后站! CC-BY 2.0 (France) Attribution: tatoeba.org #1894221 (Spamster) & #5092607 (mirrorvan) +Stay sharp. 保持警惕。 CC-BY 2.0 (France) Attribution: tatoeba.org #1627331 (Spamster) & #5092516 (mirrorvan) +Stay still. 别动。 CC-BY 2.0 (France) Attribution: tatoeba.org #2111509 (CK) & #9958178 (GlossaMatik) +Stay there. 留在这里别动。 CC-BY 2.0 (France) Attribution: tatoeba.org #462476 (lukaszpp) & #5102231 (mirrorvan) +Step aside. 让开。 CC-BY 2.0 (France) Attribution: tatoeba.org #40051 (CK) & #5092217 (mirrorvan) +Step on it! 快一點! CC-BY 2.0 (France) Attribution: tatoeba.org #786811 (hrin) & #4754629 (egg0073) +Study hard. 好好学习。 CC-BY 2.0 (France) Attribution: tatoeba.org #53465 (CK) & #5092230 (mirrorvan) +That hurts. 真疼。 CC-BY 2.0 (France) Attribution: tatoeba.org #462526 (lukaszpp) & #5092328 (mirrorvan) +That's odd. 奇怪。 CC-BY 2.0 (France) Attribution: tatoeba.org #1453153 (Spamster) & #917754 (GlossaMatik) +That's wet. 那是湿的。 CC-BY 2.0 (France) Attribution: tatoeba.org #6532456 (CK) & #9970073 (GlossaMatik) +Time flies. 時光飛逝。 CC-BY 2.0 (France) Attribution: tatoeba.org #263886 (CK) & #718352 (egg0073) +Time flies. 時間匆匆經過。 CC-BY 2.0 (France) Attribution: tatoeba.org #263886 (CK) & #5551139 (verdastelo9604) +Tom failed. 汤姆失败了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2111179 (CK) & #8671326 (crescat) +Tom is ill. 汤姆生病了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2236724 (CK) & #10109529 (ColawithIce) +Tom is ill. 汤姆病了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2236724 (CK) & #10109530 (ColawithIce) +Tom is shy. 汤姆害羞。 CC-BY 2.0 (France) Attribution: tatoeba.org #2203345 (CK) & #5663584 (verdastelo9604) +Tom smiled. 汤姆笑了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2005184 (CK) & #5102350 (mirrorvan) +Tom yawned. 汤姆打哈欠了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2005186 (CK) & #5102359 (mirrorvan) +Tom's sick. 汤姆生病了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2107594 (CK) & #10109529 (ColawithIce) +Tom's sick. 汤姆病了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2107594 (CK) & #10109530 (ColawithIce) +Turn right. 向右转。 CC-BY 2.0 (France) Attribution: tatoeba.org #464290 (lukaszpp) & #5092330 (mirrorvan) +We laughed. 我们笑了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1922452 (teapot) & #5092668 (mirrorvan) +We lost it. 我们失去了它。 CC-BY 2.0 (France) Attribution: tatoeba.org #2241150 (CK) & #4844980 (pig8322) +We'll cook. 我们会做饭的。 CC-BY 2.0 (France) Attribution: tatoeba.org #2203631 (CK) & #2780382 (GlossaMatik) +We're boys. 我們是男孩。 CC-BY 2.0 (France) Attribution: tatoeba.org #6874274 (CK) & #825895 (Martha) +We're late. 我們遲到了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2107352 (CK) & #848203 (Martha) +What is it? 它是什么? CC-BY 2.0 (France) Attribution: tatoeba.org #42849 (brauliobezerra) & #4887708 (musclegirlxyp) +What's new? 有什么新鲜事吗? CC-BY 2.0 (France) Attribution: tatoeba.org #25029 (CK) & #794256 (fucongcong) +Where am I? 我在哪裡? CC-BY 2.0 (France) Attribution: tatoeba.org #255212 (adjusting) & #884699 (Martha) +Where am I? 這是什麼地方? CC-BY 2.0 (France) Attribution: tatoeba.org #255212 (adjusting) & #884701 (Martha) +Who are we? 我們是誰? CC-BY 2.0 (France) Attribution: tatoeba.org #2254698 (CK) & #6146408 (xjjAstrus) +Who is Tom? 汤姆是谁? CC-BY 2.0 (France) Attribution: tatoeba.org #2587424 (Hybrid) & #4956713 (musclegirlxyp) +Who is she? 她是谁? CC-BY 2.0 (France) Attribution: tatoeba.org #315731 (CK) & #4887707 (musclegirlxyp) +Who's next? 下一个是谁? CC-BY 2.0 (France) Attribution: tatoeba.org #2561317 (Hybrid) & #7768204 (jiangche) +Who's that? 这是谁啊? CC-BY 2.0 (France) Attribution: tatoeba.org #742806 (rpglover64) & #9958407 (GlossaMatik) +Wood burns. 木材可燃。 CC-BY 2.0 (France) Attribution: tatoeba.org #323576 (CK) & #826256 (Martha) +You can go. 您可以走了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1553295 (CK) & #396894 (GlossaMatik) +You can go. 你可以去了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1553295 (CK) & #476578 (fucongcong) +You got me. 算你狠。 CC-BY 2.0 (France) Attribution: tatoeba.org #2254995 (CK) & #2485289 (fenfang557) +You may go. 您可以走了。 CC-BY 2.0 (France) Attribution: tatoeba.org #518553 (CK) & #396894 (GlossaMatik) +You may go. 你可以去了。 CC-BY 2.0 (France) Attribution: tatoeba.org #518553 (CK) & #476578 (fucongcong) +Are we done? 我们完成了吗? CC-BY 2.0 (France) Attribution: tatoeba.org #1553536 (CK) & #1783788 (sadhen) +Are you Tom? 你是汤姆吗? CC-BY 2.0 (France) Attribution: tatoeba.org #1495916 (CK) & #2163114 (sadhen) +Are you mad? 您生气了吗? CC-BY 2.0 (France) Attribution: tatoeba.org #18965 (CK) & #476597 (fucongcong) +Are you mad? 你生气了吗? CC-BY 2.0 (France) Attribution: tatoeba.org #18965 (CK) & #476598 (fucongcong) +Are you new? 你是新来的吗? CC-BY 2.0 (France) Attribution: tatoeba.org #429820 (CM) & #429821 (GlossaMatik) +Are you sad? 你傷心嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #1755584 (Betsemes) & #6073888 (verdastelo9604) +Are you sad? 你在难过吗? CC-BY 2.0 (France) Attribution: tatoeba.org #1755584 (Betsemes) & #8775843 (crescat) +Be friendly. 友善点。 CC-BY 2.0 (France) Attribution: tatoeba.org #2111962 (CK) & #5092663 (mirrorvan) +Be friendly. 友好點。 CC-BY 2.0 (France) Attribution: tatoeba.org #2111962 (CK) & #5571916 (verdastelo9604) +Be punctual. 要守时! CC-BY 2.0 (France) Attribution: tatoeba.org #2111959 (CK) & #8743793 (crescat) +Break it up! 停手! CC-BY 2.0 (France) Attribution: tatoeba.org #2245010 (CK) & #5093963 (mirrorvan) +Can I begin? 我可以开始了吗? CC-BY 2.0 (France) Attribution: tatoeba.org #2245038 (CK) & #10194956 (GlossaMatik) +Can I start? 我可以开始了吗? CC-BY 2.0 (France) Attribution: tatoeba.org #9230028 (CK) & #10194956 (GlossaMatik) +Can you see? 你能看吗? CC-BY 2.0 (France) Attribution: tatoeba.org #1553530 (CK) & #1783787 (sadhen) +Come inside. 进来。 CC-BY 2.0 (France) Attribution: tatoeba.org #2111930 (CK) & #5102310 (mirrorvan) +Count me in. 算我一个. CC-BY 2.0 (France) Attribution: tatoeba.org #42880 (CK) & #1424217 (asosan) +Did Tom win? 汤姆赢了吗? CC-BY 2.0 (France) Attribution: tatoeba.org #2235687 (CK) & #4956719 (musclegirlxyp) +Do as I say. 按我說的做。 CC-BY 2.0 (France) Attribution: tatoeba.org #2029931 (Spamster) & #6150007 (verdastelo9604) +Don't laugh. 别笑! CC-BY 2.0 (France) Attribution: tatoeba.org #1771554 (Scott) & #9641453 (jin1) +Don't leave! 別走! CC-BY 2.0 (France) Attribution: tatoeba.org #872936 (CK) & #6131474 (verdastelo9604) +Don't panic! 不要恐慌! CC-BY 2.0 (France) Attribution: tatoeba.org #810774 (Zaphod) & #6119462 (verdastelo9604) +Don't shoot. 停火。 CC-BY 2.0 (France) Attribution: tatoeba.org #1972643 (CK) & #5092693 (mirrorvan) +Don't shout. 不许大叫。 CC-BY 2.0 (France) Attribution: tatoeba.org #279585 (CK) & #2393083 (fenfang557) +Don't smile. 不要微笑。 CC-BY 2.0 (France) Attribution: tatoeba.org #2111902 (CK) & #8577720 (GlossaMatik) +Don't worry. 你不要着急。 CC-BY 2.0 (France) Attribution: tatoeba.org #506446 (rtomharper) & #394139 (GlossaMatik) +Don't worry. 別擔心。 CC-BY 2.0 (France) Attribution: tatoeba.org #506446 (rtomharper) & #395933 (Martha) +Don't worry. 别擔心。 CC-BY 2.0 (France) Attribution: tatoeba.org #506446 (rtomharper) & #1959914 (egg0073) +Get dressed. 你穿點東西。 CC-BY 2.0 (France) Attribution: tatoeba.org #2111832 (CK) & #8727932 (shou) +Get serious. 认真点。 CC-BY 2.0 (France) Attribution: tatoeba.org #268457 (CK) & #346790 (fucongcong) +Have a look. 请看一看。 CC-BY 2.0 (France) Attribution: tatoeba.org #2245539 (CK) & #8935907 (crescat) +He is alone. 他獨自一人。 CC-BY 2.0 (France) Attribution: tatoeba.org #293708 (CK) & #825136 (Martha) +He was busy. 他很忙。 CC-BY 2.0 (France) Attribution: tatoeba.org #303699 (CK) & #343715 (fucongcong) +He's a liar. 他是個騙子。 CC-BY 2.0 (France) Attribution: tatoeba.org #1522255 (erikspen) & #8767447 (xjjAstrus) +He's strong. 他很強壯。 CC-BY 2.0 (France) Attribution: tatoeba.org #295297 (CK) & #819293 (Martha) +Here we are! 我們到了! CC-BY 2.0 (France) Attribution: tatoeba.org #54174 (CK) & #819471 (Martha) +Here, catch! 这里,快抓住。 CC-BY 2.0 (France) Attribution: tatoeba.org #6858683 (Hybrid) & #6858750 (SherryChen) +How are you? 你們好嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #373320 (CK) & #1761553 (egg0073) +How are you? 你好嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #373320 (CK) & #6559017 (xjjAstrus) +How curious! 真奇怪。 CC-BY 2.0 (France) Attribution: tatoeba.org #1913085 (CK) & #1705791 (sadhen) +How curious! 多怪啊! CC-BY 2.0 (France) Attribution: tatoeba.org #1913085 (CK) & #5092629 (mirrorvan) +How is life? 生活怎么样? CC-BY 2.0 (France) Attribution: tatoeba.org #2205973 (freddy1) & #402747 (GlossaMatik) +How strange! 真奇怪。 CC-BY 2.0 (France) Attribution: tatoeba.org #1913092 (CK) & #1705791 (sadhen) +I also went. 我也去了。 CC-BY 2.0 (France) Attribution: tatoeba.org #262358 (CK) & #400490 (GlossaMatik) +I am coming. 我來了。 CC-BY 2.0 (France) Attribution: tatoeba.org #65918 (CK) & #826249 (Martha) +I am online. 我上网了。 CC-BY 2.0 (France) Attribution: tatoeba.org #436415 (lukaszpp) & #797368 (GlossaMatik) +I buy tapes. 我買磁帶。 CC-BY 2.0 (France) Attribution: tatoeba.org #435445 (CK) & #832833 (Martha) +I can drive. 我會開車。 CC-BY 2.0 (France) Attribution: tatoeba.org #744722 (CK) & #881297 (Martha) +I can't say. 我不能说。 CC-BY 2.0 (France) Attribution: tatoeba.org #24897 (CK) & #796833 (fucongcong) +I don't lie. 我不說謊。 CC-BY 2.0 (France) Attribution: tatoeba.org #2245722 (CK) & #6065390 (verdastelo9604) +I eat bread. 我吃面包。 CC-BY 2.0 (France) Attribution: tatoeba.org #1867478 (CK) & #843482 (fucongcong) +I feel cold. 我觉得冷。 CC-BY 2.0 (France) Attribution: tatoeba.org #21124 (CK) & #352054 (fucongcong) +I feel fine. 我感觉很好。 CC-BY 2.0 (France) Attribution: tatoeba.org #321586 (CK) & #784051 (fucongcong) +I feel sick. 我有点恶心。 CC-BY 2.0 (France) Attribution: tatoeba.org #759379 (vgigregg) & #8626613 (xjjAstrus) +I feel weak. 我感到虚弱。 CC-BY 2.0 (France) Attribution: tatoeba.org #2245759 (CK) & #6086795 (verdastelo9604) +I got lucky. 我运气很好。 CC-BY 2.0 (France) Attribution: tatoeba.org #2199425 (Hybrid) & #437296 (fucongcong) +I hate fish. 我讨厌鱼。 CC-BY 2.0 (France) Attribution: tatoeba.org #2797586 (CK) & #10194954 (GlossaMatik) +I hate wine. 我讨厌酒。 CC-BY 2.0 (France) Attribution: tatoeba.org #8909222 (CK) & #10062425 (slo_oth) +I have time. 我有时间。 CC-BY 2.0 (France) Attribution: tatoeba.org #2245901 (CK) & #4859550 (musclegirlxyp) +I have wine. 我有酒。 CC-BY 2.0 (France) Attribution: tatoeba.org #1764447 (CK) & #5617204 (verdastelo9604) +I heard you. 我聽你的。 CC-BY 2.0 (France) Attribution: tatoeba.org #885698 (Trailsend) & #884751 (Tajfun) +I like blue. 我喜欢蓝色。 CC-BY 2.0 (France) Attribution: tatoeba.org #2245933 (CK) & #3378086 (GlossaMatik) +I like fish. 我喜欢鱼。 CC-BY 2.0 (France) Attribution: tatoeba.org #256891 (CK) & #5551033 (verdastelo9604) +I like jazz. 我喜歡爵士樂。 CC-BY 2.0 (France) Attribution: tatoeba.org #321631 (CK) & #826284 (Martha) +I like them. 我喜欢他们。 CC-BY 2.0 (France) Attribution: tatoeba.org #2747576 (CK) & #7771664 (jiangche) +I like wine. 我喜欢葡萄酒。 CC-BY 2.0 (France) Attribution: tatoeba.org #5828948 (CK) & #9958185 (GlossaMatik) +I live here. 我住在這。 CC-BY 2.0 (France) Attribution: tatoeba.org #444986 (CK) & #1488531 (egg0073) +I live here. 我住在这里。 CC-BY 2.0 (France) Attribution: tatoeba.org #444986 (CK) & #11264800 (asuliu) +I lost face. 我丟臉了。 CC-BY 2.0 (France) Attribution: tatoeba.org #252374 (CM) & #8572029 (verdastelo9604) +I need glue. 我需要胶水。 CC-BY 2.0 (France) Attribution: tatoeba.org #2631795 (Joseph) & #5576802 (verdastelo9604) +I need help. 我需要帮助。 CC-BY 2.0 (France) Attribution: tatoeba.org #582309 (CM) & #7768354 (jiangche) +I overslept. 我睡过头了。 CC-BY 2.0 (France) Attribution: tatoeba.org #258769 (CK) & #335166 (fucongcong) +I overslept. 我睡過頭了。 CC-BY 2.0 (France) Attribution: tatoeba.org #258769 (CK) & #5995689 (xjjAstrus) +I read lips. 我读唇语。 CC-BY 2.0 (France) Attribution: tatoeba.org #2246047 (CK) & #10260764 (GlossaMatik) +I said that. 我是那樣說的。 CC-BY 2.0 (France) Attribution: tatoeba.org #433643 (CK) & #824597 (Martha) +I smell gas. 我聞到瓦斯味。 CC-BY 2.0 (France) Attribution: tatoeba.org #681055 (Source_VOA) & #1440981 (egg0073) +I trust him. 我信赖他。 CC-BY 2.0 (France) Attribution: tatoeba.org #1258628 (CK) & #808210 (fucongcong) +I trust him. 我信任他。 CC-BY 2.0 (France) Attribution: tatoeba.org #1258628 (CK) & #1762944 (sadhen) +I trust you. 我信任你。 CC-BY 2.0 (France) Attribution: tatoeba.org #457741 (sacredceltic) & #1878344 (sadhen) +I want more. 我想要更多。 CC-BY 2.0 (France) Attribution: tatoeba.org #521096 (CK) & #3742594 (egg0073) +I was alone. 我茕茕孑立,形影相吊。 CC-BY 2.0 (France) Attribution: tatoeba.org #2208338 (CK) & #10537181 (howie) +I was lucky. 我运气很好。 CC-BY 2.0 (France) Attribution: tatoeba.org #256144 (CK) & #437296 (fucongcong) +I was wrong. 我搞错了。 CC-BY 2.0 (France) Attribution: tatoeba.org #472431 (blay_paul) & #476229 (fucongcong) +I was wrong. 我想错了。 CC-BY 2.0 (France) Attribution: tatoeba.org #472431 (blay_paul) & #2367643 (GlossaMatik) +I went, too. 我也去了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1300817 (CK) & #400490 (GlossaMatik) +I will obey. 我会听从指示。 CC-BY 2.0 (France) Attribution: tatoeba.org #2247576 (CK) & #5691239 (verdastelo9604) +I work here. 我在這裡工作。 CC-BY 2.0 (France) Attribution: tatoeba.org #730034 (CK) & #1953193 (egg0073) +I'll attend. 我會參加。 CC-BY 2.0 (France) Attribution: tatoeba.org #435424 (CK) & #819296 (Martha) +I'll get in. 我會進去。 CC-BY 2.0 (France) Attribution: tatoeba.org #321895 (CK) & #824616 (Martha) +I'm 17, too. 我也是17岁。 CC-BY 2.0 (France) Attribution: tatoeba.org #708209 (papabear) & #472869 (fucongcong) +I'm a loser. 我是個不成器的人。 CC-BY 2.0 (France) Attribution: tatoeba.org #1201482 (CM) & #1448587 (egg0073) +I'm a loser. 我是個輸家。 CC-BY 2.0 (France) Attribution: tatoeba.org #1201482 (CM) & #5472022 (egg0073) +I'm a slave. 我是個奴隸。 CC-BY 2.0 (France) Attribution: tatoeba.org #10204809 (shekitten) & #6760109 (xjjAstrus) +I'm at home. 我在家。 CC-BY 2.0 (France) Attribution: tatoeba.org #404046 (zipangu) & #336238 (fucongcong) +I'm at home. 我在家裡。 CC-BY 2.0 (France) Attribution: tatoeba.org #404046 (zipangu) & #919764 (Martha) +I'm curious. 我很好奇。 CC-BY 2.0 (France) Attribution: tatoeba.org #1396179 (CK) & #335059 (fucongcong) +I'm healthy. 我身体很好。 CC-BY 2.0 (France) Attribution: tatoeba.org #259288 (CK) & #3378000 (GlossaMatik) +I'm injured. 我受伤了。 CC-BY 2.0 (France) Attribution: tatoeba.org #6196250 (CK) & #10699406 (GlossaMatik) +I'm kidding. 我开玩笑。 CC-BY 2.0 (France) Attribution: tatoeba.org #2111715 (CK) & #398518 (GlossaMatik) +I'm married. 我结婚了。 CC-BY 2.0 (France) Attribution: tatoeba.org #257204 (CK) & #399997 (fucongcong) +I'm married. 我已婚。 CC-BY 2.0 (France) Attribution: tatoeba.org #257204 (CK) & #761438 (Martha) +I'm praying. 我在祈禱。 CC-BY 2.0 (France) Attribution: tatoeba.org #3530803 (ConqueRRoR) & #6065393 (verdastelo9604) +I'm reading. 我在读书。 CC-BY 2.0 (France) Attribution: tatoeba.org #1349059 (sacredceltic) & #5640765 (verdastelo9604) +I'm relaxed. 我很放松。 CC-BY 2.0 (France) Attribution: tatoeba.org #2111695 (CK) & #10023027 (GlossaMatik) +I'm serious. 我是認真的。 CC-BY 2.0 (France) Attribution: tatoeba.org #433675 (CK) & #824668 (Martha) +I'm thirsty. 我渴了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1814 (CK) & #465911 (fucongcong) +I'm wounded. 我受伤了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2111666 (CK) & #10699406 (GlossaMatik) +Is Tom home? 汤姆在家里吗? CC-BY 2.0 (France) Attribution: tatoeba.org #2244604 (CK) & #8696451 (morningstar) +Is Tom hurt? 汤姆受伤了吗? CC-BY 2.0 (France) Attribution: tatoeba.org #2244607 (CK) & #8696449 (morningstar) +Is Tom sick? 汤姆是不是身体不太好? CC-BY 2.0 (France) Attribution: tatoeba.org #2244639 (CK) & #8696445 (morningstar) +Is Tom well? 汤姆还好吧? CC-BY 2.0 (France) Attribution: tatoeba.org #2244644 (CK) & #4473132 (yuiyu) +Is he right? 他对吗? CC-BY 2.0 (France) Attribution: tatoeba.org #300372 (CK) & #9953366 (GlossaMatik) +Is it tasty? 好吃嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #5758419 (CM) & #4061623 (egg0073) +Is it yours? 这是你的吗? CC-BY 2.0 (France) Attribution: tatoeba.org #42344 (CK) & #1311790 (vicch) +It can't be! 这不可能! CC-BY 2.0 (France) Attribution: tatoeba.org #1501 (CK) & #334699 (fucongcong) +It can't be! 不可能! CC-BY 2.0 (France) Attribution: tatoeba.org #1501 (CK) & #503298 (fucongcong) +It's a fake. 这是一个伪造品。 CC-BY 2.0 (France) Attribution: tatoeba.org #2249002 (CK) & #630264 (CLARET) +It's my job. 這是我份內的事。 CC-BY 2.0 (France) Attribution: tatoeba.org #433521 (CK) & #824695 (Martha) +It's spring. 春天了 CC-BY 2.0 (France) Attribution: tatoeba.org #456241 (lukaszpp) & #5114843 (xjjAstrus) +Just say no. 只要說不。 CC-BY 2.0 (France) Attribution: tatoeba.org #827234 (Scott) & #827525 (Martha) +Keep trying. 继续努力。 CC-BY 2.0 (France) Attribution: tatoeba.org #1629911 (Spamster) & #5092521 (mirrorvan) +Let me know. 讓我知道。 CC-BY 2.0 (France) Attribution: tatoeba.org #1228083 (CK) & #4741990 (egg0073) +Let's begin. 讓我們開始吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #387427 (CK) & #819465 (Martha) +Let's leave. 走吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #2007931 (CK) & #334277 (fucongcong) +Let's start! 讓我們開始吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #387428 (CK) & #819465 (Martha) +Let's start. 我们开始吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #2007928 (CK) & #7767999 (jiangche) +Life is fun. 人生是有趣的。 CC-BY 2.0 (France) Attribution: tatoeba.org #435772 (CK) & #771359 (Martha) +Look around. 四处看看。 CC-BY 2.0 (France) Attribution: tatoeba.org #1271905 (Lich) & #5092470 (mirrorvan) +Lunch is on. 午餐送到了。 CC-BY 2.0 (France) Attribution: tatoeba.org #64177 (Zifre) & #1304156 (tsayng) +Make a list. 列一个列表。 CC-BY 2.0 (France) Attribution: tatoeba.org #2249574 (CK) & #10199329 (slo_oth) +Many thanks. 非常感谢! CC-BY 2.0 (France) Attribution: tatoeba.org #322178 (CK) & #334426 (fucongcong) +Money talks. 金钱万能。 CC-BY 2.0 (France) Attribution: tatoeba.org #18631 (CK) & #5092154 (mirrorvan) +Nice timing. 好时机。 CC-BY 2.0 (France) Attribution: tatoeba.org #1329340 (Scott) & #5092489 (mirrorvan) +No one came. 没有人来了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2238072 (gleki) & #501581 (fucongcong) +OK, you win. 行,你赢了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2722194 (Hybrid) & #10449478 (GlossaMatik) +OK, you win. 好吧,你赢了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2722194 (Hybrid) & #10449481 (GlossaMatik) +OK. I agree. 好。我同意。 CC-BY 2.0 (France) Attribution: tatoeba.org #433874 (CK) & #824718 (Martha) +Please come. 请来吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #324997 (CK) & #5102210 (mirrorvan) +Please sing. 请唱歌。 CC-BY 2.0 (France) Attribution: tatoeba.org #1937071 (CK) & #5092671 (mirrorvan) +Release him. 放开他。 CC-BY 2.0 (France) Attribution: tatoeba.org #1841180 (CK) & #5092602 (mirrorvan) +She bit him. 她咬了他。 CC-BY 2.0 (France) Attribution: tatoeba.org #887002 (CK) & #8940729 (crescat) +She hit him. 她打了他。 CC-BY 2.0 (France) Attribution: tatoeba.org #887215 (CK) & #5670795 (verdastelo9604) +Should I go? 我该去吗? CC-BY 2.0 (France) Attribution: tatoeba.org #1454593 (CK) & #414024 (fucongcong) +Show him in. 让他进来。 CC-BY 2.0 (France) Attribution: tatoeba.org #307894 (CK) & #3032023 (sadhen) +Stand aside. 一边站着。 CC-BY 2.0 (France) Attribution: tatoeba.org #1935050 (Spamster) & #5092669 (mirrorvan) +Step inside. 进来。 CC-BY 2.0 (France) Attribution: tatoeba.org #1841184 (CK) & #5102310 (mirrorvan) +That's life. 這就是生活。 CC-BY 2.0 (France) Attribution: tatoeba.org #515472 (CK) & #771492 (Martha) +That's life. 人生就是如此。 CC-BY 2.0 (France) Attribution: tatoeba.org #515472 (CK) & #771497 (Martha) +That's mine. 那是我的。 CC-BY 2.0 (France) Attribution: tatoeba.org #1841577 (CK) & #6728904 (verdastelo9604) +That's neat. 那很棒。 CC-BY 2.0 (France) Attribution: tatoeba.org #7371381 (Hybrid) & #10021240 (GlossaMatik) +That's soft. 这很软。 CC-BY 2.0 (France) Attribution: tatoeba.org #3447128 (CK) & #7772143 (jiangche) +That's tofu. 那是豆腐。 CC-BY 2.0 (France) Attribution: tatoeba.org #11568262 (shekitten) & #3377901 (GlossaMatik) +That's true. 這是真的。 CC-BY 2.0 (France) Attribution: tatoeba.org #618799 (aandrusiak) & #771357 (Martha) +They hugged. 他们拥抱。 CC-BY 2.0 (France) Attribution: tatoeba.org #2111370 (CK) & #5698029 (verdastelo9604) +They kissed. 他们亲吻了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2006560 (Spamster) & #5102369 (mirrorvan) +This is ice. 這是冰塊。 CC-BY 2.0 (France) Attribution: tatoeba.org #1211442 (alec) & #1205944 (cienias) +Tom blushed. 汤姆脸红了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1027009 (CK) & #5092418 (mirrorvan) +Tom clapped. 湯姆拍了手。 CC-BY 2.0 (France) Attribution: tatoeba.org #2111193 (CK) & #5812342 (xjjAstrus) +Tom frowned. 湯姆皺著眉頭。 CC-BY 2.0 (France) Attribution: tatoeba.org #37029 (CK) & #825907 (Martha) +Tom got fat. 汤姆胖了。 CC-BY 2.0 (France) Attribution: tatoeba.org #4917994 (CK) & #4977399 (musclegirlxyp) +Tom got fat. 汤姆变胖了。 CC-BY 2.0 (France) Attribution: tatoeba.org #4917994 (CK) & #4977409 (musclegirlxyp) +Tom has won. 汤姆胜利了。 CC-BY 2.0 (France) Attribution: tatoeba.org #6358752 (CK) & #4956754 (musclegirlxyp) +Tom is sick. 汤姆生病了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1024872 (CK) & #10109529 (ColawithIce) +Tom is sick. 汤姆病了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1024872 (CK) & #10109530 (ColawithIce) +Tom laughed. 汤姆笑了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2111159 (CK) & #5102350 (mirrorvan) +Tom said hi. 汤姆打了个招呼。 CC-BY 2.0 (France) Attribution: tatoeba.org #7410485 (CK) & #8765180 (crescat) +Tom saw you. 湯姆看見你了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2237661 (CK) & #6728914 (verdastelo9604) +Tom'll wait. 湯姆會等。 CC-BY 2.0 (France) Attribution: tatoeba.org #2123510 (CK) & #6114384 (verdastelo9604) +Tom's drunk. 汤姆醉了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2107496 (CK) & #5142201 (musclegirlxyp) +Tom's happy. 湯姆高興。 CC-BY 2.0 (France) Attribution: tatoeba.org #2602517 (CM) & #6624675 (verdastelo9604) +Tom's tired. 湯姆累了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2107627 (CK) & #6098473 (verdastelo9604) +Tom's wrong. 湯姆錯了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2107659 (CK) & #6293100 (verdastelo9604) +Turn around. 转过来。 CC-BY 2.0 (France) Attribution: tatoeba.org #464282 (lukaszpp) & #5092329 (mirrorvan) +Turn it off. 把它关掉。 CC-BY 2.0 (France) Attribution: tatoeba.org #41719 (CK) & #8877851 (crescat) +Wait for me. 等等我。 CC-BY 2.0 (France) Attribution: tatoeba.org #2253852 (CK) & #7773139 (jiangche) +Was I wrong? 我错了吗? CC-BY 2.0 (France) Attribution: tatoeba.org #25506 (CK) & #335862 (fucongcong) +We both won. 我們都贏了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2241033 (CK) & #6145390 (verdastelo9604) +We can rest. 我们可以休息。 CC-BY 2.0 (France) Attribution: tatoeba.org #3046439 (Whitney) & #3031987 (sadhen) +We know him. 我們認識他。 CC-BY 2.0 (France) Attribution: tatoeba.org #262783 (CK) & #873466 (Martha) +We like you. 我们喜欢你们。 CC-BY 2.0 (France) Attribution: tatoeba.org #6681958 (CK) & #8496239 (gumblex) +We love Tom. 我們愛湯姆。 CC-BY 2.0 (France) Attribution: tatoeba.org #2240298 (CK) & #5585227 (verdastelo9604) +We want Tom. 我们想要汤姆。 CC-BY 2.0 (France) Attribution: tatoeba.org #2011273 (CK) & #5091738 (mirrorvan) +We want one. 我們要一個。 CC-BY 2.0 (France) Attribution: tatoeba.org #2241471 (CK) & #6057679 (xjjAstrus) +What a pain! 烦死人。 CC-BY 2.0 (France) Attribution: tatoeba.org #282276 (CK) & #405412 (GlossaMatik) +What a pity! 太可惜了! CC-BY 2.0 (France) Attribution: tatoeba.org #24885 (CK) & #332578 (fucongcong) +What a pity! 可惜。 CC-BY 2.0 (France) Attribution: tatoeba.org #24885 (CK) & #402763 (GlossaMatik) +What a pity! 多遗憾啊! CC-BY 2.0 (France) Attribution: tatoeba.org #24885 (CK) & #469440 (fucongcong) +What a pity! 真是太可惜了! CC-BY 2.0 (France) Attribution: tatoeba.org #24885 (CK) & #2347835 (GlossaMatik) +What is new? 有什么新鲜事吗? CC-BY 2.0 (France) Attribution: tatoeba.org #376063 (megamanenm) & #794256 (fucongcong) +What's love? 愛是什麼? CC-BY 2.0 (France) Attribution: tatoeba.org #9359671 (shekitten) & #904854 (Martha) +What's that? 那是什么? CC-BY 2.0 (France) Attribution: tatoeba.org #66989 (CK) & #465906 (fucongcong) +What's this? 這是什麼啊? CC-BY 2.0 (France) Attribution: tatoeba.org #413821 (CK) & #4 (Martha) +What's this? 這是什麼? CC-BY 2.0 (France) Attribution: tatoeba.org #413821 (CK) & #734981 (Martha) +Where's Tom? 汤姆在哪儿? CC-BY 2.0 (France) Attribution: tatoeba.org #1886594 (CK) & #4956715 (musclegirlxyp) +Who are you? 你是谁? CC-BY 2.0 (France) Attribution: tatoeba.org #356200 (yorickvidal) & #395853 (GlossaMatik) +Who are you? 你是誰? CC-BY 2.0 (France) Attribution: tatoeba.org #356200 (yorickvidal) & #818109 (Martha) +Who drew it? 誰畫的? CC-BY 2.0 (France) Attribution: tatoeba.org #442064 (CK) & #819363 (Martha) +Who is next? 下一个是谁? CC-BY 2.0 (France) Attribution: tatoeba.org #801609 (Eldad) & #7768204 (jiangche) +Who is that? 那是谁? CC-BY 2.0 (France) Attribution: tatoeba.org #2176388 (dafp) & #4789686 (400S) +Who is that? 这是谁啊? CC-BY 2.0 (France) Attribution: tatoeba.org #2176388 (dafp) & #9958407 (GlossaMatik) +Who's dying? 誰要死了? CC-BY 2.0 (France) Attribution: tatoeba.org #2203655 (CK) & #8215690 (verdastelo9604) +Whose is it? 这是谁的? CC-BY 2.0 (France) Attribution: tatoeba.org #873579 (CK) & #1314463 (vicch) +Wood floats. 木头会漂浮。 CC-BY 2.0 (France) Attribution: tatoeba.org #1869662 (ghoti) & #5102316 (mirrorvan) +Work slowly. 干活慢点。 CC-BY 2.0 (France) Attribution: tatoeba.org #30124 (CK) & #5092211 (mirrorvan) +Yes, I know. 是的,我知道。 CC-BY 2.0 (France) Attribution: tatoeba.org #35504 (Scott) & #834241 (Martha) +You cheated. 你作弊了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2549802 (CK) & #10635232 (gumblex) +You made it. 你做到了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2549800 (CK) & #8215696 (verdastelo9604) +You're dumb. 你很愚蠢。 CC-BY 2.0 (France) Attribution: tatoeba.org #10519000 (Adelpa) & #993698 (leoyzy) +You're here. 你在这里。 CC-BY 2.0 (France) Attribution: tatoeba.org #2202941 (CK) & #7768155 (jiangche) +You're mine. 你是我的。 CC-BY 2.0 (France) Attribution: tatoeba.org #2217883 (CK) & #8686674 (crescat) +You're safe. 你是安全的。 CC-BY 2.0 (France) Attribution: tatoeba.org #2203311 (CK) & #10699370 (GlossaMatik) +You're sick! 你有病! CC-BY 2.0 (France) Attribution: tatoeba.org #34756 (CM) & #791591 (fucongcong) +Anything new? 有什么新鲜事吗? CC-BY 2.0 (France) Attribution: tatoeba.org #25313 (CM) & #794256 (fucongcong) +Are you busy? 你忙嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #68948 (adjusting) & #1241266 (tsayng) +Are you busy? 您在忙吗? CC-BY 2.0 (France) Attribution: tatoeba.org #68948 (adjusting) & #7772049 (jiangche) +Are you done? 你做好了嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #2244941 (CK) & #765243 (Martha) +Are you free? 你有空吗? CC-BY 2.0 (France) Attribution: tatoeba.org #434238 (lukaszpp) & #10275184 (miaojiandao) +Are you lost? 您迷路了吗? CC-BY 2.0 (France) Attribution: tatoeba.org #280393 (CK) & #465006 (fucongcong) +Are you lost? 你迷路了吗? CC-BY 2.0 (France) Attribution: tatoeba.org #280393 (CK) & #465008 (fucongcong) +Are you nuts? 你不要命啦! CC-BY 2.0 (France) Attribution: tatoeba.org #2244957 (CK) & #1766125 (sadhen) +Are you okay? 你没事吧? CC-BY 2.0 (France) Attribution: tatoeba.org #2281516 (ichivivi20) & #10981515 (Elaineeeeee) +Are you sure? 你确定吗? CC-BY 2.0 (France) Attribution: tatoeba.org #1326 (brauliobezerra) & #343645 (fucongcong) +Are you sure? 你确定? CC-BY 2.0 (France) Attribution: tatoeba.org #1326 (brauliobezerra) & #4208543 (Ethan_lin) +Be realistic! 现实点! CC-BY 2.0 (France) Attribution: tatoeba.org #1063982 (CK) & #5092420 (mirrorvan) +Be realistic. 现实点! CC-BY 2.0 (France) Attribution: tatoeba.org #3821244 (CK) & #5092420 (mirrorvan) +Bring him in. 带他进来。 CC-BY 2.0 (France) Attribution: tatoeba.org #307895 (CK) & #794243 (fucongcong) +Call Tom now. 现在给汤姆打电话。 CC-BY 2.0 (France) Attribution: tatoeba.org #3821963 (CK) & #5685926 (verdastelo9604) +Can we do it? 我們能做到嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #2549796 (CK) & #5865511 (verdastelo9604) +Can you come? 你能來嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #38302 (CK) & #832793 (Martha) +Can you read? 你能閱讀嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #5195302 (CK) & #5544841 (egg0073) +Can you sing? 您会唱歌吗? CC-BY 2.0 (France) Attribution: tatoeba.org #6358649 (CK) & #10696069 (GlossaMatik) +Can you swim? 你會游泳嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #16300 (CK) & #771557 (Martha) +Can you swim? 你能游泳嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #16300 (CK) & #5919528 (xjjAstrus) +Can you walk? 你能走嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #1453950 (Spamster) & #3713825 (egg0073) +Can you walk? 你們能走嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #1453950 (Spamster) & #3713827 (egg0073) +Come with me. 跟我走。 CC-BY 2.0 (France) Attribution: tatoeba.org #434458 (lukaszpp) & #10699375 (GlossaMatik) +Come with us. 和我们一起来吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #433696 (CK) & #345794 (fucongcong) +Did you call? 你打過電話了嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #433689 (CK) & #824517 (Martha) +Do you smoke? 你吸烟吗? CC-BY 2.0 (France) Attribution: tatoeba.org #506948 (blay_paul) & #406354 (fucongcong) +Do you smoke? 你抽不抽烟? CC-BY 2.0 (France) Attribution: tatoeba.org #506948 (blay_paul) & #427174 (GlossaMatik) +Do you smoke? 您吸烟吗? CC-BY 2.0 (France) Attribution: tatoeba.org #506948 (blay_paul) & #7767753 (jiangche) +Do your best. 盡力而為。 CC-BY 2.0 (France) Attribution: tatoeba.org #34011 (CK) & #904876 (Martha) +Don't be sad. 别伤心。 CC-BY 2.0 (France) Attribution: tatoeba.org #317756 (CK) & #7771891 (jiangche) +Don't be shy. 不要害羞。 CC-BY 2.0 (France) Attribution: tatoeba.org #390924 (Scott) & #823013 (Martha) +Don't bother. 不用麻烦了。 CC-BY 2.0 (France) Attribution: tatoeba.org #707182 (CK) & #707183 (Yashanti) +Don't bug me. 别来烦我。 CC-BY 2.0 (France) Attribution: tatoeba.org #1505979 (weihaiping) & #1505477 (fenfang557) +Don't ramble. 不要东拉西扯。 CC-BY 2.0 (France) Attribution: tatoeba.org #474584 (CM) & #474583 (GlossaMatik) +Drive safely. 安全地駕駛。 CC-BY 2.0 (France) Attribution: tatoeba.org #484648 (blay_paul) & #819285 (Martha) +Drive slowly. 开车慢点。 CC-BY 2.0 (France) Attribution: tatoeba.org #30126 (CK) & #5092212 (mirrorvan) +Examine this. 调查下这个。 CC-BY 2.0 (France) Attribution: tatoeba.org #2111839 (CK) & #8696304 (crescat) +Ghosts exist. 鬼魂是存在的。 CC-BY 2.0 (France) Attribution: tatoeba.org #324442 (CM) & #5102207 (mirrorvan) +Give it back. 还回去 CC-BY 2.0 (France) Attribution: tatoeba.org #2951862 (CK) & #5975076 (zhangxr91) +Good evening. 晚上好。 CC-BY 2.0 (France) Attribution: tatoeba.org #333156 (Aurix) & #333158 (fucongcong) +Good evening. 晚上好! CC-BY 2.0 (France) Attribution: tatoeba.org #333156 (Aurix) & #6559016 (xjjAstrus) +Good morning. 早上好! CC-BY 2.0 (France) Attribution: tatoeba.org #2258234 (_undertoad) & #335381 (fucongcong) +He got angry. 他生气了。 CC-BY 2.0 (France) Attribution: tatoeba.org #507233 (CM) & #389804 (fucongcong) +He has a car. 他有辆车。 CC-BY 2.0 (France) Attribution: tatoeba.org #513545 (CK) & #493519 (biglion) +He likes tea. 他喜歡茶。 CC-BY 2.0 (France) Attribution: tatoeba.org #1098268 (cntrational) & #1436794 (egg0073) +He lost face. 他丢脸了。 CC-BY 2.0 (France) Attribution: tatoeba.org #400048 (CM) & #400049 (GlossaMatik) +He loves her. 他愛她。 CC-BY 2.0 (France) Attribution: tatoeba.org #394633 (CK) & #824559 (Martha) +He was brave. 他很勇敢。 CC-BY 2.0 (France) Attribution: tatoeba.org #476456 (CK) & #825871 (Martha) +He's out now. 他现在出去了。 CC-BY 2.0 (France) Attribution: tatoeba.org #296462 (CK) & #335030 (fucongcong) +How annoying! 真烦人。 CC-BY 2.0 (France) Attribution: tatoeba.org #1557994 (melospawn) & #5102293 (mirrorvan) +How horrible! 真糟糕! CC-BY 2.0 (France) Attribution: tatoeba.org #1864457 (kerbear407) & #5550163 (verdastelo9604) +How's school? 学校怎么样? CC-BY 2.0 (France) Attribution: tatoeba.org #1885868 (CK) & #5096478 (mirrorvan) +I admire you. 我欣赏你。 CC-BY 2.0 (France) Attribution: tatoeba.org #68937 (CK) & #472364 (fucongcong) +I almost won. 我几乎赢了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2245600 (CK) & #5617203 (verdastelo9604) +I am Chinese. 我是华人。 CC-BY 2.0 (France) Attribution: tatoeba.org #335138 (CN) & #2629584 (iMaple) +I am at home. 我在家。 CC-BY 2.0 (France) Attribution: tatoeba.org #29049 (CK) & #336238 (fucongcong) +I am at home. 我在家裡。 CC-BY 2.0 (France) Attribution: tatoeba.org #29049 (CK) & #919764 (Martha) +I am curious. 我很好奇。 CC-BY 2.0 (France) Attribution: tatoeba.org #1436 (brauliobezerra) & #335059 (fucongcong) +I ate apples. 我吃苹果了。 CC-BY 2.0 (France) Attribution: tatoeba.org #3378092 (_undertoad) & #3378091 (GlossaMatik) +I ate apples. 我吃了蘋果。 CC-BY 2.0 (France) Attribution: tatoeba.org #3378092 (_undertoad) & #8824076 (xjjAstrus) +I ate caviar. 我吃了魚子醬。 CC-BY 2.0 (France) Attribution: tatoeba.org #2413 (CK) & #917822 (Martha) +I called Tom. 我給湯姆打了電話。 CC-BY 2.0 (France) Attribution: tatoeba.org #2235710 (CK) & #6119452 (verdastelo9604) +I can't stay. 我不能留下。 CC-BY 2.0 (France) Attribution: tatoeba.org #1954912 (CK) & #9178049 (xiaohong) +I can't walk. 我不能走。 CC-BY 2.0 (France) Attribution: tatoeba.org #1955125 (CK) & #7771688 (jiangche) +I can't walk. 我走不了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1955125 (CK) & #7771689 (jiangche) +I cried, too. 我也哭了。 CC-BY 2.0 (France) Attribution: tatoeba.org #4497098 (CK) & #10199321 (slo_oth) +I don't care. 我无所谓。 CC-BY 2.0 (France) Attribution: tatoeba.org #2323 (CK) & #431470 (fucongcong) +I don't know. 我一无所知。 CC-BY 2.0 (France) Attribution: tatoeba.org #349064 (fatih) & #7772071 (jiangche) +I don't mind. 我无所谓。 CC-BY 2.0 (France) Attribution: tatoeba.org #257396 (CK) & #431470 (fucongcong) +I fear death. 我怕死。 CC-BY 2.0 (France) Attribution: tatoeba.org #8974424 (CK) & #335251 (fucongcong) +I got mugged. 我被抢劫了。 CC-BY 2.0 (France) Attribution: tatoeba.org #6667150 (CK) & #9960188 (GlossaMatik) +I got robbed. 我被抢劫了。 CC-BY 2.0 (France) Attribution: tatoeba.org #5829164 (CK) & #9960188 (GlossaMatik) +I have a car. 我有一辆车。 CC-BY 2.0 (France) Attribution: tatoeba.org #252272 (CK) & #342842 (fucongcong) +I have a cow. 我有一头母牛。 CC-BY 2.0 (France) Attribution: tatoeba.org #2777841 (CM) & #2777842 (GlossaMatik) +I have a dog. 我有一条狗。 CC-BY 2.0 (France) Attribution: tatoeba.org #378502 (CK) & #414228 (fucongcong) +I have a map. 我有一張地圖。 CC-BY 2.0 (France) Attribution: tatoeba.org #5829169 (CK) & #6148196 (verdastelo9604) +I have money. 我有钱。 CC-BY 2.0 (France) Attribution: tatoeba.org #1502828 (CK) & #3378145 (GlossaMatik) +I have to go. 我该走了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1887384 (CK) & #8881109 (Rebecca) +I like beans. 我喜欢豆子。 CC-BY 2.0 (France) Attribution: tatoeba.org #2245931 (CK) & #7767736 (jiangche) +I like candy. 我喜歡甜食。 CC-BY 2.0 (France) Attribution: tatoeba.org #2745135 (CK) & #1229026 (tsayng) +I like these. 我喜歡這些東西。 CC-BY 2.0 (France) Attribution: tatoeba.org #4500187 (CK) & #5701328 (verdastelo9604) +I love music. 我爱音乐。 CC-BY 2.0 (France) Attribution: tatoeba.org #2245965 (CK) & #4620882 (Yashanti) +I missed you. 我想你。 CC-BY 2.0 (France) Attribution: tatoeba.org #407574 (Scott) & #813490 (fucongcong) +I missed you. 我想念你。 CC-BY 2.0 (France) Attribution: tatoeba.org #407574 (Scott) & #2180625 (egg0073) +I need a cab. 我需要一輛出租車。 CC-BY 2.0 (France) Attribution: tatoeba.org #2387428 (CK) & #9179888 (xjjAstrus) +I need money. 我需要錢。 CC-BY 2.0 (France) Attribution: tatoeba.org #436861 (lukaszpp) & #1959072 (egg0073) +I see a book. 我看到一本書。 CC-BY 2.0 (France) Attribution: tatoeba.org #816077 (afeinberg) & #816724 (Martha) +I understand. 我明白了。 CC-BY 2.0 (France) Attribution: tatoeba.org #433468 (CK) & #819294 (Martha) +I understand. 我懂。 CC-BY 2.0 (France) Attribution: tatoeba.org #433468 (CK) & #10052400 (GlossaMatik) +I want a box. 我要箱子。 CC-BY 2.0 (France) Attribution: tatoeba.org #11887075 (CK) & #11989561 (corina) +I want a dog. 我想要一隻狗。 CC-BY 2.0 (France) Attribution: tatoeba.org #2748639 (CM) & #5455270 (egg0073) +I want a hug. 我想要个抱抱。 CC-BY 2.0 (France) Attribution: tatoeba.org #9999115 (DJ_Saidez) & #10006480 (GlossaMatik) +I want a map. 我想要一張地圖。 CC-BY 2.0 (France) Attribution: tatoeba.org #8086670 (CM) & #1959991 (egg0073) +I wrote that. 我寫了那些東西。 CC-BY 2.0 (France) Attribution: tatoeba.org #2247645 (CK) & #5234812 (xjjAstrus) +I'll sue you. 我要告你。 CC-BY 2.0 (France) Attribution: tatoeba.org #237678 (CK) & #825768 (Martha) +I'm a waiter. 我是跑堂。 CC-BY 2.0 (France) Attribution: tatoeba.org #5839980 (CK) & #10895462 (xjjAstrus) +I'm a waiter. 我是服务员。 CC-BY 2.0 (France) Attribution: tatoeba.org #5839980 (CK) & #10895465 (xjjAstrus) +I'm a waiter. 我是服务生。 CC-BY 2.0 (France) Attribution: tatoeba.org #5839980 (CK) & #10895466 (xjjAstrus) +I'm all ears. 我洗耳恭聽。 CC-BY 2.0 (France) Attribution: tatoeba.org #320084 (CM) & #827627 (Martha) +I'm bleeding. 我在流血。 CC-BY 2.0 (France) Attribution: tatoeba.org #2111754 (CK) & #7768262 (jiangche) +I'm diabetic. 我有糖尿病。 CC-BY 2.0 (France) Attribution: tatoeba.org #5839992 (CK) & #10699400 (GlossaMatik) +I'm famished. 我肚子饿极了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2111735 (CK) & #400030 (GlossaMatik) +I'm fine now. 已经没事了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2247991 (CK) & #5096416 (mirrorvan) +I'm free now. 我现在有空了。 CC-BY 2.0 (France) Attribution: tatoeba.org #257494 (CK) & #405717 (fucongcong) +I'm freezing. 我冻死了。 CC-BY 2.0 (France) Attribution: tatoeba.org #21140 (CK) & #10926493 (xjjAstrus) +I'm innocent. 我是清白的。 CC-BY 2.0 (France) Attribution: tatoeba.org #1563110 (CK) & #1772684 (sadhen) +I'm new here. 我是新來的。 CC-BY 2.0 (France) Attribution: tatoeba.org #1654228 (Spamster) & #6931240 (verdastelo9604) +I'm not busy. 我没在忙。 CC-BY 2.0 (France) Attribution: tatoeba.org #261730 (CK) & #7768164 (jiangche) +I'm not lazy. 我不懒。 CC-BY 2.0 (France) Attribution: tatoeba.org #3330368 (CK) & #9958214 (GlossaMatik) +I'm not sick. 我没生病。 CC-BY 2.0 (France) Attribution: tatoeba.org #2248178 (CK) & #3031836 (sadhen) +I'm not sure. 我不确定。 CC-BY 2.0 (France) Attribution: tatoeba.org #1568769 (Sharaf78) & #4764636 (ryanwoo) +I'm not well. 我身体不适。 CC-BY 2.0 (France) Attribution: tatoeba.org #1474222 (al_ex_an_der) & #1424250 (sadhen) +I'm pregnant. 我怀孕了。 CC-BY 2.0 (France) Attribution: tatoeba.org #348596 (CM) & #333464 (fucongcong) +I'm reformed. 我改过自新了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2111696 (CK) & #9959595 (GlossaMatik) +I'm so happy. 我好高興。 CC-BY 2.0 (France) Attribution: tatoeba.org #321673 (CK) & #826258 (Martha) +I'm so happy. 我太高兴了。 CC-BY 2.0 (France) Attribution: tatoeba.org #321673 (CK) & #3378044 (GlossaMatik) +I'm so tired! 我好累。 CC-BY 2.0 (France) Attribution: tatoeba.org #967876 (CM) & #785298 (Martha) +I'm so tired! 我好累啊。 CC-BY 2.0 (France) Attribution: tatoeba.org #967876 (CM) & #10019476 (GlossaMatik) +I'm so tired. 我好累。 CC-BY 2.0 (France) Attribution: tatoeba.org #785435 (hrin) & #785298 (Martha) +I'm so tired. 我好累啊。 CC-BY 2.0 (France) Attribution: tatoeba.org #785435 (hrin) & #10019476 (GlossaMatik) +I'm the best. 我是最好的。 CC-BY 2.0 (France) Attribution: tatoeba.org #755242 (sctld) & #409665 (egg0073) +I'm thrilled. 我激動不已。 CC-BY 2.0 (France) Attribution: tatoeba.org #2111678 (CK) & #6091682 (verdastelo9604) +I'm to blame. 这是我的错。 CC-BY 2.0 (France) Attribution: tatoeba.org #2057759 (CK) & #790573 (GlossaMatik) +I've decided. 我決定了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2111662 (CK) & #6114438 (verdastelo9604) +I've no idea. 我一无所知。 CC-BY 2.0 (France) Attribution: tatoeba.org #2248411 (CK) & #7772071 (jiangche) +I've seen it. 我見過。 CC-BY 2.0 (France) Attribution: tatoeba.org #254808 (Swift) & #824531 (Martha) +Ideas matter. 想法很重要。 CC-BY 2.0 (France) Attribution: tatoeba.org #8460518 (shekitten) & #8463682 (gumblex) +Is Monday OK? 周一可以吗? CC-BY 2.0 (France) Attribution: tatoeba.org #2248475 (CK) & #8765060 (crescat) +Is Tom drunk? 汤姆喝醉了吗? CC-BY 2.0 (France) Attribution: tatoeba.org #2244596 (CK) & #8696454 (morningstar) +Is Tom there? 汤姆在吗? CC-BY 2.0 (France) Attribution: tatoeba.org #1886873 (CK) & #8696442 (morningstar) +Is that love? 那是愛嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #955144 (CM) & #3957684 (egg0073) +Is that true? 真的? CC-BY 2.0 (France) Attribution: tatoeba.org #322153 (CK) & #1397360 (mtdot) +Is this tofu? 这是不是豆腐? CC-BY 2.0 (France) Attribution: tatoeba.org #3377914 (CM) & #3377913 (GlossaMatik) +It's amazing. 太神奇了。 CC-BY 2.0 (France) Attribution: tatoeba.org #52021 (CM) & #1415890 (sadhen) +It's bedtime. 睡觉时间到了。 CC-BY 2.0 (France) Attribution: tatoeba.org #498458 (adjusting) & #406727 (fucongcong) +It's obvious. 很明顯。 CC-BY 2.0 (France) Attribution: tatoeba.org #2283741 (CK) & #6585423 (verdastelo9604) +It's raining. 下雨了。 CC-BY 2.0 (France) Attribution: tatoeba.org #456237 (lukaszpp) & #346836 (fucongcong) +It's raining. 在下雨。 CC-BY 2.0 (France) Attribution: tatoeba.org #456237 (lukaszpp) & #409681 (egg0073) +It's snowing. 下雪了。 CC-BY 2.0 (France) Attribution: tatoeba.org #448963 (CK) & #780269 (Martha) +It's snowing. 正在下雪。 CC-BY 2.0 (France) Attribution: tatoeba.org #448963 (CK) & #819440 (Martha) +It's so hard. 太难了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2249260 (CK) & #5091653 (mirrorvan) +It's too big. 它太大了。 CC-BY 2.0 (France) Attribution: tatoeba.org #435409 (CK) & #824484 (Martha) +It's too hot. 太熱了。 CC-BY 2.0 (France) Attribution: tatoeba.org #267106 (CK) & #5114721 (xjjAstrus) +Keep looking. 繼續看! CC-BY 2.0 (France) Attribution: tatoeba.org #2111645 (CK) & #3982107 (tsayng) +Keep reading. 继续看。 CC-BY 2.0 (France) Attribution: tatoeba.org #1815066 (pne) & #5092572 (mirrorvan) +Keep smiling. 保持微笑。 CC-BY 2.0 (France) Attribution: tatoeba.org #2111637 (CK) & #778735 (Martha) +Keep working. 繼續工作! CC-BY 2.0 (France) Attribution: tatoeba.org #2111629 (CK) & #3982106 (tsayng) +Let Tom live. 給湯姆活路! CC-BY 2.0 (France) Attribution: tatoeba.org #2262231 (CK) & #8215729 (verdastelo9604) +Let me think. 讓我想一想。 CC-BY 2.0 (France) Attribution: tatoeba.org #2249525 (CK) & #4504253 (egg0073) +Let's go now. 我们现在去吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #477190 (CM) & #476615 (fucongcong) +Life goes on. 人生會繼續。 CC-BY 2.0 (France) Attribution: tatoeba.org #477368 (BlueLagoon) & #3982108 (tsayng) +Look closely. 仔細看 CC-BY 2.0 (France) Attribution: tatoeba.org #2111608 (CK) & #5113359 (xjjAstrus) +Mary came in. 瑪麗進來了。 CC-BY 2.0 (France) Attribution: tatoeba.org #388762 (CK) & #826109 (Martha) +Mary is tall. 瑪麗很高。 CC-BY 2.0 (France) Attribution: tatoeba.org #31892 (CK) & #824585 (Martha) +May I go now? 我现在能去了吗? CC-BY 2.0 (France) Attribution: tatoeba.org #2846104 (englishchinese) & #476637 (fucongcong) +Move quietly. 轻轻地移动。 CC-BY 2.0 (France) Attribution: tatoeba.org #890756 (Scott) & #5102260 (mirrorvan) +My eyes hurt. 我的眼睛痛。 CC-BY 2.0 (France) Attribution: tatoeba.org #417801 (CK) & #826045 (Martha) +No one knows. 沒有人知道。 CC-BY 2.0 (France) Attribution: tatoeba.org #449023 (CK) & #825148 (Martha) +No one knows. 谁也不知道。 CC-BY 2.0 (France) Attribution: tatoeba.org #449023 (CK) & #8736993 (crescat) +Nobody asked. 没人问过。 CC-BY 2.0 (France) Attribution: tatoeba.org #1737422 (Spamster) & #5092545 (mirrorvan) +Nobody knows. 谁也不知道。 CC-BY 2.0 (France) Attribution: tatoeba.org #1841593 (CK) & #8736993 (crescat) +Open the box. 打開箱子。 CC-BY 2.0 (France) Attribution: tatoeba.org #2249744 (CK) & #6293087 (verdastelo9604) +Please hurry. 请抓紧时间。 CC-BY 2.0 (France) Attribution: tatoeba.org #19733 (Swift) & #5092158 (mirrorvan) +Please leave. 請你離開。 CC-BY 2.0 (France) Attribution: tatoeba.org #516403 (CK) & #819382 (Martha) +Please smile. 请笑一笑! CC-BY 2.0 (France) Attribution: tatoeba.org #1852296 (CK) & #10617861 (han637376) +See you soon! 一会儿见! CC-BY 2.0 (France) Attribution: tatoeba.org #32672 (CK) & #337874 (fucongcong) +See you soon! 一會兒見! CC-BY 2.0 (France) Attribution: tatoeba.org #32672 (CK) & #6559028 (xjjAstrus) +See you then. 到時候見。 CC-BY 2.0 (France) Attribution: tatoeba.org #47013 (CK) & #824671 (Martha) +Shame on you! 你真丢脸! CC-BY 2.0 (France) Attribution: tatoeba.org #277287 (CK) & #791631 (fucongcong) +Shame on you. 你真丢脸! CC-BY 2.0 (France) Attribution: tatoeba.org #2649236 (CK) & #791631 (fucongcong) +She is quiet. 她很安静。 CC-BY 2.0 (France) Attribution: tatoeba.org #315385 (CK) & #6307284 (gumblex) +She is upset. 她心情不好。 CC-BY 2.0 (France) Attribution: tatoeba.org #979271 (Serhiy) & #843498 (fucongcong) +She knows me. 她认识我。 CC-BY 2.0 (France) Attribution: tatoeba.org #314454 (CK) & #4970146 (wzhd) +She may come. 她可以來。 CC-BY 2.0 (France) Attribution: tatoeba.org #388731 (CK) & #826110 (Martha) +She may come. 她也許來。 CC-BY 2.0 (France) Attribution: tatoeba.org #388731 (CK) & #826112 (Martha) +Someone came. 有人来了。 CC-BY 2.0 (France) Attribution: tatoeba.org #908398 (CK) & #5092398 (mirrorvan) +Speak softly. 你说话小点声。 CC-BY 2.0 (France) Attribution: tatoeba.org #2800093 (CK) & #7767745 (jiangche) +Stay with us. 和我们留在一起吧! CC-BY 2.0 (France) Attribution: tatoeba.org #660408 (CM) & #7768128 (jiangche) +Stop gawking. 别再傻看着。 CC-BY 2.0 (France) Attribution: tatoeba.org #693620 (CM) & #5102246 (mirrorvan) +Stop reading. 别再念了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1738962 (CK) & #5092552 (mirrorvan) +Stop staring. 别再盯着了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1943890 (Spamster) & #5092672 (mirrorvan) +Stop talking. 不要说话了。 CC-BY 2.0 (France) Attribution: tatoeba.org #277720 (CK) & #5092251 (mirrorvan) +Stop whining. 别再埋怨了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2029950 (Spamster) & #5102375 (mirrorvan) +Stop yelling! 别再喊叫了! CC-BY 2.0 (France) Attribution: tatoeba.org #1908512 (Spamster) & #5092620 (mirrorvan) +Sweet dreams! 祝你好梦。 CC-BY 2.0 (France) Attribution: tatoeba.org #30054 (CK) & #3781063 (Debbie_Linder) +Take it easy. 放輕鬆。 CC-BY 2.0 (France) Attribution: tatoeba.org #20344 (CK) & #825917 (Martha) +Take it easy. 別緊張。 CC-BY 2.0 (France) Attribution: tatoeba.org #20344 (CK) & #825918 (Martha) +Take me home. 带我回家。 CC-BY 2.0 (France) Attribution: tatoeba.org #462494 (lukaszpp) & #465919 (fucongcong) +Tell us more. 告訴我們多一點。 CC-BY 2.0 (France) Attribution: tatoeba.org #1224954 (CK) & #4754633 (egg0073) +That is mine. 那是我的。 CC-BY 2.0 (France) Attribution: tatoeba.org #67126 (CK) & #6728904 (verdastelo9604) +That's crazy. 那是瘋狂的。 CC-BY 2.0 (France) Attribution: tatoeba.org #509156 (CK) & #826184 (Martha) +That's great. 那真是太好了。 CC-BY 2.0 (France) Attribution: tatoeba.org #462546 (lukaszpp) & #5978354 (verdastelo9604) +That's right! 對了! CC-BY 2.0 (France) Attribution: tatoeba.org #433490 (CK) & #8215699 (verdastelo9604) +That's right. 对! CC-BY 2.0 (France) Attribution: tatoeba.org #1216015 (AlanRominger) & #4952918 (murr) +That's weird. 奇怪。 CC-BY 2.0 (France) Attribution: tatoeba.org #320329 (CK) & #917754 (GlossaMatik) +That's wrong. 不对。 CC-BY 2.0 (France) Attribution: tatoeba.org #2111384 (CK) & #10961087 (xjjAstrus) +They refused. 他們拒絕了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2111364 (CK) & #6073881 (verdastelo9604) +They're fake. 它们是假的。 CC-BY 2.0 (France) Attribution: tatoeba.org #2111296 (CK) & #7769298 (jiangche) +They're gone. 他们离开了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1898125 (CK) & #8696255 (crescat) +They're kids. 他们是孩子。 CC-BY 2.0 (France) Attribution: tatoeba.org #2111267 (CK) & #3579720 (CLARET) +They're kids. 她们是孩子。 CC-BY 2.0 (France) Attribution: tatoeba.org #2111267 (CK) & #3579729 (CLARET) +This is mine. 这是我的。 CC-BY 2.0 (France) Attribution: tatoeba.org #2233709 (CK) & #4760167 (ryanwoo) +This is neat. 这很棒。 CC-BY 2.0 (France) Attribution: tatoeba.org #7371380 (Hybrid) & #10021182 (GlossaMatik) +This is tofu. 这是豆腐。 CC-BY 2.0 (France) Attribution: tatoeba.org #3377900 (CM) & #3377899 (GlossaMatik) +This is true. 這是真的。 CC-BY 2.0 (France) Attribution: tatoeba.org #433544 (CK) & #771357 (Martha) +Tom can walk. 汤姆能走路。 CC-BY 2.0 (France) Attribution: tatoeba.org #2236150 (CK) & #10260810 (GlossaMatik) +Tom followed. 汤姆跟着。 CC-BY 2.0 (France) Attribution: tatoeba.org #3721793 (CM) & #5869907 (verdastelo9604) +Tom is blind. 汤姆瞎了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1536837 (Spamster) & #9971592 (GlossaMatik) +Tom is clean. 湯姆是乾净的。 CC-BY 2.0 (France) Attribution: tatoeba.org #2202652 (CK) & #6923176 (verdastelo9604) +Tom is drunk. 汤姆醉了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2236670 (CK) & #5142201 (musclegirlxyp) +Tom is happy. 湯姆高興。 CC-BY 2.0 (France) Attribution: tatoeba.org #1025016 (CK) & #6624675 (verdastelo9604) +Tom is smart. 汤姆脑子好使。 CC-BY 2.0 (France) Attribution: tatoeba.org #1024870 (CK) & #5072415 (musclegirlxyp) +Tom is tired. 湯姆累了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2203461 (CK) & #6098473 (verdastelo9604) +Tom just ate. 汤姆刚吃完饭。 CC-BY 2.0 (France) Attribution: tatoeba.org #6358749 (CK) & #11698444 (Jokubas) +Tom knows me. Tom認識我。 CC-BY 2.0 (France) Attribution: tatoeba.org #2237133 (CK) & #3957663 (egg0073) +Tom sat down. 汤姆坐下了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2237642 (CK) & #4977379 (musclegirlxyp) +Tom told him. 汤姆告诉了他。 CC-BY 2.0 (France) Attribution: tatoeba.org #2238815 (CK) & #5576791 (verdastelo9604) +Tom vanished. 汤姆不见了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2203879 (CK) & #5092425 (mirrorvan) +Tom was full. 汤姆饱了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2549746 (CK) & #5780567 (verdastelo9604) +Tom's lonely. 汤姆很孤独。 CC-BY 2.0 (France) Attribution: tatoeba.org #2107562 (CK) & #7781773 (jiangche) +Tom's thirty. 汤姆今年三十岁。 CC-BY 2.0 (France) Attribution: tatoeba.org #2107623 (CK) & #8738755 (crescat) +Tom, wake up. 汤姆,快起来! CC-BY 2.0 (France) Attribution: tatoeba.org #2429769 (CK) & #2431750 (fenfang557) +Try it again. 再試一次。 CC-BY 2.0 (France) Attribution: tatoeba.org #433594 (CK) & #824621 (Martha) +Try it again. 再试一下。 CC-BY 2.0 (France) Attribution: tatoeba.org #433594 (CK) & #8496264 (maxine) +Unbelievable! 難以置信! CC-BY 2.0 (France) Attribution: tatoeba.org #268828 (CM) & #1423421 (cienias) +Unbelievable! 难以置信! CC-BY 2.0 (France) Attribution: tatoeba.org #268828 (CM) & #4505070 (dongwang) +Vote for Tom. 投票給湯姆。 CC-BY 2.0 (France) Attribution: tatoeba.org #2240284 (CK) & #6101261 (verdastelo9604) +Wait and see. 走著瞧 CC-BY 2.0 (France) Attribution: tatoeba.org #945292 (nibuen) & #6915645 (zzztat) +We are happy. 我們很快樂。 CC-BY 2.0 (France) Attribution: tatoeba.org #438940 (CK) & #908550 (Martha) +We can begin. 我們能開始。 CC-BY 2.0 (France) Attribution: tatoeba.org #2241034 (CK) & #6145407 (verdastelo9604) +We know that. 我们知道。 CC-BY 2.0 (France) Attribution: tatoeba.org #2241138 (CK) & #5102291 (mirrorvan) +We know this. 我们知道。 CC-BY 2.0 (France) Attribution: tatoeba.org #2241139 (CK) & #5102291 (mirrorvan) +We need more. 我們需要更多。 CC-BY 2.0 (France) Attribution: tatoeba.org #874919 (CK) & #4754631 (egg0073) +We overslept. 我们睡过头了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2107667 (CK) & #3399432 (GlossaMatik) +We succeeded. 我们成功了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1841559 (CK) & #5102311 (mirrorvan) +We surrender. 我們投降。 CC-BY 2.0 (France) Attribution: tatoeba.org #2246291 (Hybrid) & #6064608 (verdastelo9604) +We're adults. 我们已是成年人了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2107331 (CK) & #7772576 (jiangche) +We're heroes. 我們是英雄。 CC-BY 2.0 (France) Attribution: tatoeba.org #8918365 (CK) & #9155254 (shou) +We're hiding. 我们在藏着。 CC-BY 2.0 (France) Attribution: tatoeba.org #2203697 (CK) & #5640754 (verdastelo9604) +We're humans. 我们是人。 CC-BY 2.0 (France) Attribution: tatoeba.org #9494304 (DJ_Saidez) & #335262 (fucongcong) +We're people. 我们是人。 CC-BY 2.0 (France) Attribution: tatoeba.org #9494600 (DJ_Saidez) & #335262 (fucongcong) +Welcome back. 欢迎回来。 CC-BY 2.0 (France) Attribution: tatoeba.org #1627336 (Spamster) & #5092518 (mirrorvan) +Welcome home. 欢迎回家。 CC-BY 2.0 (France) Attribution: tatoeba.org #64693 (Scott) & #333068 (fucongcong) +What is love? 愛是什麼? CC-BY 2.0 (France) Attribution: tatoeba.org #515085 (tamsanh) & #904854 (Martha) +What is that? 那是什么? CC-BY 2.0 (France) Attribution: tatoeba.org #464592 (lukaszpp) & #465906 (fucongcong) +What is that? 那是什么啊? CC-BY 2.0 (France) Attribution: tatoeba.org #464592 (lukaszpp) & #1420649 (sadhen) +What is this? 這是什麼啊? CC-BY 2.0 (France) Attribution: tatoeba.org #392210 (sysko) & #4 (Martha) +What is this? 這是什麼? CC-BY 2.0 (France) Attribution: tatoeba.org #392210 (sysko) & #734981 (Martha) +Where is Tom? 汤姆在哪儿? CC-BY 2.0 (France) Attribution: tatoeba.org #2240332 (CK) & #4956715 (musclegirlxyp) +Who built it? 这是谁建的? CC-BY 2.0 (France) Attribution: tatoeba.org #276317 (CK) & #334743 (fucongcong) +Who wants it? 谁想要它? CC-BY 2.0 (France) Attribution: tatoeba.org #2011277 (CK) & #10182737 (slo_oth) +Who was here? 谁来了这里? CC-BY 2.0 (France) Attribution: tatoeba.org #2254890 (CK) & #6047439 (verdastelo9604) +Years passed. 多少年过去了。 CC-BY 2.0 (France) Attribution: tatoeba.org #282197 (CK) & #5092260 (mirrorvan) +You are good. 你很好。 CC-BY 2.0 (France) Attribution: tatoeba.org #1120755 (cntrational) & #4881733 (musclegirlxyp) +You're drunk. 你喝醉了! CC-BY 2.0 (France) Attribution: tatoeba.org #1895619 (CK) & #7768302 (jiangche) +You're lying. 你在撒谎。 CC-BY 2.0 (France) Attribution: tatoeba.org #1358271 (CK) & #332572 (fucongcong) +You're sharp. 你很聰明。 CC-BY 2.0 (France) Attribution: tatoeba.org #2203340 (CK) & #778737 (Martha) +You're smart. 你很聰明。 CC-BY 2.0 (France) Attribution: tatoeba.org #2203371 (CK) & #778737 (Martha) +Anything else? 还有别的吗? CC-BY 2.0 (France) Attribution: tatoeba.org #434224 (lukaszpp) & #5102215 (mirrorvan) +Are they cute? 他們可愛嗎 ? CC-BY 2.0 (France) Attribution: tatoeba.org #2244915 (CK) & #11940010 (corina) +Are you angry? 您生气了吗? CC-BY 2.0 (France) Attribution: tatoeba.org #476326 (Hybrid) & #476597 (fucongcong) +Are you angry? 你生气了吗? CC-BY 2.0 (France) Attribution: tatoeba.org #476326 (Hybrid) & #476598 (fucongcong) +Are you happy? 你快樂嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #16164 (CK) & #819454 (Martha) +Are you happy? 你开心吗? CC-BY 2.0 (France) Attribution: tatoeba.org #16164 (CK) & #8924804 (crescat) +Are you ready? 您准备好了吗? CC-BY 2.0 (France) Attribution: tatoeba.org #376424 (saeb) & #799300 (fucongcong) +Are you ready? 你们准备好了吗? CC-BY 2.0 (France) Attribution: tatoeba.org #376424 (saeb) & #799301 (fucongcong) +Are you ready? 你准备好了吗? CC-BY 2.0 (France) Attribution: tatoeba.org #376424 (saeb) & #799302 (fucongcong) +Are you there? 你在吗? CC-BY 2.0 (France) Attribution: tatoeba.org #30970 (CK) & #479053 (GlossaMatik) +Are you tired? 你累了嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #317830 (CK) & #727916 (Martha) +Are you tired? 你覺得累嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #317830 (CK) & #3742432 (egg0073) +Ask Tom again. 再问一下汤姆吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #2235643 (CK) & #8700793 (crescat) +Bring the key. 帶鑰匙來。 CC-BY 2.0 (France) Attribution: tatoeba.org #507763 (CM) & #6086840 (verdastelo9604) +Call security! 叫保安来! CC-BY 2.0 (France) Attribution: tatoeba.org #1682859 (Spamster) & #5092526 (mirrorvan) +Can I have it? 可以给我吗? CC-BY 2.0 (France) Attribution: tatoeba.org #3172313 (CK) & #8725787 (crescat) +Can you drive? 您会开车吗? CC-BY 2.0 (France) Attribution: tatoeba.org #69237 (CK) & #472411 (fucongcong) +Can you skate? 你会溜冰吗? CC-BY 2.0 (France) Attribution: tatoeba.org #70016 (CK) & #332557 (fucongcong) +Cats are cute. 猫咪很可爱。 CC-BY 2.0 (France) Attribution: tatoeba.org #5649044 (Hybrid) & #10981526 (Elaineeeeee) +Check, please. 請結帳。 CC-BY 2.0 (France) Attribution: tatoeba.org #21098 (CK) & #819284 (Martha) +Did Tom reply? 汤姆有回应了吗? CC-BY 2.0 (France) Attribution: tatoeba.org #3395387 (CK) & #4885087 (musclegirlxyp) +Did you write? 你写吗? CC-BY 2.0 (France) Attribution: tatoeba.org #8108705 (haukie) & #6850332 (mao) +Do I know you? 我认识你吗? CC-BY 2.0 (France) Attribution: tatoeba.org #1461944 (Spamster) & #1790170 (sadhen) +Do you follow? 懂了吗? CC-BY 2.0 (France) Attribution: tatoeba.org #319999 (CK) & #2032276 (ydcok) +Do you get it? 懂么? CC-BY 2.0 (France) Attribution: tatoeba.org #1538886 (CK) & #2367531 (GlossaMatik) +Don't be rude. 不要失礼。 CC-BY 2.0 (France) Attribution: tatoeba.org #1860512 (CK) & #9963168 (GlossaMatik) +Don't give up! 不要放棄! CC-BY 2.0 (France) Attribution: tatoeba.org #278606 (CK) & #785373 (Martha) +Don't hate me. 不要恨我。 CC-BY 2.0 (France) Attribution: tatoeba.org #2245350 (CK) & #767118 (Martha) +Don't mind me. 不要管我。 CC-BY 2.0 (France) Attribution: tatoeba.org #249787 (CK) & #405821 (GlossaMatik) +Don't tell me. 不要告诉我。 CC-BY 2.0 (France) Attribution: tatoeba.org #239720 (CK) & #9968947 (GlossaMatik) +Draw a circle. 画一个圈。 CC-BY 2.0 (France) Attribution: tatoeba.org #25954 (CK) & #630268 (CLARET) +Eat and drink. 吃吧,喝吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #37659 (CM) & #4760009 (ryanwoo) +Flowers bloom. 鮮花盛開。 CC-BY 2.0 (France) Attribution: tatoeba.org #23749 (CK) & #819286 (Martha) +Hang in there. 坚持。 CC-BY 2.0 (France) Attribution: tatoeba.org #2173924 (Hybrid) & #5092492 (mirrorvan) +He dug a hole. 他挖了一个洞。 CC-BY 2.0 (France) Attribution: tatoeba.org #295871 (CK) & #414486 (fucongcong) +He has a cold. 他着凉了。 CC-BY 2.0 (France) Attribution: tatoeba.org #289527 (CK) & #334129 (fucongcong) +He is a thief. 这是一个小偷。 CC-BY 2.0 (France) Attribution: tatoeba.org #301724 (Dorenda) & #630270 (CLARET) +He is at home. 他在家裡。 CC-BY 2.0 (France) Attribution: tatoeba.org #816868 (Cindrogriza) & #816870 (Martha) +He is my type! 他是我的菜! CC-BY 2.0 (France) Attribution: tatoeba.org #284379 (CK) & #817282 (fucongcong) +He is no fool. 他不是傻子。 CC-BY 2.0 (France) Attribution: tatoeba.org #302396 (CM) & #429141 (fucongcong) +He is out now. 他现在出去了。 CC-BY 2.0 (France) Attribution: tatoeba.org #289262 (CK) & #335030 (fucongcong) +He lied to me. 他对我撒谎。 CC-BY 2.0 (France) Attribution: tatoeba.org #297564 (CK) & #9973007 (GlossaMatik) +He lied to us. 他欺騙了我們。 CC-BY 2.0 (France) Attribution: tatoeba.org #388832 (CK) & #826013 (Martha) +He sells cars. 他賣車子。 CC-BY 2.0 (France) Attribution: tatoeba.org #434996 (lukaszpp) & #778540 (Martha) +He shot at me. 他槍擊了我。 CC-BY 2.0 (France) Attribution: tatoeba.org #71962 (CK) & #793302 (Martha) +He tries hard. 他努力地嘗試。 CC-BY 2.0 (France) Attribution: tatoeba.org #293742 (CK) & #882979 (Martha) +He walks fast. 他走路很快。 CC-BY 2.0 (France) Attribution: tatoeba.org #1257313 (CK) & #8888278 (crescat) +He wants more. 他想要更多。 CC-BY 2.0 (France) Attribution: tatoeba.org #1723957 (Spamster) & #4754634 (egg0073) +He's American. 他是美国人。 CC-BY 2.0 (France) Attribution: tatoeba.org #5226614 (jaxhere) & #332941 (fucongcong) +He's not home. 他不在家。 CC-BY 2.0 (France) Attribution: tatoeba.org #1310853 (donkirkby) & #765282 (Martha) +He's studying. 他在讀書。 CC-BY 2.0 (France) Attribution: tatoeba.org #593281 (CK) & #3713556 (egg0073) +Hi, everybody. 大家好! CC-BY 2.0 (France) Attribution: tatoeba.org #3924471 (BHO) & #466655 (GlossaMatik) +How about you? 你怎麼樣? CC-BY 2.0 (France) Attribution: tatoeba.org #16491 (CK) & #825882 (Martha) +How about you? 那你呢? CC-BY 2.0 (France) Attribution: tatoeba.org #16491 (CK) & #825883 (Martha) +How about you? 你們呢? CC-BY 2.0 (France) Attribution: tatoeba.org #16491 (CK) & #1623187 (egg0073) +How about you? 您呢? CC-BY 2.0 (France) Attribution: tatoeba.org #16491 (CK) & #1623188 (Yashanti) +How beautiful! 多美啊! CC-BY 2.0 (France) Attribution: tatoeba.org #1913083 (CK) & #5092623 (mirrorvan) +I am diabetic. 我有糖尿病。 CC-BY 2.0 (France) Attribution: tatoeba.org #436327 (lukaszpp) & #10699400 (GlossaMatik) +I am divorced. 我离婚了。 CC-BY 2.0 (France) Attribution: tatoeba.org #436329 (lukaszpp) & #471133 (fucongcong) +I am sneezing. 我打喷嚏了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1661181 (Amastan) & #9970071 (GlossaMatik) +I am very sad. 我很难过。 CC-BY 2.0 (France) Attribution: tatoeba.org #1136927 (soj4l) & #333736 (fucongcong) +I approved it. 我同意。 CC-BY 2.0 (France) Attribution: tatoeba.org #5840527 (CK) & #333224 (fucongcong) +I believe you. 我相信你。 CC-BY 2.0 (France) Attribution: tatoeba.org #17421 (CK) & #335418 (fucongcong) +I came by car. 我开车来的。 CC-BY 2.0 (France) Attribution: tatoeba.org #5829211 (CK) & #10230465 (GlossaMatik) +I can feel it. 我感觉得到它。 CC-BY 2.0 (France) Attribution: tatoeba.org #1841705 (CK) & #10699360 (GlossaMatik) +I can hear it. 我听得到。 CC-BY 2.0 (France) Attribution: tatoeba.org #6358574 (CK) & #8727966 (crescat) +I can see Tom. 我看得见汤姆。 CC-BY 2.0 (France) Attribution: tatoeba.org #2301319 (CK) & #4977389 (musclegirlxyp) +I can't do it. 我無法做到這一點。 CC-BY 2.0 (France) Attribution: tatoeba.org #25544 (CK) & #793250 (Martha) +I can't do it. 我做不到。 CC-BY 2.0 (France) Attribution: tatoeba.org #25544 (CK) & #7768005 (jiangche) +I can't leave. 我不能走。 CC-BY 2.0 (France) Attribution: tatoeba.org #2245649 (CK) & #7771688 (jiangche) +I can't leave. 我走不了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2245649 (CK) & #7771689 (jiangche) +I despise you. 我鄙视你。 CC-BY 2.0 (France) Attribution: tatoeba.org #2245678 (CK) & #5067373 (jiaweikai) +I did my best. 我做得好到不能再好了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1075109 (shanghainese) & #335046 (fucongcong) +I didn't pass. 我没通过。 CC-BY 2.0 (France) Attribution: tatoeba.org #5840503 (CK) & #5931757 (verdastelo9604) +I didn't sing. 我沒唱。 CC-BY 2.0 (France) Attribution: tatoeba.org #2315009 (CK) & #10040357 (verdastelo9604) +I don't smoke. 我不抽烟。 CC-BY 2.0 (France) Attribution: tatoeba.org #40662 (CK) & #398950 (GlossaMatik) +I fed the dog. 我餵過狗了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1988362 (CK) & #727575 (Martha) +I feel lonely. 我觉得很孤独。 CC-BY 2.0 (France) Attribution: tatoeba.org #1487874 (sugoi) & #334544 (fucongcong) +I feel unwell. 我感觉不舒服。 CC-BY 2.0 (France) Attribution: tatoeba.org #1605758 (fanty) & #501698 (fucongcong) +I felt lonely. 我觉得很孤独。 CC-BY 2.0 (France) Attribution: tatoeba.org #257310 (CK) & #334544 (fucongcong) +I got it free. 我是免費得到的。 CC-BY 2.0 (France) Attribution: tatoeba.org #42714 (CM) & #886567 (Martha) +I hate French. 我讨厌法语。 CC-BY 2.0 (France) Attribution: tatoeba.org #2451690 (CK) & #10204580 (GlossaMatik) +I hate winter. 我恨冬天。 CC-BY 2.0 (France) Attribution: tatoeba.org #2516436 (CK) & #10260800 (GlossaMatik) +I hate winter. 我讨厌冬天。 CC-BY 2.0 (France) Attribution: tatoeba.org #2516436 (CK) & #10260801 (GlossaMatik) +I have a bike. 我有一輛自行車。 CC-BY 2.0 (France) Attribution: tatoeba.org #5829218 (CK) & #5112366 (xjjAstrus) +I have a boat. 我有一艘小船。 CC-BY 2.0 (France) Attribution: tatoeba.org #5829220 (CK) & #9179805 (xjjAstrus) +I have a cold. 我感冒了。 CC-BY 2.0 (France) Attribution: tatoeba.org #321954 (CK) & #488753 (GlossaMatik) +I have a home. 我有一个家。 CC-BY 2.0 (France) Attribution: tatoeba.org #1786134 (gleki) & #1786136 (sadhen) +I have an egg. 我有一只蛋。 CC-BY 2.0 (France) Attribution: tatoeba.org #262179 (CK) & #791582 (fucongcong) +I have asthma. 我有哮喘。 CC-BY 2.0 (France) Attribution: tatoeba.org #5829223 (CK) & #10699398 (GlossaMatik) +I have cancer. 我有癌症。 CC-BY 2.0 (France) Attribution: tatoeba.org #2245875 (CK) & #10699402 (GlossaMatik) +I have to win. 我必须赢。 CC-BY 2.0 (France) Attribution: tatoeba.org #1744787 (Amastan) & #5780576 (verdastelo9604) +I just got up. 我刚才起床了。 CC-BY 2.0 (France) Attribution: tatoeba.org #398493 (CM) & #398497 (GlossaMatik) +I like soccer. 我喜歡足球。 CC-BY 2.0 (France) Attribution: tatoeba.org #5840429 (CK) & #5568572 (egg0073) +I like sports. 我喜歡運動。 CC-BY 2.0 (France) Attribution: tatoeba.org #435162 (CK) & #771412 (Martha) +I like to eat. 我喜歡吃。 CC-BY 2.0 (France) Attribution: tatoeba.org #773320 (marloncori) & #1225693 (tsayng) +I like to run. 我喜欢跑步。 CC-BY 2.0 (France) Attribution: tatoeba.org #259193 (CK) & #363979 (fucongcong) +I lost my key. 我钥匙丢了。 CC-BY 2.0 (France) Attribution: tatoeba.org #460058 (saasmath) & #9970755 (GlossaMatik) +I love French. 我爱法语。 CC-BY 2.0 (France) Attribution: tatoeba.org #2451688 (CK) & #10696118 (GlossaMatik) +I love coffee. 我愛咖啡。 CC-BY 2.0 (France) Attribution: tatoeba.org #916292 (CK) & #6105239 (verdastelo9604) +I love movies. 我愛電影。 CC-BY 2.0 (France) Attribution: tatoeba.org #521657 (CK) & #824560 (Martha) +I love nature. 我愛大自然。 CC-BY 2.0 (France) Attribution: tatoeba.org #769668 (Zifre) & #769662 (Martha) +I love sports. 我喜歡運動。 CC-BY 2.0 (France) Attribution: tatoeba.org #930030 (CM) & #771412 (Martha) +I miss Boston. 我想念波士頓。 CC-BY 2.0 (France) Attribution: tatoeba.org #2387234 (CK) & #5548480 (egg0073) +I must go now. 我現在必須走了。 CC-BY 2.0 (France) Attribution: tatoeba.org #486448 (CK) & #826159 (Martha) +I need a taxi. 我需要一輛出租車。 CC-BY 2.0 (France) Attribution: tatoeba.org #5840395 (CK) & #9179888 (xjjAstrus) +I need advice. 我需要些建议。 CC-BY 2.0 (France) Attribution: tatoeba.org #2245998 (CK) & #7774791 (jiangche) +I need to try. 我需要尝试。 CC-BY 2.0 (France) Attribution: tatoeba.org #2387771 (CK) & #5983608 (verdastelo9604) +I respect Tom. 我尊敬湯姆。 CC-BY 2.0 (France) Attribution: tatoeba.org #2235733 (CK) & #6333802 (verdastelo9604) +I saw nothing. 我什麼都沒看見。 CC-BY 2.0 (France) Attribution: tatoeba.org #256395 (CK) & #765346 (Martha) +I should obey. 我應該服從。 CC-BY 2.0 (France) Attribution: tatoeba.org #7830346 (sharris123) & #5500531 (egg0073) +I think I can. 我想我可以。 CC-BY 2.0 (France) Attribution: tatoeba.org #433759 (CK) & #819370 (Martha) +I use Firefox. 我使用火狐浏览器。 CC-BY 2.0 (France) Attribution: tatoeba.org #430893 (CK) & #1783888 (sadhen) +I use Firefox. 我使用火狐。 CC-BY 2.0 (France) Attribution: tatoeba.org #430893 (CK) & #1783889 (sadhen) +I use Twitter. 我用Twitter。 CC-BY 2.0 (France) Attribution: tatoeba.org #1279106 (donkirkby) & #474921 (egg0073) +I want a boat. 我想要一艘船。 CC-BY 2.0 (France) Attribution: tatoeba.org #3210440 (chris3spice) & #8696251 (crescat) +I want a book. 我想要本书。 CC-BY 2.0 (France) Attribution: tatoeba.org #261737 (CK) & #3376538 (go_oo) +I want to cry. 我想哭。 CC-BY 2.0 (France) Attribution: tatoeba.org #452275 (CM) & #334542 (fucongcong) +I want to die. 我想死 CC-BY 2.0 (France) Attribution: tatoeba.org #2011280 (CK) & #6388809 (qazz0003) +I was at home. 我刚才在家。 CC-BY 2.0 (France) Attribution: tatoeba.org #1300804 (CK) & #1394842 (mtdot) +I was so cold. 我很冷。 CC-BY 2.0 (France) Attribution: tatoeba.org #2549720 (CK) & #6059538 (verdastelo9604) +I'll buy this. 我要買這個。 CC-BY 2.0 (France) Attribution: tatoeba.org #434015 (CK) & #832955 (Martha) +I'll call you. 我会打电话给你。 CC-BY 2.0 (France) Attribution: tatoeba.org #624894 (saeb) & #2163111 (sadhen) +I'll eat here. 我會在這裡吃飯。 CC-BY 2.0 (France) Attribution: tatoeba.org #449106 (CK) & #819472 (Martha) +I'm Tom's dad. 我是汤姆的父亲。 CC-BY 2.0 (France) Attribution: tatoeba.org #2235783 (CK) & #9958339 (GlossaMatik) +I'm Tom's dad. 我是汤姆的爸爸。 CC-BY 2.0 (France) Attribution: tatoeba.org #2235783 (CK) & #9958340 (GlossaMatik) +I'm a student. 我是學生。 CC-BY 2.0 (France) Attribution: tatoeba.org #567368 (jakov) & #3713544 (egg0073) +I'm a student. 我是个学生。 CC-BY 2.0 (France) Attribution: tatoeba.org #567368 (jakov) & #7768226 (jiangche) +I'm a teacher. 我是個老師。 CC-BY 2.0 (France) Attribution: tatoeba.org #256929 (CK) & #926774 (Martha) +I'm exhausted. 我累死了。 CC-BY 2.0 (France) Attribution: tatoeba.org #20405 (CK) & #333923 (fucongcong) +I'm exhausted. 困死了。 CC-BY 2.0 (France) Attribution: tatoeba.org #20405 (CK) & #2431733 (fenfang557) +I'm exhausted. 我很疲惫。 CC-BY 2.0 (France) Attribution: tatoeba.org #20405 (CK) & #10058468 (slo_oth) +I'm here, too. 我也在这里。 CC-BY 2.0 (France) Attribution: tatoeba.org #4397633 (CK) & #3378127 (GlossaMatik) +I'm home, Mom! 我回来了,妈! CC-BY 2.0 (France) Attribution: tatoeba.org #40899 (CM) & #10260783 (GlossaMatik) +I'm impatient. 我是个急性子。 CC-BY 2.0 (France) Attribution: tatoeba.org #2111721 (CK) & #1766126 (sadhen) +I'm on a diet. 我在節食。 CC-BY 2.0 (France) Attribution: tatoeba.org #241675 (CK) & #793307 (Martha) +I'm on my way. 我这就上路。 CC-BY 2.0 (France) Attribution: tatoeba.org #707205 (CK) & #707204 (Yashanti) +I'm so lonely. 我好孤单。 CC-BY 2.0 (France) Attribution: tatoeba.org #3941292 (AlanF_US) & #8517170 (gumblex) +I'm so stupid. 我真蠢。 CC-BY 2.0 (France) Attribution: tatoeba.org #2248256 (CK) & #3742605 (egg0073) +I'm still mad. 我还是很气。 CC-BY 2.0 (France) Attribution: tatoeba.org #3393240 (CK) & #9972435 (GlossaMatik) +I'm unmarried. 我单身。 CC-BY 2.0 (France) Attribution: tatoeba.org #2549703 (CK) & #4977440 (musclegirlxyp) +I'm unmarried. 我單身。 CC-BY 2.0 (France) Attribution: tatoeba.org #2549703 (CK) & #5691850 (xjjAstrus) +I'm very busy. 我很忙。 CC-BY 2.0 (France) Attribution: tatoeba.org #433991 (CK) & #819333 (Martha) +I've got time. 我有时间。 CC-BY 2.0 (France) Attribution: tatoeba.org #2248396 (CK) & #4859550 (musclegirlxyp) +I've got wine. 我有酒。 CC-BY 2.0 (France) Attribution: tatoeba.org #2248397 (CK) & #5617204 (verdastelo9604) +Is Tom around? 汤姆在吗? CC-BY 2.0 (France) Attribution: tatoeba.org #2244578 (CK) & #8696442 (morningstar) +Is Tom eating? 汤姆在吃饭吗? CC-BY 2.0 (France) Attribution: tatoeba.org #2244598 (CK) & #8696452 (morningstar) +Is he correct? 他对吗? CC-BY 2.0 (France) Attribution: tatoeba.org #2840611 (CK) & #9953366 (GlossaMatik) +Is it serious? 严重吗? CC-BY 2.0 (France) Attribution: tatoeba.org #63616 (CK) & #332870 (fucongcong) +Is that a bat? 那是只蝙蝠吗? CC-BY 2.0 (France) Attribution: tatoeba.org #67124 (CK) & #9970068 (GlossaMatik) +Is that paper? 那是紙嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #6358544 (CK) & #2660854 (egg0073) +Is this Tom's? 这是汤姆的吗? CC-BY 2.0 (France) Attribution: tatoeba.org #3507551 (CK) & #4879140 (musclegirlxyp) +Is this Tom's? 这是汤姆的东西吗? CC-BY 2.0 (France) Attribution: tatoeba.org #3507551 (CK) & #4879141 (musclegirlxyp) +It is raining. 下雨了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1862 (CK) & #346836 (fucongcong) +It is raining. 在下雨。 CC-BY 2.0 (France) Attribution: tatoeba.org #1862 (CK) & #409681 (egg0073) +It looks good. 看起来不错。 CC-BY 2.0 (France) Attribution: tatoeba.org #1808249 (Spamster) & #1808254 (sadhen) +It might rain. 可能会下雨。 CC-BY 2.0 (France) Attribution: tatoeba.org #1230486 (alec) & #465902 (fucongcong) +It might rain. 可能要下雨了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1230486 (alec) & #1223755 (tsayng) +It takes time. 这需要时间。 CC-BY 2.0 (France) Attribution: tatoeba.org #707527 (CK) & #707522 (tianblr) +It won't work. 它不会奏效。 CC-BY 2.0 (France) Attribution: tatoeba.org #1335281 (CK) & #2780864 (GlossaMatik) +It's a secret. 它是個秘密。 CC-BY 2.0 (France) Attribution: tatoeba.org #433821 (CK) & #771519 (Martha) +It's business. 公事公辦。 CC-BY 2.0 (France) Attribution: tatoeba.org #433519 (CK) & #824613 (Martha) +It's fall now. 现在是秋天。 CC-BY 2.0 (France) Attribution: tatoeba.org #503752 (CM) & #503753 (GlossaMatik) +It's freezing. 天氣好冷。 CC-BY 2.0 (France) Attribution: tatoeba.org #52011 (CK) & #803735 (Martha) +It's improved. 它有改善了。 CC-BY 2.0 (France) Attribution: tatoeba.org #435785 (CK) & #771378 (Martha) +It's my fault. 这是我的错。 CC-BY 2.0 (France) Attribution: tatoeba.org #660437 (CM) & #790573 (GlossaMatik) +It's my money. 那是我的钱。 CC-BY 2.0 (France) Attribution: tatoeba.org #2249099 (CK) & #8727837 (crescat) +It's my treat. 我請客。 CC-BY 2.0 (France) Attribution: tatoeba.org #433758 (CK) & #832928 (Martha) +It's not mine. 不是我的。 CC-BY 2.0 (France) Attribution: tatoeba.org #1894573 (CK) & #5673830 (xjjAstrus) +It's so early. 太早了。 CC-BY 2.0 (France) Attribution: tatoeba.org #9483437 (CK) & #2007046 (sadhen) +It's too long. 它太長了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2249327 (CK) & #6114449 (verdastelo9604) +It's too loud. 它太大聲。 CC-BY 2.0 (France) Attribution: tatoeba.org #275485 (CK) & #832797 (Martha) +It's too soon. 太早了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2249336 (CK) & #2007046 (sadhen) +It's very big. 它很大。 CC-BY 2.0 (France) Attribution: tatoeba.org #450003 (CK) & #832782 (Martha) +Keep Tom safe. 确保汤姆安全。 CC-BY 2.0 (France) Attribution: tatoeba.org #2235847 (CK) & #5819711 (verdastelo9604) +Keep it quiet. 保持安静 CC-BY 2.0 (France) Attribution: tatoeba.org #42143 (CK) & #5845311 (start) +Let me see it. 讓我看看。 CC-BY 2.0 (France) Attribution: tatoeba.org #40019 (CK) & #819468 (Martha) +Let me try it. 让我试试。 CC-BY 2.0 (France) Attribution: tatoeba.org #43212 (CK) & #333051 (fucongcong) +Let's go home. 让我们回家吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #773455 (marloncori) & #1506916 (fenfang557) +Lock the gate. 鎖大門。 CC-BY 2.0 (France) Attribution: tatoeba.org #449045 (CK) & #826099 (Martha) +Love is blind. 爱情是盲目的。 CC-BY 2.0 (France) Attribution: tatoeba.org #453394 (CM) & #791649 (fucongcong) +Love is blind. 恋爱使人盲目。 CC-BY 2.0 (France) Attribution: tatoeba.org #453394 (CM) & #1471530 (sadhen) +Make it quick. 快点。 CC-BY 2.0 (France) Attribution: tatoeba.org #2038397 (Spamster) & #5092239 (mirrorvan) +Man is mortal. 人固有一死。 CC-BY 2.0 (France) Attribution: tatoeba.org #270072 (Zifre) & #5091165 (mirrorvan) +May I come in? 我可以進來嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #456355 (lukaszpp) & #780338 (Martha) +Meet me there. 在那裡見我。 CC-BY 2.0 (France) Attribution: tatoeba.org #2249589 (CK) & #6135006 (verdastelo9604) +My foot hurts. 我的脚痛。 CC-BY 2.0 (France) Attribution: tatoeba.org #792061 (Swift) & #804866 (fucongcong) +My head aches. 我头痛。 CC-BY 2.0 (France) Attribution: tatoeba.org #280125 (CK) & #332568 (fucongcong) +My head hurts. 我头痛。 CC-BY 2.0 (France) Attribution: tatoeba.org #456425 (lukaszpp) & #332568 (fucongcong) +My neck hurts. 我脖子痛。 CC-BY 2.0 (France) Attribution: tatoeba.org #2471465 (Hybrid) & #4490360 (egg0073) +My pen is new. 我的钢笔是新的。 CC-BY 2.0 (France) Attribution: tatoeba.org #710914 (CK) & #710912 (Yashanti) +Never give up. 决不放弃。 CC-BY 2.0 (France) Attribution: tatoeba.org #2249592 (CK) & #3783106 (Debbie_Linder) +Nothing moved. 什么都没动。 CC-BY 2.0 (France) Attribution: tatoeba.org #8481072 (shekitten) & #10460422 (GlossaMatik) +Pace yourself. 量力而行。 CC-BY 2.0 (France) Attribution: tatoeba.org #1841178 (CK) & #5092594 (mirrorvan) +Quit gambling. 戒掉赌博吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #1267033 (Scott) & #5092464 (mirrorvan) +Read this now. 现在读这个。 CC-BY 2.0 (France) Attribution: tatoeba.org #1841179 (CK) & #5945152 (verdastelo9604) +Save yourself. 拯救你自己。 CC-BY 2.0 (France) Attribution: tatoeba.org #1849367 (CK) & #6325064 (verdastelo9604) +See you again. 再见! CC-BY 2.0 (France) Attribution: tatoeba.org #32635 (CK) & #336477 (fucongcong) +See you later. 再见。 CC-BY 2.0 (France) Attribution: tatoeba.org #1841588 (CK) & #2030795 (sadhen) +Shake my hand. 和我握手。 CC-BY 2.0 (France) Attribution: tatoeba.org #410593 (CK) & #819354 (Martha) +Shall we walk? 我们该步行吗? CC-BY 2.0 (France) Attribution: tatoeba.org #320508 (CM) & #5574796 (verdastelo9604) +She felt blue. 她感到闷闷不乐的。 CC-BY 2.0 (France) Attribution: tatoeba.org #317287 (Swift) & #4566371 (liyongtao) +She hated him. 她恨他。 CC-BY 2.0 (France) Attribution: tatoeba.org #388371 (CK) & #832950 (Martha) +She is eating. 她吃。 CC-BY 2.0 (France) Attribution: tatoeba.org #527192 (CK) & #4887706 (musclegirlxyp) +She loves Tom. 她愛湯姆。 CC-BY 2.0 (France) Attribution: tatoeba.org #311828 (CK) & #826241 (Martha) +She's dieting. 她在节食中。 CC-BY 2.0 (France) Attribution: tatoeba.org #1396194 (CK) & #1878324 (sadhen) +She's dieting. 她在节食。 CC-BY 2.0 (France) Attribution: tatoeba.org #1396194 (CK) & #7767995 (jiangche) +She's my type. 她是我的菜。 CC-BY 2.0 (France) Attribution: tatoeba.org #314284 (CK) & #3742628 (egg0073) +Show it to me. 给我看下它吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #1356990 (sacredceltic) & #7771674 (jiangche) +Shut the door. 不要把门开着。 CC-BY 2.0 (France) Attribution: tatoeba.org #38992 (CK) & #334214 (fucongcong) +Shut the door. 请关门。 CC-BY 2.0 (France) Attribution: tatoeba.org #38992 (CK) & #396001 (GlossaMatik) +Shut the door. 关门。 CC-BY 2.0 (France) Attribution: tatoeba.org #38992 (CK) & #472970 (fucongcong) +Sit beside me. 坐我旁边。 CC-BY 2.0 (France) Attribution: tatoeba.org #250344 (CK) & #1424389 (sadhen) +Somebody came. 有人来了。 CC-BY 2.0 (France) Attribution: tatoeba.org #5317425 (mailohilohi) & #5092398 (mirrorvan) +Speak clearly. 講清楚。 CC-BY 2.0 (France) Attribution: tatoeba.org #433849 (CK) & #825154 (Martha) +Stir the soup. 搅一下汤。 CC-BY 2.0 (France) Attribution: tatoeba.org #704725 (Zifre) & #802843 (fucongcong) +Stop gambling. 戒掉赌博吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #2592874 (WestofEden) & #5092464 (mirrorvan) +Stop meddling. 别再插手。 CC-BY 2.0 (France) Attribution: tatoeba.org #1719227 (marcelostockle) & #5092534 (mirrorvan) +Stop shooting. 停止射击。 CC-BY 2.0 (France) Attribution: tatoeba.org #1974716 (CK) & #5092701 (mirrorvan) +Stop worrying. 别担心了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1495911 (CK) & #8715889 (crescat) +Straighten up. 改邪归正。 CC-BY 2.0 (France) Attribution: tatoeba.org #282453 (CK) & #5092263 (mirrorvan) +Stuff happens. 事情难免会发生。 CC-BY 2.0 (France) Attribution: tatoeba.org #491351 (saeb) & #5092383 (mirrorvan) +Suit yourself. 你隨意。 CC-BY 2.0 (France) Attribution: tatoeba.org #240697 (CM) & #6290249 (xjjAstrus) +Talk is cheap. 說得簡單。 CC-BY 2.0 (France) Attribution: tatoeba.org #1515606 (Biga) & #884661 (Tajfun) +Tell me again. 重新告訴我。 CC-BY 2.0 (France) Attribution: tatoeba.org #2250076 (CK) & #6044374 (verdastelo9604) +Thanks anyway. 还是要说谢谢的。 CC-BY 2.0 (France) Attribution: tatoeba.org #485099 (Scott) & #5092338 (mirrorvan) +That was fast. 太快了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1280577 (CK) & #8649716 (maxine) +That's a book. 那是一本書。 CC-BY 2.0 (France) Attribution: tatoeba.org #515535 (CK) & #819414 (Martha) +That's clever. 好巧妙啊。 CC-BY 2.0 (France) Attribution: tatoeba.org #1357082 (sacredceltic) & #805579 (fucongcong) +That's insane. 那是瘋狂的。 CC-BY 2.0 (France) Attribution: tatoeba.org #9483418 (CK) & #826184 (Martha) +That's my aim. 这是我的目的。 CC-BY 2.0 (France) Attribution: tatoeba.org #2256888 (CK) & #9961355 (GlossaMatik) +That's my cat. 那是我的猫。 CC-BY 2.0 (France) Attribution: tatoeba.org #471758 (CM) & #471765 (GlossaMatik) +That's my dad. 那个是我爸爸。 CC-BY 2.0 (France) Attribution: tatoeba.org #4397567 (CK) & #10966769 (xjjAstrus) +That's no lie. 不是謊話。 CC-BY 2.0 (France) Attribution: tatoeba.org #3722408 (CM) & #12002574 (corina) +The bell rang. 铃响了。 CC-BY 2.0 (France) Attribution: tatoeba.org #385375 (Mouseneb) & #332971 (fucongcong) +They all knew. 他们都知道。 CC-BY 2.0 (France) Attribution: tatoeba.org #2243022 (CK) & #9972936 (GlossaMatik) +They are here. 他们在这里。 CC-BY 2.0 (France) Attribution: tatoeba.org #1561368 (ninuzzo) & #3378278 (GlossaMatik) +They can wait. 他们等得了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2243080 (CK) & #7841358 (basilhan) +They're armed. 他們有帶武器。 CC-BY 2.0 (France) Attribution: tatoeba.org #1898129 (CK) & #2511467 (tsayng) +This is a wig. 这是假发。 CC-BY 2.0 (France) Attribution: tatoeba.org #4175760 (Lepotdeterre) & #5637367 (verdastelo9604) +This is empty. 这是空的。 CC-BY 2.0 (France) Attribution: tatoeba.org #10276530 (DaoSeng) & #9956933 (GlossaMatik) +This is weird. 奇怪。 CC-BY 2.0 (France) Attribution: tatoeba.org #1898083 (CK) & #917754 (GlossaMatik) +Throw it away. 扔掉 CC-BY 2.0 (France) Attribution: tatoeba.org #7723590 (Ofthefog) & #5114835 (xjjAstrus) +Time is money. 时间就是金钱。 CC-BY 2.0 (France) Attribution: tatoeba.org #566026 (CK) & #4970148 (wzhd) +Today was fun. 今天很有趣。 CC-BY 2.0 (France) Attribution: tatoeba.org #418628 (CK) & #826120 (Martha) +Tom applauded. 湯姆拍了手。 CC-BY 2.0 (France) Attribution: tatoeba.org #2203595 (CK) & #5812342 (xjjAstrus) +Tom applauded. 汤姆鼓掌。 CC-BY 2.0 (France) Attribution: tatoeba.org #2203595 (CK) & #9956343 (GlossaMatik) +Tom came back. 湯姆回來了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2236132 (CK) & #6936200 (verdastelo9604) +Tom didn't go. 汤姆没走。 CC-BY 2.0 (France) Attribution: tatoeba.org #3735263 (CK) & #5581802 (verdastelo9604) +Tom fell down. 湯姆摔倒了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1094129 (CK) & #8215735 (verdastelo9604) +Tom felt cold. 湯姆覺得冷。 CC-BY 2.0 (France) Attribution: tatoeba.org #1025797 (CK) & #5685768 (xjjAstrus) +Tom got tired. 湯姆累了。 CC-BY 2.0 (France) Attribution: tatoeba.org #6220041 (CK) & #6098473 (verdastelo9604) +Tom graduated. 湯姆畢業了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2111170 (CK) & #8215705 (verdastelo9604) +Tom is a hick. 汤姆是个乡巴佬。 CC-BY 2.0 (France) Attribution: tatoeba.org #2272811 (CK) & #5574810 (verdastelo9604) +Tom is absent. 湯姆缺席。 CC-BY 2.0 (France) Attribution: tatoeba.org #37162 (CK) & #826133 (Martha) +Tom is boring. 汤姆是个无聊的人。 CC-BY 2.0 (France) Attribution: tatoeba.org #2202622 (CK) & #2440969 (fenfang557) +Tom is lonely. 汤姆很孤独。 CC-BY 2.0 (France) Attribution: tatoeba.org #5854381 (CK) & #7781773 (jiangche) +Tom is so hot. 汤姆非常性感。 CC-BY 2.0 (France) Attribution: tatoeba.org #2273497 (CK) & #4621026 (Yashanti) +Tom is stingy. 汤姆很小气。 CC-BY 2.0 (France) Attribution: tatoeba.org #1093435 (CK) & #4264932 (notabene) +Tom is thirty. 汤姆今年三十岁。 CC-BY 2.0 (France) Attribution: tatoeba.org #2236878 (CK) & #8738755 (crescat) +Tom isn't old. 湯姆不老。 CC-BY 2.0 (France) Attribution: tatoeba.org #2236999 (CK) & #6150025 (verdastelo9604) +Tom knows him. 湯姆認識他。 CC-BY 2.0 (France) Attribution: tatoeba.org #2237129 (CK) & #6447545 (verdastelo9604) +Tom loves you. 汤姆爱你。 CC-BY 2.0 (France) Attribution: tatoeba.org #2257541 (CK) & #5585235 (verdastelo9604) +Tom missed it. 汤姆错过了它。 CC-BY 2.0 (France) Attribution: tatoeba.org #4394832 (CK) & #9961268 (GlossaMatik) +Tom overslept. 汤姆睡过头了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1164341 (CK) & #5092449 (mirrorvan) +Tom runs fast. 汤姆跑得快。 CC-BY 2.0 (France) Attribution: tatoeba.org #3171216 (CK) & #5072385 (musclegirlxyp) +Tom was drunk. 汤姆醉了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2239777 (CK) & #5142201 (musclegirlxyp) +Tom was fired. 湯姆被解僱了。 CC-BY 2.0 (France) Attribution: tatoeba.org #513527 (CK) & #825757 (Martha) +Tom was tired. 湯姆累了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2471870 (arnxy20) & #6098473 (verdastelo9604) +Tom was wrong. 汤姆错了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1140912 (CK) & #8463695 (gumblex) +Tom's married. 汤姆已经结婚了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2107566 (CK) & #9961309 (GlossaMatik) +Wait a moment. 請稍等。 CC-BY 2.0 (France) Attribution: tatoeba.org #410597 (CK) & #825160 (Martha) +Wait a moment. 等一下。 CC-BY 2.0 (France) Attribution: tatoeba.org #410597 (CK) & #9007563 (jacintoo) +We both cried. 我们都哭了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2241031 (CK) & #10260788 (GlossaMatik) +We have to go. 我们必须走了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1737475 (Spamster) & #7767666 (jiangche) +We kept quiet. 我们保持了沉默。 CC-BY 2.0 (France) Attribution: tatoeba.org #248957 (CK) & #334263 (fucongcong) +We like music. 我們喜歡音樂。 CC-BY 2.0 (France) Attribution: tatoeba.org #247741 (CK) & #6093304 (verdastelo9604) +We missed you. 我們想你。 CC-BY 2.0 (France) Attribution: tatoeba.org #2241163 (CK) & #6624605 (verdastelo9604) +We need money. 我們需要錢。 CC-BY 2.0 (France) Attribution: tatoeba.org #493908 (adjusting) & #752112 (Martha) +We need to go. 我们必须走了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1893749 (CK) & #7767666 (jiangche) +We understand. 我们明白。 CC-BY 2.0 (France) Attribution: tatoeba.org #1893706 (CK) & #5102318 (mirrorvan) +We want candy. 我們想要糖。 CC-BY 2.0 (France) Attribution: tatoeba.org #2011284 (CK) & #6111716 (verdastelo9604) +We were bored. 我们感到厌烦了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2241480 (CK) & #7767668 (jiangche) +We'll be busy. 我們會很忙。 CC-BY 2.0 (France) Attribution: tatoeba.org #2649180 (CK) & #6131309 (verdastelo9604) +We'll do that. 我們會去做。 CC-BY 2.0 (France) Attribution: tatoeba.org #2241572 (CK) & #6091802 (verdastelo9604) +We're friends. 我们是朋友。 CC-BY 2.0 (France) Attribution: tatoeba.org #2107346 (CK) & #5624940 (verdastelo9604) +We're friends. 我們是朋友。 CC-BY 2.0 (France) Attribution: tatoeba.org #2107346 (CK) & #6149234 (xjjAstrus) +We're special. 我们是特别的。 CC-BY 2.0 (France) Attribution: tatoeba.org #2203388 (CK) & #7767571 (jiangche) +We're special. 我们很特别。 CC-BY 2.0 (France) Attribution: tatoeba.org #2203388 (CK) & #7767572 (jiangche) +We're worried. 我们很担心。 CC-BY 2.0 (France) Attribution: tatoeba.org #2203589 (CK) & #7704613 (leafjensen) +We've arrived. 我們已經到了。 CC-BY 2.0 (France) Attribution: tatoeba.org #410594 (CK) & #825155 (Martha) +Were you busy? 您当时在忙吗? CC-BY 2.0 (France) Attribution: tatoeba.org #2649178 (CK) & #7768293 (jiangche) +Where are you? 你在哪儿? CC-BY 2.0 (France) Attribution: tatoeba.org #2168 (CK) & #346124 (fucongcong) +Who hired you? 誰僱了你? CC-BY 2.0 (France) Attribution: tatoeba.org #1663022 (Spamster) & #8215698 (verdastelo9604) +Who loved who? 谁爱谁? CC-BY 2.0 (France) Attribution: tatoeba.org #2254860 (CK) & #9958609 (GlossaMatik) +Whose is this? 这是谁的? CC-BY 2.0 (France) Attribution: tatoeba.org #2302 (CK) & #1314463 (vicch) +Why blame Tom? 为什么责备汤姆? CC-BY 2.0 (France) Attribution: tatoeba.org #2057760 (CK) & #2394590 (fenfang557) +You are drunk! 你喝醉了! CC-BY 2.0 (France) Attribution: tatoeba.org #64332 (CK) & #7768302 (jiangche) +You are lying. 你在撒谎。 CC-BY 2.0 (France) Attribution: tatoeba.org #26653 (CK) & #332572 (fucongcong) +You could run. 你能跑。 CC-BY 2.0 (France) Attribution: tatoeba.org #2254961 (CK) & #6333813 (verdastelo9604) +You don't say. 真的? CC-BY 2.0 (France) Attribution: tatoeba.org #28233 (CK) & #1397360 (mtdot) +You look good. 你气色不错。 CC-BY 2.0 (France) Attribution: tatoeba.org #1011281 (DanaDescalza) & #2040311 (sadhen) +You look pale. 你看起來很蒼白。 CC-BY 2.0 (France) Attribution: tatoeba.org #16224 (CK) & #771525 (Martha) +You should go. 你應該去。 CC-BY 2.0 (France) Attribution: tatoeba.org #518556 (CK) & #832786 (Martha) +You should go. 你最好去。 CC-BY 2.0 (France) Attribution: tatoeba.org #518556 (CK) & #844117 (fucongcong) +You will fail. 你會失敗。 CC-BY 2.0 (France) Attribution: tatoeba.org #694388 (AmberShadow) & #781665 (Martha) +You work hard. 你工作努力。 CC-BY 2.0 (France) Attribution: tatoeba.org #15993 (CK) & #1992630 (sadhen) +You're joking! 你在開玩笑吧! CC-BY 2.0 (France) Attribution: tatoeba.org #433882 (CK) & #825144 (Martha) +You're not me. 你不是我。 CC-BY 2.0 (France) Attribution: tatoeba.org #2218273 (CK) & #5341690 (xjjAstrus) +You're so bad. 你真壞。 CC-BY 2.0 (France) Attribution: tatoeba.org #1230472 (alec) & #1225678 (tsayng) +You're stupid. 你很愚蠢。 CC-BY 2.0 (France) Attribution: tatoeba.org #2123495 (CK) & #993698 (leoyzy) +You're stupid. 你二了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2123495 (CK) & #1750497 (sadhen) +Zip your lips. 闭上你的嘴。 CC-BY 2.0 (France) Attribution: tatoeba.org #8557825 (CM) & #1691765 (sadhen) +A bird can fly. 鸟会飞。 CC-BY 2.0 (France) Attribution: tatoeba.org #812362 (Zaphod) & #2999597 (sadhen) +Allow me to go. 請允許我去。 CC-BY 2.0 (France) Attribution: tatoeba.org #433651 (CK) & #826174 (Martha) +Are you afraid? 你害怕吗? CC-BY 2.0 (France) Attribution: tatoeba.org #1485265 (arnxy20) & #9990081 (GlossaMatik) +Are you coming? 你会来吗? CC-BY 2.0 (France) Attribution: tatoeba.org #1417464 (CK) & #4970134 (wzhd) +Are you crying? 你在哭嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #1886352 (CK) & #3718942 (egg0073) +Are you hungry? 你肚子饿吗? CC-BY 2.0 (France) Attribution: tatoeba.org #434242 (lukaszpp) & #400025 (GlossaMatik) +Are you single? 你是单身吗? CC-BY 2.0 (France) Attribution: tatoeba.org #280576 (CK) & #4956716 (musclegirlxyp) +Aren't you Tom? 你不是湯姆嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #37392 (CK) & #727800 (Martha) +Aren't you Tom? 你不是湯姆嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #37392 (CK) & #825908 (Martha) +Aren't you hot? 你不热吗? CC-BY 2.0 (France) Attribution: tatoeba.org #2951539 (CK) & #4956714 (musclegirlxyp) +Birds lay eggs. 鳥下蛋。 CC-BY 2.0 (France) Attribution: tatoeba.org #278220 (CK) & #826163 (Martha) +Boil the water. 把水燒開。 CC-BY 2.0 (France) Attribution: tatoeba.org #1795949 (ifethereal) & #896660 (Martha) +Bring Tom here. 把汤姆带到这里来。 CC-BY 2.0 (France) Attribution: tatoeba.org #2235648 (CK) & #8737070 (crescat) +Bring it to me. 把它带给我。 CC-BY 2.0 (France) Attribution: tatoeba.org #41817 (CK) & #745903 (fucongcong) +Buy Tom a beer. 给汤姆买一瓶啤酒。 CC-BY 2.0 (France) Attribution: tatoeba.org #8054569 (CK) & #8631023 (ZeroAurora) +Buy me a snack. 帮我买点零食吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #5320767 (mailohilohi) & #9838191 (morningstar) +Can I eat this? 我可以吃这个吗? CC-BY 2.0 (France) Attribution: tatoeba.org #54937 (CK) & #411609 (fucongcong) +Can I help you? 我能幫你嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #25095 (CK) & #6559076 (xjjAstrus) +Can I see that? 我能看看那个吗? CC-BY 2.0 (France) Attribution: tatoeba.org #1886275 (CK) & #8749676 (crescat) +Can I sit here? 我能坐这里吗? CC-BY 2.0 (France) Attribution: tatoeba.org #1537275 (niceguydave) & #4757682 (ryanwoo) +Can we make it? 我們做得到嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #2890988 (CK) & #9545095 (verdastelo9604) +Can you get up? 你能起床嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #1117779 (Scott) & #6057671 (xjjAstrus) +Clean the room. 打掃房間。 CC-BY 2.0 (France) Attribution: tatoeba.org #378284 (CK) & #860817 (Martha) +Close the door. 关门。 CC-BY 2.0 (France) Attribution: tatoeba.org #405379 (brauliobezerra) & #472970 (fucongcong) +Close the gate. 关门。 CC-BY 2.0 (France) Attribution: tatoeba.org #853133 (piksea) & #472970 (fucongcong) +Coffee, please. 我要咖啡,谢谢。 CC-BY 2.0 (France) Attribution: tatoeba.org #1907148 (CK) & #5092616 (mirrorvan) +Come down here! 你给我下来! CC-BY 2.0 (France) Attribution: tatoeba.org #1934782 (Spamster) & #1766123 (sadhen) +Cows give milk. 牛可产奶。 CC-BY 2.0 (France) Attribution: tatoeba.org #619902 (darinmex) & #7767652 (jiangche) +Deal with them. 解决他们。 CC-BY 2.0 (France) Attribution: tatoeba.org #2245254 (CK) & #5091689 (mirrorvan) +Did you see it? 您看见它了吗? CC-BY 2.0 (France) Attribution: tatoeba.org #914018 (Jane_Austen) & #10182763 (slo_oth) +Do I look rich? 我看起来很有钱吗? CC-BY 2.0 (France) Attribution: tatoeba.org #10317912 (CK) & #10635237 (gumblex) +Do as you like. 你想怎么做就怎么做。 CC-BY 2.0 (France) Attribution: tatoeba.org #17188 (CK) & #398887 (GlossaMatik) +Do as you want. 你想怎么做就怎么做。 CC-BY 2.0 (France) Attribution: tatoeba.org #2369 (Eldad) & #398887 (GlossaMatik) +Do we know you? 我们认识你么? CC-BY 2.0 (France) Attribution: tatoeba.org #1886115 (CK) & #2065024 (sadhen) +Do you hate me? 你讨厌我吗? CC-BY 2.0 (France) Attribution: tatoeba.org #3189152 (CK) & #4885096 (musclegirlxyp) +Do you have it? 你们有吗? CC-BY 2.0 (France) Attribution: tatoeba.org #2192241 (acbarbosa) & #6850351 (mao) +Do you hear me? 你听得见吗? CC-BY 2.0 (France) Attribution: tatoeba.org #319989 (CK) & #333415 (fucongcong) +Do you know me? 你认识我吗? CC-BY 2.0 (France) Attribution: tatoeba.org #69295 (CK) & #1790035 (sadhen) +Do you know me? 你还认识我吗? CC-BY 2.0 (France) Attribution: tatoeba.org #69295 (CK) & #4835855 (sadhen) +Do you know me? 你認識我嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #69295 (CK) & #5816150 (xjjAstrus) +Do you like it? 你喜欢吗 ? CC-BY 2.0 (France) Attribution: tatoeba.org #433500 (CK) & #423413 (fucongcong) +Do you like it? 你喜歡嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #433500 (CK) & #825921 (Martha) +Do you love me? 你爱我吗? CC-BY 2.0 (France) Attribution: tatoeba.org #321497 (CK) & #10966779 (xjjAstrus) +Do you miss me? 你想我了? CC-BY 2.0 (France) Attribution: tatoeba.org #1230779 (alec) & #334429 (fucongcong) +Do you miss me? 你想我吗? CC-BY 2.0 (France) Attribution: tatoeba.org #1230779 (alec) & #4835859 (sadhen) +Do you promise? 你保證嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #1886067 (CK) & #5865504 (verdastelo9604) +Don't eat that! 不要吃那個! CC-BY 2.0 (France) Attribution: tatoeba.org #6029093 (Huskion) & #6835388 (User76378) +Don't touch it. 別碰它。 CC-BY 2.0 (France) Attribution: tatoeba.org #433652 (CK) & #819332 (Martha) +Drop the knife! 把刀放下! CC-BY 2.0 (France) Attribution: tatoeba.org #2245412 (CK) & #9135872 (xjjAstrus) +Everybody lies. 每个人都会说谎。 CC-BY 2.0 (France) Attribution: tatoeba.org #1008564 (Goracykabanos) & #5092416 (mirrorvan) +French is easy. 法语很简单。 CC-BY 2.0 (France) Attribution: tatoeba.org #8410245 (CK) & #10156955 (yeyue) +Get in the car. 上车吧! CC-BY 2.0 (France) Attribution: tatoeba.org #1839425 (CK) & #7768011 (jiangche) +Get out of bed! 起床! CC-BY 2.0 (France) Attribution: tatoeba.org #33985 (CK) & #771485 (Martha) +Get rid of her. 把她干掉了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1849374 (CK) & #9961721 (GlossaMatik) +Give me a kiss. 吻我。 CC-BY 2.0 (France) Attribution: tatoeba.org #1844204 (CK) & #5092385 (mirrorvan) +Good afternoon. 下午好。 CC-BY 2.0 (France) Attribution: tatoeba.org #499689 (CK) & #812493 (fucongcong) +Happy New Year! 新年快樂! CC-BY 2.0 (France) Attribution: tatoeba.org #361350 (blay_paul) & #6581625 (SofiaLee) +Happy New Year! 元旦快樂! CC-BY 2.0 (France) Attribution: tatoeba.org #361350 (blay_paul) & #6583810 (xjjAstrus) +Have some more. 你該多吃點。 CC-BY 2.0 (France) Attribution: tatoeba.org #4755386 (garborg) & #4754672 (egg0073) +He accelerated. 他提速了。 CC-BY 2.0 (France) Attribution: tatoeba.org #290321 (CM) & #5092269 (mirrorvan) +He confused us. 他把我們弄糊塗了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2166227 (faraway9911) & #2112340 (egg0073) +He doesn't lie. 他不说谎。 CC-BY 2.0 (France) Attribution: tatoeba.org #1173825 (CK) & #5865517 (verdastelo9604) +He doesn't tan. 他晒不黑。 CC-BY 2.0 (France) Attribution: tatoeba.org #454617 (FeuDRenais) & #454618 (GlossaMatik) +He gave a ball. 他举办了一场舞会。 CC-BY 2.0 (France) Attribution: tatoeba.org #303384 (CM) & #2143987 (ydcok) +He held a ball. 他举办了一场舞会。 CC-BY 2.0 (France) Attribution: tatoeba.org #2162155 (FeuDRenais) & #2143987 (ydcok) +He is a doctor. 他是医生来的。 CC-BY 2.0 (France) Attribution: tatoeba.org #293611 (CK) & #8593079 (easononizuka) +He lives alone. 他一个人生活。 CC-BY 2.0 (France) Attribution: tatoeba.org #811376 (willhite2) & #346797 (fucongcong) +He lives alone. 他独自生活。 CC-BY 2.0 (France) Attribution: tatoeba.org #811376 (willhite2) & #812227 (fucongcong) +He looks happy. 他看上去很幸福。 CC-BY 2.0 (France) Attribution: tatoeba.org #1460417 (piksea) & #8715867 (crescat) +He looks young. 他看起来很年轻。 CC-BY 2.0 (France) Attribution: tatoeba.org #299157 (CK) & #2188410 (sadhen) +He lost a book. 他弄丟了一本書。 CC-BY 2.0 (France) Attribution: tatoeba.org #1275203 (CM) & #1275211 (egg0073) +He loves music. 他非常喜歡音樂。 CC-BY 2.0 (France) Attribution: tatoeba.org #1316125 (CK) & #833780 (Martha) +He sang a song. 他唱了一首歌。 CC-BY 2.0 (France) Attribution: tatoeba.org #283456 (CK) & #427999 (fucongcong) +He was drowned. 他被淹死了。 CC-BY 2.0 (France) Attribution: tatoeba.org #874946 (CM) & #1767972 (sadhen) +He's a big boy. 他是個大男孩。 CC-BY 2.0 (France) Attribution: tatoeba.org #288238 (CK) & #824647 (Martha) +He's an author. 他是作家。 CC-BY 2.0 (France) Attribution: tatoeba.org #593248 (CK) & #4970153 (wzhd) +He's henpecked. 他對老婆言聽計從。 CC-BY 2.0 (France) Attribution: tatoeba.org #1493814 (niceguydave) & #775891 (Martha) +Here is a book. 這裡有一本書。 CC-BY 2.0 (France) Attribution: tatoeba.org #61725 (CK) & #825137 (Martha) +How much is it? 它多貴? CC-BY 2.0 (France) Attribution: tatoeba.org #2418 (brauliobezerra) & #759540 (Martha) +How much is it? 多少錢? CC-BY 2.0 (France) Attribution: tatoeba.org #2418 (brauliobezerra) & #761442 (Martha) +How much is it? 这个几块? CC-BY 2.0 (France) Attribution: tatoeba.org #2418 (brauliobezerra) & #10052320 (GlossaMatik) +How time flies! 时间过得多快呀。 CC-BY 2.0 (France) Attribution: tatoeba.org #240401 (CM) & #9484585 (jin1) +How time flies! 时间过得真快啊! CC-BY 2.0 (France) Attribution: tatoeba.org #240401 (CM) & #9987087 (GlossaMatik) +How's business? 生意怎么样? CC-BY 2.0 (France) Attribution: tatoeba.org #267432 (CK) & #431126 (GlossaMatik) +How's everyone? 大家好嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #9709254 (megamanenm) & #819309 (Martha) +How's it going? 你們好嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #277972 (CK) & #1761553 (egg0073) +I am a shy boy. 我是一個害羞的男孩。 CC-BY 2.0 (France) Attribution: tatoeba.org #97592 (fcbond) & #781497 (Martha) +I am a student. 我是學生。 CC-BY 2.0 (France) Attribution: tatoeba.org #252287 (CK) & #3713544 (egg0073) +I am a student. 我是个学生。 CC-BY 2.0 (France) Attribution: tatoeba.org #252287 (CK) & #7768226 (jiangche) +I am a teacher. 我是個老師。 CC-BY 2.0 (France) Attribution: tatoeba.org #259069 (CK) & #926774 (Martha) +I am not happy. 我不高兴。 CC-BY 2.0 (France) Attribution: tatoeba.org #3378134 (CM) & #3378133 (GlossaMatik) +I am off today. 我今天休息。 CC-BY 2.0 (France) Attribution: tatoeba.org #242826 (CK) & #1990181 (sunnywqing) +I am too short. 我太矮了。 CC-BY 2.0 (France) Attribution: tatoeba.org #436445 (lukaszpp) & #512866 (fucongcong) +I ate an apple. 我吃了一個蘋果。 CC-BY 2.0 (France) Attribution: tatoeba.org #3294474 (CK) & #6057138 (xjjAstrus) +I ate the meat. 我吃肉了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2629267 (CK) & #2629582 (GlossaMatik) +I believed you. 我信过你。 CC-BY 2.0 (France) Attribution: tatoeba.org #1841709 (CK) & #4789627 (400S) +I believed you. 我相信了你。 CC-BY 2.0 (France) Attribution: tatoeba.org #1841709 (CK) & #7704610 (leafjensen) +I borrow money. 我借錢。 CC-BY 2.0 (France) Attribution: tatoeba.org #435437 (CK) & #825878 (Martha) +I broke my arm. 我的手臂斷了。 CC-BY 2.0 (France) Attribution: tatoeba.org #262315 (CK) & #919738 (Martha) +I can hear you. 我听得到。 CC-BY 2.0 (France) Attribution: tatoeba.org #2301250 (CK) & #8727966 (crescat) +I dislike eggs. 我不喜欢鸡蛋。 CC-BY 2.0 (France) Attribution: tatoeba.org #593244 (CK) & #4673809 (McMeao) +I don't get it. 我不懂。 CC-BY 2.0 (France) Attribution: tatoeba.org #38392 (CK) & #409679 (egg0073) +I go to school. 我去学校。 CC-BY 2.0 (France) Attribution: tatoeba.org #472089 (tamsanh) & #4878932 (musclegirlxyp) +I got arrested. 我被逮捕了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2245783 (CK) & #3718963 (egg0073) +I got up early. 我起床早。 CC-BY 2.0 (France) Attribution: tatoeba.org #259164 (CK) & #5555832 (verdastelo9604) +I had a vision. 我有一个设想。 CC-BY 2.0 (France) Attribution: tatoeba.org #1887332 (CK) & #5091184 (mirrorvan) +I had a vision. 我有一个愿景。 CC-BY 2.0 (France) Attribution: tatoeba.org #1887332 (CK) & #5091185 (mirrorvan) +I hate Mondays. 我讨厌星期一。 CC-BY 2.0 (France) Attribution: tatoeba.org #576084 (CK) & #1417551 (sadhen) +I have a couch. 我有一個沙發。 CC-BY 2.0 (France) Attribution: tatoeba.org #8297812 (GuidoW) & #9139559 (xjjAstrus) +I have a cough. 我咳嗽。 CC-BY 2.0 (France) Attribution: tatoeba.org #51340 (CK) & #826092 (Martha) +I have a dream. 我有一个梦想。 CC-BY 2.0 (France) Attribution: tatoeba.org #1630 (al_ex_an_der) & #501456 (fucongcong) +I have hiccups. 我打嗝了。 CC-BY 2.0 (France) Attribution: tatoeba.org #796086 (U2FS) & #796643 (fucongcong) +I have no clue. 我一无所知。 CC-BY 2.0 (France) Attribution: tatoeba.org #2563243 (CK) & #7772071 (jiangche) +I have no idea. 我一无所知。 CC-BY 2.0 (France) Attribution: tatoeba.org #273786 (CK) & #7772071 (jiangche) +I have no time. 我没时间。 CC-BY 2.0 (France) Attribution: tatoeba.org #249910 (CK) & #782929 (fucongcong) +I have to help. 我必须帮忙。 CC-BY 2.0 (France) Attribution: tatoeba.org #2360532 (CK) & #9958568 (GlossaMatik) +I hiccup a lot. 我经常打嗝。 CC-BY 2.0 (France) Attribution: tatoeba.org #53088 (CK) & #796644 (fucongcong) +I just saw Tom. 我刚刚见到汤姆了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2261956 (CK) & #8776012 (crescat) +I kept singing. 我繼續唱歌。 CC-BY 2.0 (France) Attribution: tatoeba.org #5852006 (CK) & #819338 (Martha) +I kept singing. 我继续唱歌。 CC-BY 2.0 (France) Attribution: tatoeba.org #5852006 (CK) & #4270138 (notabene) +I like drawing. 我喜欢画画。 CC-BY 2.0 (France) Attribution: tatoeba.org #7802995 (sharris123) & #1884732 (Venki) +I like flowers. 我喜歡花。 CC-BY 2.0 (France) Attribution: tatoeba.org #4563343 (robbieheslop) & #4504367 (egg0073) +I like jogging. 我喜欢跑步。 CC-BY 2.0 (France) Attribution: tatoeba.org #640717 (shanghainese) & #363979 (fucongcong) +I like rabbits. 我喜欢兔子。 CC-BY 2.0 (France) Attribution: tatoeba.org #12259779 (sundown) & #7774808 (jiangche) +I like reading. 我喜欢阅读。 CC-BY 2.0 (France) Attribution: tatoeba.org #1276130 (CK) & #2163112 (sadhen) +I like running. 我喜欢跑步。 CC-BY 2.0 (France) Attribution: tatoeba.org #1444911 (CK) & #363979 (fucongcong) +I like to read. 我喜欢阅读。 CC-BY 2.0 (France) Attribution: tatoeba.org #2164515 (CM) & #2163112 (sadhen) +I love my life. 我爱我的生活。 CC-BY 2.0 (France) Attribution: tatoeba.org #436789 (lukaszpp) & #465838 (fucongcong) +I love my life. 我爱我的生命。 CC-BY 2.0 (France) Attribution: tatoeba.org #436789 (lukaszpp) & #465839 (fucongcong) +I love my wife. 我爱我的妻子。 CC-BY 2.0 (France) Attribution: tatoeba.org #436791 (lukaszpp) & #4759974 (ryanwoo) +I love parties. 我愛派對。 CC-BY 2.0 (France) Attribution: tatoeba.org #435747 (CK) & #826027 (Martha) +I met a friend. 我遇见一个朋友。 CC-BY 2.0 (France) Attribution: tatoeba.org #262062 (mamat) & #1428115 (sadhen) +I missed a lot. 我错过了很多。 CC-BY 2.0 (France) Attribution: tatoeba.org #3822929 (CK) & #9961275 (GlossaMatik) +I must decline. 我必须拒绝。 CC-BY 2.0 (France) Attribution: tatoeba.org #2245986 (CK) & #5091270 (mirrorvan) +I must go home. 我该回家了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2768606 (CK) & #343852 (fucongcong) +I need a knife. 我需要一把刀。 CC-BY 2.0 (France) Attribution: tatoeba.org #693874 (Riskemulo) & #9135871 (xjjAstrus) +I need a raise. 我需要加薪。 CC-BY 2.0 (France) Attribution: tatoeba.org #2387462 (CK) & #8792052 (slo_oth) +I need a stamp. 我需要一張郵票。 CC-BY 2.0 (France) Attribution: tatoeba.org #735080 (Darkmaster) & #793499 (Martha) +I need a towel. 我需要一塊毛巾。 CC-BY 2.0 (France) Attribution: tatoeba.org #2387469 (CK) & #9049735 (xjjAstrus) +I need it ASAP. 我尽快需要。 CC-BY 2.0 (France) Attribution: tatoeba.org #275708 (CK) & #333429 (fucongcong) +I need my coat. 我需要我的大衣。 CC-BY 2.0 (France) Attribution: tatoeba.org #1887576 (CK) & #5496299 (egg0073) +I need to know. 我需要知道。 CC-BY 2.0 (France) Attribution: tatoeba.org #2246738 (Hybrid) & #5911609 (verdastelo9604) +I often hiccup. 我经常打嗝。 CC-BY 2.0 (France) Attribution: tatoeba.org #1014156 (Albert) & #796644 (fucongcong) +I remember now. 现在我想起来了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1474622 (Chrikaru) & #472898 (fucongcong) +I said shut up! 我说过了,闭嘴! CC-BY 2.0 (France) Attribution: tatoeba.org #1453550 (Spamster) & #2499996 (fenfang557) +I saw five men. 我看到了五個男人。 CC-BY 2.0 (France) Attribution: tatoeba.org #370730 (saeb) & #884221 (Martha) +I saw five men. 我看见五个男人。 CC-BY 2.0 (France) Attribution: tatoeba.org #370730 (saeb) & #1372536 (sadhen) +I saw her swim. 我看見她游泳。 CC-BY 2.0 (France) Attribution: tatoeba.org #261029 (CK) & #8388686 (wangchou) +I sell flowers. 我卖花。 CC-BY 2.0 (France) Attribution: tatoeba.org #3378102 (_undertoad) & #3378101 (GlossaMatik) +I should do it. 我应该去做。 CC-BY 2.0 (France) Attribution: tatoeba.org #5366319 (CK) & #5911768 (verdastelo9604) +I study Korean. 我学韩语。 CC-BY 2.0 (France) Attribution: tatoeba.org #472091 (tamsanh) & #476227 (fucongcong) +I turned right. 我往右拐了。 CC-BY 2.0 (France) Attribution: tatoeba.org #258392 (CK) & #406244 (GlossaMatik) +I want the fan. 我要那個電風扇。 CC-BY 2.0 (France) Attribution: tatoeba.org #273343 (CK) & #5246179 (xjjAstrus) +I want to play. 我想去玩。 CC-BY 2.0 (France) Attribution: tatoeba.org #2011294 (CK) & #8715885 (crescat) +I want to stay. 我想要留下。 CC-BY 2.0 (France) Attribution: tatoeba.org #1887895 (CK) & #9178046 (xiaohong) +I was a doctor. 我以前是醫生。 CC-BY 2.0 (France) Attribution: tatoeba.org #2549661 (CK) & #6293088 (verdastelo9604) +I was learning. 我在學習。 CC-BY 2.0 (France) Attribution: tatoeba.org #2200277 (CM) & #6094816 (verdastelo9604) +I was mistaken. 我想错了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2247494 (CK) & #2367643 (GlossaMatik) +I was to blame. 这是我的错。 CC-BY 2.0 (France) Attribution: tatoeba.org #3374200 (CK) & #790573 (GlossaMatik) +I wasn't drunk. 我沒醉。 CC-BY 2.0 (France) Attribution: tatoeba.org #1133995 (CK) & #8215707 (verdastelo9604) +I will sue you. 我要控告你。 CC-BY 2.0 (France) Attribution: tatoeba.org #64269 (xtofu80) & #793531 (Martha) +I'd like to go. 我想要去。 CC-BY 2.0 (France) Attribution: tatoeba.org #241063 (CK) & #832461 (Martha) +I'll alert Tom. 我会警告汤姆。 CC-BY 2.0 (France) Attribution: tatoeba.org #2235745 (CK) & #5903479 (verdastelo9604) +I'll come back. 我要回来了。 CC-BY 2.0 (France) Attribution: tatoeba.org #261982 (CK) & #398080 (GlossaMatik) +I'll come back. 我会回来的。 CC-BY 2.0 (France) Attribution: tatoeba.org #261982 (CK) & #512881 (fucongcong) +I'll scold him. 我會責備他。 CC-BY 2.0 (France) Attribution: tatoeba.org #403371 (CK) & #824638 (Martha) +I'll see to it. 我會留意的。 CC-BY 2.0 (France) Attribution: tatoeba.org #321354 (CK) & #771457 (Martha) +I'll see to it. 由我来做. CC-BY 2.0 (France) Attribution: tatoeba.org #321354 (CK) & #1423490 (asosan) +I'll stay home. 我會待在家裡。 CC-BY 2.0 (France) Attribution: tatoeba.org #321732 (CK) & #819453 (Martha) +I'll treat you. 我請你。 CC-BY 2.0 (France) Attribution: tatoeba.org #17568 (CK) & #771474 (Martha) +I'm a bachelor. 我单身。 CC-BY 2.0 (France) Attribution: tatoeba.org #2713780 (CK) & #4977440 (musclegirlxyp) +I'm a bachelor. 我單身。 CC-BY 2.0 (France) Attribution: tatoeba.org #2713780 (CK) & #5691850 (xjjAstrus) +I'm a free man. 我是一個自由的人。 CC-BY 2.0 (France) Attribution: tatoeba.org #25504 (CK) & #793247 (Martha) +I'm a good guy. 我是一个好人。 CC-BY 2.0 (France) Attribution: tatoeba.org #1225236 (CK) & #1786008 (sadhen) +I'm a nice guy. 我是一个好人。 CC-BY 2.0 (France) Attribution: tatoeba.org #838729 (Scott) & #1786008 (sadhen) +I'm afraid not. 恐怕不行。 CC-BY 2.0 (France) Attribution: tatoeba.org #20899 (CK) & #429322 (GlossaMatik) +I'm all for it. 我百分之百赞成。 CC-BY 2.0 (France) Attribution: tatoeba.org #275702 (CM) & #478144 (GlossaMatik) +I'm an atheist. 我是无神论者。 CC-BY 2.0 (France) Attribution: tatoeba.org #379739 (CM) & #7771867 (jiangche) +I'm behind him. 我在他後面。 CC-BY 2.0 (France) Attribution: tatoeba.org #403370 (CK) & #825930 (Martha) +I'm busy today. 我今天忙。 CC-BY 2.0 (France) Attribution: tatoeba.org #2713779 (CK) & #8215733 (verdastelo9604) +I'm called Tom. 我叫Tom。 CC-BY 2.0 (France) Attribution: tatoeba.org #6645799 (CK) & #1850476 (egg0073) +I'm called Tom. 我叫湯姆。 CC-BY 2.0 (France) Attribution: tatoeba.org #6645799 (CK) & #6292456 (xjjAstrus) +I'm dead tired. 我累死了。 CC-BY 2.0 (France) Attribution: tatoeba.org #501385 (CK) & #333923 (fucongcong) +I'm dead tired. 困死了。 CC-BY 2.0 (France) Attribution: tatoeba.org #501385 (CK) & #2431733 (fenfang557) +I'm free today. 我今天有空。 CC-BY 2.0 (France) Attribution: tatoeba.org #257587 (CK) & #333310 (fucongcong) +I'm no quitter. 我不輕易放棄。 CC-BY 2.0 (France) Attribution: tatoeba.org #258684 (CK) & #8215727 (verdastelo9604) +I'm not famous. 我没名气。 CC-BY 2.0 (France) Attribution: tatoeba.org #3330530 (CK) & #7781730 (jiangche) +I'm not famous. 我不出名。 CC-BY 2.0 (France) Attribution: tatoeba.org #3330530 (CK) & #7781731 (jiangche) +I'm not greedy. 我不貪婪。 CC-BY 2.0 (France) Attribution: tatoeba.org #3267389 (Ricardo14) & #6333811 (verdastelo9604) +I'm not guilty. 我没有罪。 CC-BY 2.0 (France) Attribution: tatoeba.org #1563108 (CK) & #1772685 (sadhen) +I'm not stupid. 我不是笨蛋。 CC-BY 2.0 (France) Attribution: tatoeba.org #1108790 (CK) & #8698960 (crescat) +I'm so excited. 我很激动。 CC-BY 2.0 (France) Attribution: tatoeba.org #953850 (CK) & #5978316 (verdastelo9604) +I'm thirty now. 我现在30岁了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2765317 (CK) & #335364 (fucongcong) +I'm undressing. 我脱衣服。 CC-BY 2.0 (France) Attribution: tatoeba.org #1765 (Swift) & #502695 (fucongcong) +I'm vegetarian. 我是素食主义者。 CC-BY 2.0 (France) Attribution: tatoeba.org #2111671 (CK) & #510809 (fucongcong) +I'm very happy. 我很快樂。 CC-BY 2.0 (France) Attribution: tatoeba.org #255245 (CK) & #825970 (Martha) +I'm very happy. 我好高興。 CC-BY 2.0 (France) Attribution: tatoeba.org #255245 (CK) & #826258 (Martha) +I'm very happy. 我很快乐。 CC-BY 2.0 (France) Attribution: tatoeba.org #255245 (CK) & #1361961 (sadhen) +I'm very happy. 我很幸福。 CC-BY 2.0 (France) Attribution: tatoeba.org #255245 (CK) & #7767739 (jiangche) +I'm very tired. 我很累。 CC-BY 2.0 (France) Attribution: tatoeba.org #252193 (CK) & #397734 (GlossaMatik) +I've been sick. 我生病了。 CC-BY 2.0 (France) Attribution: tatoeba.org #5850952 (CK) & #780291 (Martha) +I've seen that. 我見過。 CC-BY 2.0 (France) Attribution: tatoeba.org #433647 (CK) & #824531 (Martha) +Is Tom jealous? 汤姆嫉妒吗? CC-BY 2.0 (France) Attribution: tatoeba.org #2244614 (CK) & #10752755 (GlossaMatik) +Is he Japanese? 他是日本人吗? CC-BY 2.0 (France) Attribution: tatoeba.org #1123762 (CK) & #1366051 (sadhen) +Is it too late? 来迟了吗? CC-BY 2.0 (France) Attribution: tatoeba.org #3333971 (CK) & #10002077 (GlossaMatik) +Is that better? 那更好吗? CC-BY 2.0 (France) Attribution: tatoeba.org #1886907 (CK) & #5670784 (verdastelo9604) +Is this edible? 这个能吃吗? CC-BY 2.0 (France) Attribution: tatoeba.org #2719776 (WestofEden) & #5100266 (mirrorvan) +Isn't it black? 它不是黑色的嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #442968 (CK) & #826098 (Martha) +It disappeared. 它不见了。 CC-BY 2.0 (France) Attribution: tatoeba.org #11277823 (Aphima) & #6075514 (mendel) +It is too late. 太晚了。 CC-BY 2.0 (France) Attribution: tatoeba.org #456133 (lukaszpp) & #1397366 (mtdot) +It makes sense. 那样说得通。 CC-BY 2.0 (France) Attribution: tatoeba.org #780836 (sacredceltic) & #5090960 (mirrorvan) +It took months. 它花了几个月。 CC-BY 2.0 (France) Attribution: tatoeba.org #5758387 (CM) & #5963990 (verdastelo9604) +It's brand new. 这是全新的。 CC-BY 2.0 (France) Attribution: tatoeba.org #34819 (Eldad) & #745869 (fucongcong) +It's dangerous! 它是危險的! CC-BY 2.0 (France) Attribution: tatoeba.org #433517 (CK) & #832776 (Martha) +It's delicious. 很美味。 CC-BY 2.0 (France) Attribution: tatoeba.org #2187204 (CK) & #3739208 (egg0073) +It's foggy out. 外面起霧了。 CC-BY 2.0 (France) Attribution: tatoeba.org #9926150 (sundown) & #5957545 (xjjAstrus) +It's not funny. 这不好笑。 CC-BY 2.0 (France) Attribution: tatoeba.org #1749344 (Spamster) & #1786116 (sadhen) +It's not right. 不对。 CC-BY 2.0 (France) Attribution: tatoeba.org #1723740 (Spamster) & #10961087 (xjjAstrus) +It's our fault. 它是我們的錯誤。 CC-BY 2.0 (France) Attribution: tatoeba.org #2249149 (CK) & #6146511 (verdastelo9604) +It's so boring. 真的很无聊。 CC-BY 2.0 (France) Attribution: tatoeba.org #2249242 (CK) & #9965052 (GlossaMatik) +It's the truth. 这是事实。 CC-BY 2.0 (France) Attribution: tatoeba.org #560933 (darinmex) & #819808 (fucongcong) +It's too early. 太早了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2249321 (CK) & #2007046 (sadhen) +It's too large. 它太大了。 CC-BY 2.0 (France) Attribution: tatoeba.org #435410 (CK) & #824484 (Martha) +It's up to you. 这就要看您了。 CC-BY 2.0 (France) Attribution: tatoeba.org #237713 (CK) & #501185 (fucongcong) +It's up to you. 由你來決定。 CC-BY 2.0 (France) Attribution: tatoeba.org #237713 (CK) & #834868 (Martha) +It's very cold. 非常冷。 CC-BY 2.0 (France) Attribution: tatoeba.org #435726 (CK) & #826300 (Martha) +It's very cold. 天气非常寒冷。 CC-BY 2.0 (France) Attribution: tatoeba.org #435726 (CK) & #4547211 (murr) +It's well done. 做得很好。 CC-BY 2.0 (France) Attribution: tatoeba.org #2366 (CK) & #1776598 (sadhen) +It's your book. 它是你的書。 CC-BY 2.0 (France) Attribution: tatoeba.org #515538 (CK) & #825185 (Martha) +It's your move. 該你走了。 CC-BY 2.0 (France) Attribution: tatoeba.org #16925 (CK) & #819408 (Martha) +It's your turn. 輪到您了。 CC-BY 2.0 (France) Attribution: tatoeba.org #370937 (saeb) & #734317 (Martha) +It's your turn. 輪到你了。 CC-BY 2.0 (France) Attribution: tatoeba.org #370937 (saeb) & #765859 (Martha) +Keep listening. 继续听。 CC-BY 2.0 (France) Attribution: tatoeba.org #911230 (papabear) & #5092403 (mirrorvan) +Leave it to me. 让我来弄。 CC-BY 2.0 (France) Attribution: tatoeba.org #321442 (CK) & #335500 (fucongcong) +Leave me alone! 别烦我! CC-BY 2.0 (France) Attribution: tatoeba.org #25534 (CK) & #9964362 (GlossaMatik) +Leave me alone. 让我一个人待着。 CC-BY 2.0 (France) Attribution: tatoeba.org #27641 (CK) & #8936496 (crescat) +Let me come in. 让我进去。 CC-BY 2.0 (France) Attribution: tatoeba.org #3334006 (CK) & #333350 (fucongcong) +Let me do that. 让我去做。 CC-BY 2.0 (France) Attribution: tatoeba.org #495419 (adjusting) & #347095 (fucongcong) +Let us go home. 让我们回家吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #24136 (CK) & #1506916 (fenfang557) +Let's go there. 咱去那吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #5178372 (CK) & #6938134 (Cheng) +Let's just eat. 我們吃吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #2007893 (CK) & #6105304 (verdastelo9604) +Listen to this! 听这个! CC-BY 2.0 (France) Attribution: tatoeba.org #320075 (CK) & #9932534 (SbrAkr) +Listen to this. 聽聽這個。 CC-BY 2.0 (France) Attribution: tatoeba.org #1898342 (CK) & #5344342 (egg0073) +Louder, please. 请大声一点。 CC-BY 2.0 (France) Attribution: tatoeba.org #30399 (CK) & #406714 (fucongcong) +Lunch is ready. 午餐好了。 CC-BY 2.0 (France) Attribution: tatoeba.org #3560086 (lys1123) & #884745 (Tajfun) +Lying is wrong. 说谎不好。 CC-BY 2.0 (France) Attribution: tatoeba.org #633502 (bferrant) & #343586 (fucongcong) +May I help you? 我能幫你嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #456357 (lukaszpp) & #6559076 (xjjAstrus) +May I use this? 我可以用嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #54956 (CK) & #6158452 (xjjAstrus) +My dad is busy. 我爸爸很忙。 CC-BY 2.0 (France) Attribution: tatoeba.org #4787511 (Joseph) & #332500 (fucongcong) +My nose itches. 我的鼻子好癢。 CC-BY 2.0 (France) Attribution: tatoeba.org #1369203 (sacredceltic) & #6017291 (xjjAstrus) +My tooth hurts. 我牙疼。 CC-BY 2.0 (France) Attribution: tatoeba.org #456485 (lukaszpp) & #470984 (fucongcong) +My tummy hurts. 我肚子疼。 CC-BY 2.0 (France) Attribution: tatoeba.org #4471276 (Hybrid) & #396056 (GlossaMatik) +Now I remember. 现在我想起来了。 CC-BY 2.0 (France) Attribution: tatoeba.org #72076 (CK) & #472898 (fucongcong) +Open your eyes. 睁开眼睛。 CC-BY 2.0 (France) Attribution: tatoeba.org #323768 (CK) & #8916070 (howd) +Play us a tune. 给我们弹一手。 CC-BY 2.0 (France) Attribution: tatoeba.org #815666 (CM) & #815668 (GlossaMatik) +Please come in. 請進來。 CC-BY 2.0 (France) Attribution: tatoeba.org #435705 (CK) & #824704 (Martha) +Please do that. 麻煩您那樣做。 CC-BY 2.0 (France) Attribution: tatoeba.org #441943 (CK) & #824505 (Martha) +Please help me. 請幫助我。 CC-BY 2.0 (France) Attribution: tatoeba.org #262424 (CK) & #804501 (Martha) +Please help me. 請幫我。 CC-BY 2.0 (France) Attribution: tatoeba.org #262424 (CK) & #884721 (Tajfun) +Please join us. 請加入我們。 CC-BY 2.0 (France) Attribution: tatoeba.org #3333875 (CK) & #6150018 (verdastelo9604) +Please tell me. 請告訴我。 CC-BY 2.0 (France) Attribution: tatoeba.org #2249818 (CK) & #6120892 (verdastelo9604) +Please wash it. 请清洗它。 CC-BY 2.0 (France) Attribution: tatoeba.org #2042296 (somekinda) & #1884741 (Venki) +Prices went up. 物價上漲。 CC-BY 2.0 (France) Attribution: tatoeba.org #442109 (CK) & #826138 (Martha) +Read this book. 看这本书。 CC-BY 2.0 (France) Attribution: tatoeba.org #56828 (CK) & #461535 (fucongcong) +Say it clearly. 說清楚。 CC-BY 2.0 (France) Attribution: tatoeba.org #433592 (CK) & #825177 (Martha) +Science is fun. 科學好玩。 CC-BY 2.0 (France) Attribution: tatoeba.org #2247299 (Hybrid) & #6047500 (verdastelo9604) +See you around. 再见! CC-BY 2.0 (France) Attribution: tatoeba.org #32690 (CK) & #336477 (fucongcong) +She fooled him. 她骗了他。 CC-BY 2.0 (France) Attribution: tatoeba.org #887116 (CK) & #2032218 (ydcok) +She fooled him. 她愚弄了他。 CC-BY 2.0 (France) Attribution: tatoeba.org #887116 (CK) & #4270717 (notabene) +She grew roses. 她種了玫瑰。 CC-BY 2.0 (France) Attribution: tatoeba.org #317533 (CK) & #825911 (Martha) +She hugged him. 她抱了他。 CC-BY 2.0 (France) Attribution: tatoeba.org #887217 (CK) & #8215704 (verdastelo9604) +She is a nurse. 她是护士。 CC-BY 2.0 (France) Attribution: tatoeba.org #313056 (CK) & #2779129 (iMaple) +She is dieting. 她在节食中。 CC-BY 2.0 (France) Attribution: tatoeba.org #542361 (blay_paul) & #1878324 (sadhen) +She is dieting. 她在节食。 CC-BY 2.0 (France) Attribution: tatoeba.org #542361 (blay_paul) & #7767995 (jiangche) +She is walking. 她在行走。 CC-BY 2.0 (France) Attribution: tatoeba.org #1202628 (etoile) & #5092290 (mirrorvan) +She looked sad. 她看上去很伤心。 CC-BY 2.0 (France) Attribution: tatoeba.org #316541 (CK) & #334870 (fucongcong) +She might come. 她也許會來。 CC-BY 2.0 (France) Attribution: tatoeba.org #388733 (CK) & #826122 (Martha) +She seems rich. 她看來有錢。 CC-BY 2.0 (France) Attribution: tatoeba.org #313318 (CK) & #6093377 (verdastelo9604) +Shut your eyes. 闭上你们的眼睛。 CC-BY 2.0 (France) Attribution: tatoeba.org #1883049 (Spamster) & #1661563 (sadhen) +Smoke appeared. 烟雾出现了。 CC-BY 2.0 (France) Attribution: tatoeba.org #680229 (Source_VOA) & #5102239 (mirrorvan) +Someone called. 有人打電話來。 CC-BY 2.0 (France) Attribution: tatoeba.org #765402 (Martha) & #765386 (Martha) +Sorry I'm late. 对不起,我迟到了。 CC-BY 2.0 (France) Attribution: tatoeba.org #808702 (ryanthewired) & #444740 (fucongcong) +Stop grumbling. 停止发牢骚吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #18356 (CK) & #5092142 (mirrorvan) +Stop resisting! 停止抵抗! CC-BY 2.0 (France) Attribution: tatoeba.org #684473 (CM) & #5102240 (mirrorvan) +Summer is over. 夏天过去了。 CC-BY 2.0 (France) Attribution: tatoeba.org #394438 (doviende) & #7774794 (jiangche) +Take your time. 你可以慢慢来。 CC-BY 2.0 (France) Attribution: tatoeba.org #30121 (CK) & #334393 (fucongcong) +Take your time. 慢慢来。 CC-BY 2.0 (France) Attribution: tatoeba.org #30121 (CK) & #334395 (fucongcong) +That was wrong. 那样是错的。 CC-BY 2.0 (France) Attribution: tatoeba.org #2250989 (CK) & #5096414 (mirrorvan) +That's a shame. 那是一個恥辱。 CC-BY 2.0 (France) Attribution: tatoeba.org #435170 (CK) & #824604 (Martha) +That's logical. 那符合逻辑。 CC-BY 2.0 (France) Attribution: tatoeba.org #2187259 (CK) & #7068906 (la_kanro) +That's my coat. 那是我的大衣。 CC-BY 2.0 (France) Attribution: tatoeba.org #3622101 (weihaiping) & #471091 (fucongcong) +That's my goal. 这是我的目的。 CC-BY 2.0 (France) Attribution: tatoeba.org #2256892 (CK) & #9961355 (GlossaMatik) +That's perfect. 那是完美的。 CC-BY 2.0 (France) Attribution: tatoeba.org #1897814 (CK) & #5650533 (verdastelo9604) +That's strange. 奇怪。 CC-BY 2.0 (France) Attribution: tatoeba.org #320326 (CK) & #917754 (GlossaMatik) +That's too bad. 太可惜了! CC-BY 2.0 (France) Attribution: tatoeba.org #433625 (CK) & #332578 (fucongcong) +That's too bad. 多遗憾啊! CC-BY 2.0 (France) Attribution: tatoeba.org #433625 (CK) & #469440 (fucongcong) +That's too bad. 那太糟糕了。 CC-BY 2.0 (France) Attribution: tatoeba.org #433625 (CK) & #826217 (Martha) +The birds sang. 鳥兒歌唱。 CC-BY 2.0 (France) Attribution: tatoeba.org #278157 (CK) & #819283 (Martha) +The cat meowed. 貓叫了叫。 CC-BY 2.0 (France) Attribution: tatoeba.org #2549627 (CK) & #5670731 (verdastelo9604) +The flag is up. 旗子升起了。 CC-BY 2.0 (France) Attribution: tatoeba.org #20530 (CK) & #813491 (fucongcong) +The phone rang. 電話正在響。 CC-BY 2.0 (France) Attribution: tatoeba.org #2257534 (CK) & #710667 (egg0073) +Their eyes met. 他們目光相接。 CC-BY 2.0 (France) Attribution: tatoeba.org #323737 (CK) & #6109301 (verdastelo9604) +These are pens. 這些是筆。 CC-BY 2.0 (France) Attribution: tatoeba.org #737644 (CM) & #780043 (Martha) +They hated Tom. 他們恨湯姆。 CC-BY 2.0 (France) Attribution: tatoeba.org #305951 (CK) & #824618 (Martha) +They have jobs. 他們有工作。 CC-BY 2.0 (France) Attribution: tatoeba.org #4397559 (CK) & #6624644 (verdastelo9604) +They let me go. 他們讓我走。 CC-BY 2.0 (France) Attribution: tatoeba.org #495626 (CM) & #765254 (Martha) +They love that. 他们喜欢那个 CC-BY 2.0 (France) Attribution: tatoeba.org #2243246 (CK) & #5975065 (zhangxr91) +They trust Tom. 他们信任汤姆。 CC-BY 2.0 (France) Attribution: tatoeba.org #2235922 (CK) & #5907509 (verdastelo9604) +They want more. 他們想要更多。 CC-BY 2.0 (France) Attribution: tatoeba.org #1820314 (Spamster) & #4754636 (egg0073) +They want this. 他們想要這箇。 CC-BY 2.0 (France) Attribution: tatoeba.org #2252724 (CK) & #6098442 (verdastelo9604) +They were good. 他們不錯。 CC-BY 2.0 (France) Attribution: tatoeba.org #2243383 (CK) & #5569554 (verdastelo9604) +This is a book. 这是一本书。 CC-BY 2.0 (France) Attribution: tatoeba.org #55399 (CK) & #336921 (fucongcong) +This is a fake. 这是一个伪造品。 CC-BY 2.0 (France) Attribution: tatoeba.org #2549624 (CK) & #630264 (CLARET) +This is a fish. 這是一條魚。 CC-BY 2.0 (France) Attribution: tatoeba.org #2629585 (CM) & #2629586 (egg0073) +This is a test. 这是一个测试。 CC-BY 2.0 (France) Attribution: tatoeba.org #2573684 (Hybrid) & #8602039 (mikeee) +This is my bag. 那是我的包。 CC-BY 2.0 (France) Attribution: tatoeba.org #55628 (jakov) & #2040518 (sadhen) +This isn't new. 这不是新的。 CC-BY 2.0 (France) Attribution: tatoeba.org #2233758 (CK) & #10260739 (GlossaMatik) +Tom can change. 湯姆能改變。 CC-BY 2.0 (France) Attribution: tatoeba.org #4496506 (CK) & #6114396 (verdastelo9604) +Tom can't stay. 汤姆不能留下。 CC-BY 2.0 (France) Attribution: tatoeba.org #1868426 (CK) & #9178012 (xiaohong) +Tom can't swim. 汤姆不会游泳。 CC-BY 2.0 (France) Attribution: tatoeba.org #1026731 (CK) & #5072434 (musclegirlxyp) +Tom can't walk. 汤姆不能走路了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1868425 (CK) & #9960184 (GlossaMatik) +Tom got fatter. 汤姆胖了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2236323 (CK) & #4977399 (musclegirlxyp) +Tom has a plan. 湯姆有個計畫。 CC-BY 2.0 (France) Attribution: tatoeba.org #2649102 (CK) & #6075556 (verdastelo9604) +Tom has brains. 汤姆脑子好使。 CC-BY 2.0 (France) Attribution: tatoeba.org #8589486 (CK) & #5072415 (musclegirlxyp) +Tom has failed. 汤姆失败了。 CC-BY 2.0 (France) Attribution: tatoeba.org #4667266 (CK) & #8671326 (crescat) +Tom is a rabbi. 汤姆是个拉比。 CC-BY 2.0 (France) Attribution: tatoeba.org #1494868 (Spamster) & #5983579 (verdastelo9604) +Tom is married. 汤姆已经结婚了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1868191 (CK) & #9961309 (GlossaMatik) +Tom is miserly. 汤姆很小气。 CC-BY 2.0 (France) Attribution: tatoeba.org #2236774 (CK) & #4264932 (notabene) +Tom is no fool. 汤姆不是傻瓜。 CC-BY 2.0 (France) Attribution: tatoeba.org #2273328 (CK) & #4879070 (musclegirlxyp) +Tom is no fool. 汤姆不是白痴。 CC-BY 2.0 (France) Attribution: tatoeba.org #2273328 (CK) & #10260786 (GlossaMatik) +Tom is sloshed. 汤姆醉了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2203365 (CK) & #5142201 (musclegirlxyp) +Tom is smashed. 汤姆醉了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2203374 (CK) & #5142201 (musclegirlxyp) +Tom isn't dumb. 汤姆不傻。 CC-BY 2.0 (France) Attribution: tatoeba.org #2236962 (CK) & #5091664 (mirrorvan) +Tom likes tofu. 汤姆喜欢豆腐。 CC-BY 2.0 (France) Attribution: tatoeba.org #6608788 (Hybrid) & #9932446 (GlossaMatik) +Tom lives here. 汤姆住在这里。 CC-BY 2.0 (France) Attribution: tatoeba.org #2237182 (CK) & #5613703 (verdastelo9604) +Tom looks pale. 湯姆看起來很蒼白。 CC-BY 2.0 (France) Attribution: tatoeba.org #37170 (CK) & #826200 (Martha) +Tom loves dogs. 汤姆喜欢狗。 CC-BY 2.0 (France) Attribution: tatoeba.org #2244696 (CK) & #7771665 (jiangche) +Tom seems nice. 汤姆看着是个好人。 CC-BY 2.0 (France) Attribution: tatoeba.org #1867923 (CK) & #8879824 (crescat) +Tom turned red. 汤姆脸红了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2238843 (CK) & #5092418 (mirrorvan) +Tom walked out. 湯姆走了出去。 CC-BY 2.0 (France) Attribution: tatoeba.org #2261170 (CK) & #6206740 (verdastelo9604) +Tom was crying. 汤姆当时在哭。 CC-BY 2.0 (France) Attribution: tatoeba.org #1488808 (Spamster) & #5114279 (musclegirlxyp) +Tom was humble. 湯姆曾是謙遜的。 CC-BY 2.0 (France) Attribution: tatoeba.org #3171136 (CK) & #7980250 (Leolaaziano) +Tom went blind. 汤姆失明了。 CC-BY 2.0 (France) Attribution: tatoeba.org #3171099 (CK) & #4972485 (wzhd) +Tom won't stop. 湯姆不會停。 CC-BY 2.0 (France) Attribution: tatoeba.org #2240229 (CK) & #8215700 (verdastelo9604) +Tom's Canadian. 汤姆是加拿大人。 CC-BY 2.0 (France) Attribution: tatoeba.org #2107460 (CK) & #10696148 (GlossaMatik) +Tom's bleeding. 汤姆在流血。 CC-BY 2.0 (France) Attribution: tatoeba.org #2107456 (CK) & #10182726 (slo_oth) +Tom's diabetic. 汤姆是糖尿病患者。 CC-BY 2.0 (France) Attribution: tatoeba.org #2107488 (CK) & #6774616 (basilhan) +Tom's fearless. 汤姆无所畏惧。 CC-BY 2.0 (France) Attribution: tatoeba.org #2107511 (CK) & #2188407 (sadhen) +Tom's grinning. 汤姆露齿而笑。 CC-BY 2.0 (France) Attribution: tatoeba.org #2107526 (CK) & #10021278 (GlossaMatik) +Tom's laughing. 汤姆在笑。 CC-BY 2.0 (France) Attribution: tatoeba.org #2107557 (CK) & #5072342 (musclegirlxyp) +Tom's out cold. 汤姆正昏迷不醒。 CC-BY 2.0 (France) Attribution: tatoeba.org #3171072 (CK) & #8725793 (crescat) +Tom's thrilled. 汤姆兴奋不已。 CC-BY 2.0 (France) Attribution: tatoeba.org #2107625 (CK) & #5094100 (mirrorvan) +Tom, answer me! 湯姆,回答我! CC-BY 2.0 (France) Attribution: tatoeba.org #1877129 (Spamster) & #6579316 (xjjAstrus) +Try once again. 再試一次。 CC-BY 2.0 (France) Attribution: tatoeba.org #2264432 (sharptoothed) & #824621 (Martha) +Turn on the TV. 开电视。 CC-BY 2.0 (France) Attribution: tatoeba.org #1180903 (treskro3) & #472986 (fucongcong) +Turn up the TV. 把电视声音调大点儿。 CC-BY 2.0 (France) Attribution: tatoeba.org #39214 (CK) & #1411619 (asosan) +Was Tom asleep? 汤姆睡着了吗? CC-BY 2.0 (France) Attribution: tatoeba.org #3738354 (CK) & #5865518 (verdastelo9604) +Wash your feet. 洗您的脚。 CC-BY 2.0 (France) Attribution: tatoeba.org #274488 (adjusting) & #487590 (fucongcong) +Wash your feet. 洗你的脚。 CC-BY 2.0 (France) Attribution: tatoeba.org #274488 (adjusting) & #487593 (fucongcong) +Watch yourself. 自己当心啊。 CC-BY 2.0 (France) Attribution: tatoeba.org #64496 (CK) & #5102151 (mirrorvan) +We forgive you. 我們原諒你。 CC-BY 2.0 (France) Attribution: tatoeba.org #2241093 (CK) & #6068357 (verdastelo9604) +We knew no one. 我們誰也不認識。 CC-BY 2.0 (France) Attribution: tatoeba.org #3733204 (CK) & #6131465 (verdastelo9604) +We need a hero. 我們需要英雄。 CC-BY 2.0 (France) Attribution: tatoeba.org #2649076 (CK) & #8215716 (verdastelo9604) +We study music. 我们学习音乐。 CC-BY 2.0 (France) Attribution: tatoeba.org #247742 (CK) & #1358711 (sadhen) +We were robbed. 我們被偷了。 CC-BY 2.0 (France) Attribution: tatoeba.org #4397511 (CK) & #6284532 (xjjAstrus) +We'll continue. 我们要继续下去。 CC-BY 2.0 (France) Attribution: tatoeba.org #2203625 (CK) & #7768123 (jiangche) +We're a family. 我們是個家庭。 CC-BY 2.0 (France) Attribution: tatoeba.org #2240835 (CK) & #6936397 (verdastelo9604) +We're involved. 我们正参与。 CC-BY 2.0 (France) Attribution: tatoeba.org #2203037 (CK) & #10513304 (GlossaMatik) +We're not late. 我们没迟到。 CC-BY 2.0 (France) Attribution: tatoeba.org #2240626 (CK) & #4456370 (plutowu) +Well, let's go. 好吧,我們走吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #410596 (CK) & #832441 (Martha) +Were you happy? 你开心吗? CC-BY 2.0 (France) Attribution: tatoeba.org #2044396 (CK) & #8924804 (crescat) +Were you right? 你是对的吗? CC-BY 2.0 (France) Attribution: tatoeba.org #2254510 (CK) & #5640753 (verdastelo9604) +What about you? 你們呢? CC-BY 2.0 (France) Attribution: tatoeba.org #1642551 (CK) & #1623187 (egg0073) +What about you? 您呢? CC-BY 2.0 (France) Attribution: tatoeba.org #1642551 (CK) & #1623188 (Yashanti) +What do you do? 你的職業是什麼? CC-BY 2.0 (France) Attribution: tatoeba.org #17125 (CK) & #908379 (Martha) +What'll you do? 你要做什么? CC-BY 2.0 (France) Attribution: tatoeba.org #2892667 (CK) & #9963161 (GlossaMatik) +What's her job? 她做什麼工作? CC-BY 2.0 (France) Attribution: tatoeba.org #3205365 (CM) & #5640735 (verdastelo9604) +Where do we go? 我们去哪儿? CC-BY 2.0 (France) Attribution: tatoeba.org #2649070 (CK) & #471103 (fucongcong) +Where were you? 之前你在哪里? CC-BY 2.0 (France) Attribution: tatoeba.org #16486 (CK) & #1778322 (sadhen) +Who's at fault? 是誰的錯呢? CC-BY 2.0 (France) Attribution: tatoeba.org #441941 (CM) & #824533 (Martha) +Who's that guy? 那家伙是谁? CC-BY 2.0 (France) Attribution: tatoeba.org #2254911 (CK) & #5595183 (verdastelo9604) +Who's that man? 那男人是谁? CC-BY 2.0 (France) Attribution: tatoeba.org #1886552 (CK) & #7773140 (jiangche) +Who's to blame? 是誰的錯呢? CC-BY 2.0 (France) Attribution: tatoeba.org #2057762 (CK) & #824533 (Martha) +Why do you ask? 你問這個幹什麼? CC-BY 2.0 (France) Attribution: tatoeba.org #1368 (CK) & #56 (fucongcong) +Why is he here? 为什么他在这儿? CC-BY 2.0 (France) Attribution: tatoeba.org #36344 (CK) & #408248 (fucongcong) +Wipe your eyes. 擦擦你的眼睛。 CC-BY 2.0 (France) Attribution: tatoeba.org #3735829 (CK) & #6198252 (verdastelo9604) +Yes, I know it. 是的,我知道。 CC-BY 2.0 (France) Attribution: tatoeba.org #433589 (CK) & #834241 (Martha) +Yes, of course. 当然是的。 CC-BY 2.0 (France) Attribution: tatoeba.org #30530 (Zifre) & #421347 (GlossaMatik) +Yes, of course. 是的,當然。 CC-BY 2.0 (France) Attribution: tatoeba.org #30530 (Zifre) & #712982 (egg0073) +You are stupid. 你很愚蠢。 CC-BY 2.0 (France) Attribution: tatoeba.org #69480 (CM) & #993698 (leoyzy) +You have to go. 你們得走了。 CC-BY 2.0 (France) Attribution: tatoeba.org #16159 (xtofu80) & #1740732 (egg0073) +You look bored. 你看起來很無聊。 CC-BY 2.0 (France) Attribution: tatoeba.org #15918 (CK) & #825165 (Martha) +You look tense. 你看起来很紧张。 CC-BY 2.0 (France) Attribution: tatoeba.org #2255126 (CK) & #3289653 (sadhen) +You look tired. 你看起來很疲倦。 CC-BY 2.0 (France) Attribution: tatoeba.org #63218 (CK) & #819306 (Martha) +You look tired. 你看起来很困了。 CC-BY 2.0 (France) Attribution: tatoeba.org #63218 (CK) & #5097669 (mirrorvan) +You must do it. 你必須去做。 CC-BY 2.0 (France) Attribution: tatoeba.org #770110 (marloncori) & #770244 (Martha) +You must leave. 你必须走。 CC-BY 2.0 (France) Attribution: tatoeba.org #407094 (CM) & #407097 (GlossaMatik) +You need to go. 你們得走了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2649063 (CK) & #1740732 (egg0073) +You'll love it. 你會愛它。 CC-BY 2.0 (France) Attribution: tatoeba.org #2255375 (CK) & #6065877 (verdastelo9604) +You're a woman. 你是个女人。 CC-BY 2.0 (France) Attribution: tatoeba.org #1228740 (CM) & #9961365 (GlossaMatik) +You're kidding! 你開玩笑吧! CC-BY 2.0 (France) Attribution: tatoeba.org #433881 (CK) & #819312 (Martha) +You're my hero. 你是我的英雄。 CC-BY 2.0 (France) Attribution: tatoeba.org #1895594 (CK) & #3709591 (egg0073) +You're sloshed. 你們醉了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2203364 (CK) & #6608082 (xjjAstrus) +You're sloshed. 你們喝多了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2203364 (CK) & #6608084 (xjjAstrus) +You're welcome. 您不必感谢我。 CC-BY 2.0 (France) Attribution: tatoeba.org #403068 (Ramses) & #7767730 (jiangche) +A man must work. 男人应该工作。 CC-BY 2.0 (France) Attribution: tatoeba.org #270113 (CM) & #334672 (fucongcong) +Anyone can join. 谁都可以参加。 CC-BY 2.0 (France) Attribution: tatoeba.org #5758358 (CM) & #9962353 (GlossaMatik) +Are we finished? 我们完成了吗? CC-BY 2.0 (France) Attribution: tatoeba.org #2244924 (CK) & #1783788 (sadhen) +Are you at home? 你在家里吗? CC-BY 2.0 (France) Attribution: tatoeba.org #405500 (CK) & #406192 (GlossaMatik) +Are you certain? 你确定? CC-BY 2.0 (France) Attribution: tatoeba.org #1356753 (sacredceltic) & #4208543 (Ethan_lin) +Are you friends? 你們是朋友嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #7787226 (sharris123) & #6047118 (xjjAstrus) +Are you friends? 你们是朋友? CC-BY 2.0 (France) Attribution: tatoeba.org #7787226 (sharris123) & #10696113 (GlossaMatik) +Are you friends? 你们是朋友吗? CC-BY 2.0 (France) Attribution: tatoeba.org #7787226 (sharris123) & #10966829 (xjjAstrus) +Are you kidding? 你在开玩笑吗? CC-BY 2.0 (France) Attribution: tatoeba.org #270147 (CK) & #7768013 (jiangche) +Are you married? 您成家了吗? CC-BY 2.0 (France) Attribution: tatoeba.org #413058 (CM) & #413061 (GlossaMatik) +Are you nervous? 你紧张吗? CC-BY 2.0 (France) Attribution: tatoeba.org #2244956 (CK) & #8696388 (morningstar) +Are you over 18? 你有18歲了嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #2900555 (Hybrid) & #6114400 (verdastelo9604) +Are you serious? 你是认真的吗? CC-BY 2.0 (France) Attribution: tatoeba.org #373215 (kotobaboke) & #4887667 (musclegirlxyp) +Are you serious? 你认真的? CC-BY 2.0 (France) Attribution: tatoeba.org #373215 (kotobaboke) & #10024445 (GlossaMatik) +Are you serious? 认真的? CC-BY 2.0 (France) Attribution: tatoeba.org #373215 (kotobaboke) & #10983988 (Elaineeeeee) +Are you thirsty? 你渴吗? CC-BY 2.0 (France) Attribution: tatoeba.org #434258 (lukaszpp) & #3365590 (go_oo) +Are you working? 你在上班嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #245411 (CK) & #5999024 (xjjAstrus) +Aren't you cold? 你不冷吗? CC-BY 2.0 (France) Attribution: tatoeba.org #2244975 (CK) & #8673739 (crescat) +Balls are round. 球是圆的。 CC-BY 2.0 (France) Attribution: tatoeba.org #33654 (CK) & #1397373 (mtdot) +Be happy for me. 爲我高興吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #2044400 (CK) & #5691285 (verdastelo9604) +Be more precise. 更清晰些。 CC-BY 2.0 (France) Attribution: tatoeba.org #2244994 (CK) & #9961446 (GlossaMatik) +Behave yourself. 规矩点。 CC-BY 2.0 (France) Attribution: tatoeba.org #64491 (CK) & #5092247 (mirrorvan) +Black suits you. 黑色很衬你。 CC-BY 2.0 (France) Attribution: tatoeba.org #3140021 (Marissa) & #408242 (fucongcong) +Boil some water. 烧一点水。 CC-BY 2.0 (France) Attribution: tatoeba.org #64141 (CK) & #392263 (fucongcong) +Bring him to me. 把他给我带过来。 CC-BY 2.0 (France) Attribution: tatoeba.org #932524 (FeuDRenais) & #9970076 (GlossaMatik) +Call me, please. 请给我打电话。 CC-BY 2.0 (France) Attribution: tatoeba.org #8794857 (dq) & #8933788 (crescat) +Call my husband. 给我老公打电话。 CC-BY 2.0 (France) Attribution: tatoeba.org #1730012 (CM) & #10199327 (slo_oth) +Call the police! 叫警察! CC-BY 2.0 (France) Attribution: tatoeba.org #1718 (CK) & #1205903 (cienias) +Call the police! 报警! CC-BY 2.0 (France) Attribution: tatoeba.org #1718 (CK) & #1411630 (asosan) +Call the police. 报警! CC-BY 2.0 (France) Attribution: tatoeba.org #2245030 (CK) & #1411630 (asosan) +Can I bring Tom? 我可以带上汤姆吗? CC-BY 2.0 (France) Attribution: tatoeba.org #2261175 (CK) & #8888287 (crescat) +Can I come over? 我能去你那吗? CC-BY 2.0 (France) Attribution: tatoeba.org #2173923 (Hybrid) & #10617829 (han637376) +Can Tom help us? 汤姆可以帮我们吗? CC-BY 2.0 (France) Attribution: tatoeba.org #1886268 (CK) & #8809754 (crescat) +Can you feel it? 你感觉得到它吗? CC-BY 2.0 (France) Attribution: tatoeba.org #3327479 (CK) & #10699361 (GlossaMatik) +Can you find it? 你能找到它嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #239285 (adjusting) & #826199 (Martha) +Can you hear me? 你听得见吗? CC-BY 2.0 (France) Attribution: tatoeba.org #250795 (CK) & #333415 (fucongcong) +Can you help me? 您能幫我嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #434410 (lukaszpp) & #4071817 (egg0073) +Can you help me? 你能幫我嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #434410 (lukaszpp) & #6559040 (xjjAstrus) +Can you help me? 您能帮我吗? CC-BY 2.0 (France) Attribution: tatoeba.org #434410 (lukaszpp) & #7772052 (jiangche) +Can you help us? 你能幫我們嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #1886253 (CK) & #8215708 (verdastelo9604) +Can you whistle? 你会吹口哨吗? CC-BY 2.0 (France) Attribution: tatoeba.org #2245065 (CK) & #10260714 (GlossaMatik) +Clean your room. 清掃你的房間。 CC-BY 2.0 (France) Attribution: tatoeba.org #435774 (CK) & #771567 (Martha) +Clean your room. 打扫一下你的房间。 CC-BY 2.0 (France) Attribution: tatoeba.org #435774 (CK) & #7768207 (jiangche) +Close your eyes. 闭上你的眼睛。 CC-BY 2.0 (France) Attribution: tatoeba.org #434446 (lukaszpp) & #405129 (fucongcong) +Close your eyes. 闭上你们的眼睛。 CC-BY 2.0 (France) Attribution: tatoeba.org #434446 (lukaszpp) & #1661563 (sadhen) +Come if you can. 你能来就来! CC-BY 2.0 (France) Attribution: tatoeba.org #450074 (CK) & #804811 (fucongcong) +Come if you can. 如果你能就來吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #450074 (CK) & #825163 (Martha) +Congratulations! 祝贺你。 CC-BY 2.0 (France) Attribution: tatoeba.org #1437 (CK) & #335058 (fucongcong) +Congratulations! 恭喜! CC-BY 2.0 (France) Attribution: tatoeba.org #1437 (CK) & #4990053 (boanw) +Congratulations! 恭喜你! CC-BY 2.0 (France) Attribution: tatoeba.org #1437 (CK) & #9992054 (GlossaMatik) +Congratulations! 祝贺! CC-BY 2.0 (France) Attribution: tatoeba.org #1437 (CK) & #10066362 (CreeperVLin) +Count to thirty. 数到三十。 CC-BY 2.0 (France) Attribution: tatoeba.org #707526 (papabear) & #710390 (fucongcong) +Did Tom respond? 汤姆有回应了吗? CC-BY 2.0 (France) Attribution: tatoeba.org #2235681 (CK) & #4885087 (musclegirlxyp) +Did Tom say who? 湯姆說是誰了嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #2891039 (CK) & #5640741 (verdastelo9604) +Did you miss me? 你想我了? CC-BY 2.0 (France) Attribution: tatoeba.org #1561 (CK) & #334429 (fucongcong) +Did you take it? 你拿吗? CC-BY 2.0 (France) Attribution: tatoeba.org #3731817 (CM) & #6850327 (mao) +Do you eat meat? 您吃不吃肉? CC-BY 2.0 (France) Attribution: tatoeba.org #427988 (CM) & #427989 (GlossaMatik) +Do you go often? 您经常去吗? CC-BY 2.0 (France) Attribution: tatoeba.org #1043614 (Brian255) & #785919 (fucongcong) +Do you have one? 你有嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #16547 (CK) & #793230 (Martha) +Do you know him? 你认识他吗? CC-BY 2.0 (France) Attribution: tatoeba.org #69003 (CK) & #431556 (fucongcong) +Do you know him? 你认识他吗? CC-BY 2.0 (France) Attribution: tatoeba.org #69003 (CK) & #10966855 (xjjAstrus) +Do you know why? 您知道为什么吗? CC-BY 2.0 (France) Attribution: tatoeba.org #2891110 (CK) & #10695962 (GlossaMatik) +Do you like rap? 你喜欢说唱音乐吗? CC-BY 2.0 (France) Attribution: tatoeba.org #2310 (CK) & #1776572 (sadhen) +Do you remember? 你记得吗? CC-BY 2.0 (France) Attribution: tatoeba.org #21678 (CK) & #444736 (fucongcong) +Do you watch TV? 您看电视吗? CC-BY 2.0 (France) Attribution: tatoeba.org #1626139 (CM) & #405016 (fucongcong) +Does love exist? 愛存在嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #1743386 (CM) & #3957689 (egg0073) +Does that count? 那算数吗? CC-BY 2.0 (France) Attribution: tatoeba.org #2245285 (CK) & #10695968 (GlossaMatik) +Don't be fooled. 別被騙了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2245300 (CK) & #6105191 (verdastelo9604) +Don't bother me. 别来烦我。 CC-BY 2.0 (France) Attribution: tatoeba.org #1488089 (arnxy20) & #1505477 (fenfang557) +Don't follow me. 别跟着来啊。 CC-BY 2.0 (France) Attribution: tatoeba.org #1849386 (CK) & #4885130 (musclegirlxyp) +Don't forget me. 別忘了我。 CC-BY 2.0 (France) Attribution: tatoeba.org #3733064 (CK) & #6325084 (verdastelo9604) +Don't forget us. 别忘了我们。 CC-BY 2.0 (France) Attribution: tatoeba.org #2003078 (AlanF_US) & #7769301 (jiangche) +Don't open that. 別打開。 CC-BY 2.0 (France) Attribution: tatoeba.org #2245363 (CK) & #5842630 (verdastelo9604) +Don't run risks. 不要冒险。 CC-BY 2.0 (France) Attribution: tatoeba.org #20715 (al_ex_an_der) & #819827 (fucongcong) +Don't tell lies. 别说谎! CC-BY 2.0 (France) Attribution: tatoeba.org #65615 (CK) & #796697 (fucongcong) +Don't trust him. 你别相信他。 CC-BY 2.0 (France) Attribution: tatoeba.org #307858 (brauliobezerra) & #1750369 (sadhen) +Don't you agree? 你不同意吗? CC-BY 2.0 (France) Attribution: tatoeba.org #2136815 (GLOBULE38) & #7768002 (jiangche) +Don't you agree? 您不同意吗? CC-BY 2.0 (France) Attribution: tatoeba.org #2136815 (GLOBULE38) & #7768003 (jiangche) +Drive carefully. 安全地駕駛。 CC-BY 2.0 (France) Attribution: tatoeba.org #265500 (CK) & #819285 (Martha) +Drive carefully. 开车小心点。 CC-BY 2.0 (France) Attribution: tatoeba.org #265500 (CK) & #5102177 (mirrorvan) +Eat more slowly. 慢点吃! CC-BY 2.0 (France) Attribution: tatoeba.org #4630811 (CK) & #10260718 (GlossaMatik) +Everyone was OK. 大家都还行。 CC-BY 2.0 (France) Attribution: tatoeba.org #4401086 (CK) & #5091089 (mirrorvan) +Follow that car. 跟上那辆车。 CC-BY 2.0 (France) Attribution: tatoeba.org #1300736 (CK) & #4970157 (wzhd) +Get off my lawn. 滚出我的草坪! CC-BY 2.0 (France) Attribution: tatoeba.org #1934830 (Spamster) & #9958199 (GlossaMatik) +Get out of here. 離開這裡。 CC-BY 2.0 (France) Attribution: tatoeba.org #62081 (CK) & #826233 (Martha) +Give Tom a hand. 幫湯姆一把。 CC-BY 2.0 (France) Attribution: tatoeba.org #2261873 (CK) & #6128506 (verdastelo9604) +Give it to them. 把它给他们。 CC-BY 2.0 (France) Attribution: tatoeba.org #626780 (Archibald) & #792890 (fucongcong) +Give me my beer. 把我的啤酒給我。 CC-BY 2.0 (France) Attribution: tatoeba.org #3151514 (CK) & #8215732 (verdastelo9604) +Go home quickly. 赶快回家。 CC-BY 2.0 (France) Attribution: tatoeba.org #274014 (CK) & #5092584 (mirrorvan) +Go to the patio. 去露台。 CC-BY 2.0 (France) Attribution: tatoeba.org #434798 (lukaszpp) & #1397108 (mtdot) +Green suits you. 綠色適合你。 CC-BY 2.0 (France) Attribution: tatoeba.org #17538 (CK) & #824561 (Martha) +Happy Halloween! 万圣节快乐! CC-BY 2.0 (France) Attribution: tatoeba.org #34980 (gin) & #343668 (fucongcong) +Has he come yet? 他已经来了吗? CC-BY 2.0 (France) Attribution: tatoeba.org #293048 (CK) & #4267322 (notabene) +Have a nice day. 祝你一天过得愉快。 CC-BY 2.0 (France) Attribution: tatoeba.org #30085 (CK) & #336675 (fucongcong) +He acts quickly. 他行动迅速。 CC-BY 2.0 (France) Attribution: tatoeba.org #288254 (CM) & #1888657 (Venki) +He began to cry. 他开始哭了。 CC-BY 2.0 (France) Attribution: tatoeba.org #295240 (CK) & #5715130 (verdastelo9604) +He can't be ill. 他不可能生病了。 CC-BY 2.0 (France) Attribution: tatoeba.org #284135 (CK) & #347069 (fucongcong) +He has gone mad. 他疯了。 CC-BY 2.0 (France) Attribution: tatoeba.org #295109 (CK) & #1417582 (sadhen) +He is a teacher. 他是教师。 CC-BY 2.0 (France) Attribution: tatoeba.org #295346 (CK) & #7768344 (jiangche) +He is a teacher. 他是老师。 CC-BY 2.0 (France) Attribution: tatoeba.org #295346 (CK) & #7768345 (jiangche) +He is my father. 他是我父親。 CC-BY 2.0 (France) Attribution: tatoeba.org #297979 (eS) & #796081 (Martha) +He is very kind. 他非常親切。 CC-BY 2.0 (France) Attribution: tatoeba.org #480142 (CK) & #819413 (Martha) +He is very tall. 他很高。 CC-BY 2.0 (France) Attribution: tatoeba.org #292154 (CK) & #1361951 (sadhen) +He just arrived. 他刚到。 CC-BY 2.0 (France) Attribution: tatoeba.org #451727 (CM) & #451439 (fucongcong) +He likes Disney. 他喜欢迪士尼。 CC-BY 2.0 (France) Attribution: tatoeba.org #288037 (CK) & #347030 (fucongcong) +He looks strong. 他看起來很強壯。 CC-BY 2.0 (France) Attribution: tatoeba.org #295303 (CK) & #825904 (Martha) +He loves trains. 他喜歡火車。 CC-BY 2.0 (France) Attribution: tatoeba.org #489677 (CK) & #826287 (Martha) +He pressured me. 他向我施壓。 CC-BY 2.0 (France) Attribution: tatoeba.org #1902518 (blay_paul) & #5595163 (verdastelo9604) +He studied hard. 他努力學習。 CC-BY 2.0 (France) Attribution: tatoeba.org #1908967 (Spamster) & #6103217 (verdastelo9604) +He swindled her. 他欺骗了她。 CC-BY 2.0 (France) Attribution: tatoeba.org #302875 (CK) & #1704363 (sadhen) +He tires easily. 他很容易觉得累。 CC-BY 2.0 (France) Attribution: tatoeba.org #997850 (NickC) & #335106 (fucongcong) +He walks slowly. 他慢慢地走。 CC-BY 2.0 (France) Attribution: tatoeba.org #293207 (CK) & #512111 (fucongcong) +He was very old. 他很老。 CC-BY 2.0 (France) Attribution: tatoeba.org #291592 (CK) & #1533413 (CLARET) +He will survive. 他會倖存。 CC-BY 2.0 (France) Attribution: tatoeba.org #2025437 (Spamster) & #6151302 (verdastelo9604) +He's a comedian. 他是喜剧演员。 CC-BY 2.0 (France) Attribution: tatoeba.org #327941 (CK) & #808215 (fucongcong) +He's a good lad. 他是個好人。 CC-BY 2.0 (France) Attribution: tatoeba.org #2675712 (FeuDRenais) & #780339 (Martha) +He's a tall boy. 他是一个高大的男孩。 CC-BY 2.0 (France) Attribution: tatoeba.org #714434 (CM) & #714432 (Yashanti) +He's not a hero. 他不是英雄。 CC-BY 2.0 (France) Attribution: tatoeba.org #1815763 (Spamster) & #5613619 (verdastelo9604) +He's not stupid. 他不是傻子。 CC-BY 2.0 (France) Attribution: tatoeba.org #526990 (CM) & #429141 (fucongcong) +He's very angry. 他非常生气。 CC-BY 2.0 (France) Attribution: tatoeba.org #1323916 (CK) & #426894 (fucongcong) +Here's the bill. 这是账单。 CC-BY 2.0 (France) Attribution: tatoeba.org #2245561 (CK) & #7774826 (jiangche) +Here's your tea. 這是你的茶。 CC-BY 2.0 (France) Attribution: tatoeba.org #3900748 (felvideki) & #5863244 (verdastelo9604) +Hi! How are you? 嗨!你好嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #30316 (Zifre) & #873404 (Martha) +His word is law. 他的话就是命令。 CC-BY 2.0 (France) Attribution: tatoeba.org #287669 (CM) & #792851 (fucongcong) +How are you all? 大家好嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #914019 (Jane_Austen) & #819309 (Martha) +How are you all? 你們好嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #914019 (Jane_Austen) & #1761553 (egg0073) +How do you feel? 你感觉如何? CC-BY 2.0 (France) Attribution: tatoeba.org #25724 (CK) & #5026446 (murr) +How hot is that? 那個東西有多熱? CC-BY 2.0 (France) Attribution: tatoeba.org #9144900 (shou) & #9144904 (shou) +How interesting! 多么有趣啊! CC-BY 2.0 (France) Attribution: tatoeba.org #1898371 (CK) & #7772100 (jiangche) +How is everyone? 大家好嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #22110 (CK) & #819309 (Martha) +How is it going? 你們好嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #38308 (CK) & #1761553 (egg0073) +How much was it? 多少錢? CC-BY 2.0 (France) Attribution: tatoeba.org #2912655 (CK) & #761442 (Martha) +How old are you? 你幾歲? CC-BY 2.0 (France) Attribution: tatoeba.org #436243 (lukaszpp) & #779497 (Martha) +How rude of you! 你真粗魯! CC-BY 2.0 (France) Attribution: tatoeba.org #16444 (CK) & #819340 (Martha) +How unfortunate! 可憐! CC-BY 2.0 (France) Attribution: tatoeba.org #2111810 (CK) & #766953 (Martha) +How's everybody? 大家好嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #1495905 (CK) & #819309 (Martha) +How's the apple? 這個蘋果怎麼樣? CC-BY 2.0 (France) Attribution: tatoeba.org #6110489 (Sethlang) & #6092463 (xjjAstrus) +I ache all over. 我全身酸痛。 CC-BY 2.0 (France) Attribution: tatoeba.org #63521 (CK) & #917936 (Martha) +I am a bachelor. 我单身。 CC-BY 2.0 (France) Attribution: tatoeba.org #29048 (CK) & #4977440 (musclegirlxyp) +I am a bachelor. 我單身。 CC-BY 2.0 (France) Attribution: tatoeba.org #29048 (CK) & #5691850 (xjjAstrus) +I am a good boy. 我是一个好男孩。 CC-BY 2.0 (France) Attribution: tatoeba.org #1070261 (Valodnieks) & #1786007 (sadhen) +I am busy today. 我今天忙。 CC-BY 2.0 (France) Attribution: tatoeba.org #242977 (sacredceltic) & #8215733 (verdastelo9604) +I am dead tired. 困死了。 CC-BY 2.0 (France) Attribution: tatoeba.org #3259457 (CM) & #2431733 (fenfang557) +I am in trouble. 我有麻煩了。 CC-BY 2.0 (France) Attribution: tatoeba.org #257640 (CK) & #917920 (Martha) +I am in trouble. 我遇到困難了。 CC-BY 2.0 (France) Attribution: tatoeba.org #257640 (CK) & #917927 (Martha) +I am not stupid. 我不是笨蛋。 CC-BY 2.0 (France) Attribution: tatoeba.org #2857953 (CM) & #8698960 (crescat) +I am very tired. 我很累。 CC-BY 2.0 (France) Attribution: tatoeba.org #854452 (piksea) & #397734 (GlossaMatik) +I ate the apple. 我吃了這個蘋果。 CC-BY 2.0 (France) Attribution: tatoeba.org #770172 (marloncori) & #770261 (Martha) +I baked cookies. 我烤了曲奇。 CC-BY 2.0 (France) Attribution: tatoeba.org #2245614 (CK) & #6325143 (verdastelo9604) +I began running. 我開始跑。 CC-BY 2.0 (France) Attribution: tatoeba.org #5850896 (CK) & #6103124 (verdastelo9604) +I booked a seat. 我訂了一個位子。 CC-BY 2.0 (France) Attribution: tatoeba.org #243651 (CM) & #731759 (Martha) +I bought a book. 我買了一本書。 CC-BY 2.0 (France) Attribution: tatoeba.org #256043 (CK) & #941107 (Martha) +I called Tom up. 我打電話給湯姆了。 CC-BY 2.0 (France) Attribution: tatoeba.org #255286 (CK) & #826242 (Martha) +I called her up. 我給她打電話。 CC-BY 2.0 (France) Attribution: tatoeba.org #261210 (CK) & #5911676 (verdastelo9604) +I can come, too. 我也能去。 CC-BY 2.0 (France) Attribution: tatoeba.org #8405946 (CK) & #8746411 (cxpadonis) +I can sing well. 我唱歌很好听。 CC-BY 2.0 (France) Attribution: tatoeba.org #501171 (swagner) & #6884328 (maggiesq) +I can swim well. 我游泳可以游得很好。 CC-BY 2.0 (France) Attribution: tatoeba.org #258725 (CK) & #926770 (Martha) +I can't do that. 我做不到。 CC-BY 2.0 (France) Attribution: tatoeba.org #1650200 (Spamster) & #7768005 (jiangche) +I can't do this. 我做不到。 CC-BY 2.0 (France) Attribution: tatoeba.org #1887124 (CK) & #7768005 (jiangche) +I can't feel it. 我感觉不到它。 CC-BY 2.0 (France) Attribution: tatoeba.org #4401081 (CK) & #10699359 (GlossaMatik) +I can't see you. 我看不見你。 CC-BY 2.0 (France) Attribution: tatoeba.org #1784974 (Amastan) & #5114860 (xjjAstrus) +I can't stop it. 我无法阻止它。 CC-BY 2.0 (France) Attribution: tatoeba.org #1647936 (Spamster) & #10260745 (GlossaMatik) +I can't undo it. 我不能取消它。 CC-BY 2.0 (France) Attribution: tatoeba.org #826005 (U2FS) & #827591 (Martha) +I did it myself. 我自己做的。 CC-BY 2.0 (France) Attribution: tatoeba.org #454165 (mamat) & #512813 (fucongcong) +I don't like it. 我不喜欢。 CC-BY 2.0 (France) Attribution: tatoeba.org #2271878 (CK) & #1361974 (sadhen) +I don't want it. 我不要. CC-BY 2.0 (France) Attribution: tatoeba.org #452696 (CK) & #6850371 (mao) +I enjoy running. 我喜欢跑步。 CC-BY 2.0 (France) Attribution: tatoeba.org #6358355 (CK) & #363979 (fucongcong) +I feel relieved. 我感觉轻松了。 CC-BY 2.0 (France) Attribution: tatoeba.org #28489 (CK) & #787349 (fucongcong) +I get up at six. 我六點起床。 CC-BY 2.0 (France) Attribution: tatoeba.org #321577 (CK) & #835368 (Martha) +I had no choice. 那时我没有选择的余地。 CC-BY 2.0 (France) Attribution: tatoeba.org #1553472 (CK) & #1783803 (sadhen) +I hate studying. 我讨厌学习。 CC-BY 2.0 (France) Attribution: tatoeba.org #537021 (tomkun01) & #471099 (fucongcong) +I have a laptop. 我有一臺筆記本電腦。 CC-BY 2.0 (France) Attribution: tatoeba.org #4305641 (CK) & #9057853 (xjjAstrus) +I have brothers. 我有兄弟。 CC-BY 2.0 (France) Attribution: tatoeba.org #773503 (marloncori) & #774537 (Martha) +I have diabetes. 我有糖尿病。 CC-BY 2.0 (France) Attribution: tatoeba.org #280075 (CK) & #10699400 (GlossaMatik) +I have no money. 我没钱了。 CC-BY 2.0 (France) Attribution: tatoeba.org #433613 (CK) & #10019726 (GlossaMatik) +I have ten pens. 我有十支筆。 CC-BY 2.0 (France) Attribution: tatoeba.org #370732 (saeb) & #779472 (Martha) +I have to hurry! 我要赶紧了! CC-BY 2.0 (France) Attribution: tatoeba.org #705285 (Zifre) & #793948 (fucongcong) +I have two cars. 我有两辆车。 CC-BY 2.0 (France) Attribution: tatoeba.org #321849 (CK) & #411702 (fucongcong) +I have two cats. 我有两只猫。 CC-BY 2.0 (France) Attribution: tatoeba.org #2412739 (fjrjdk) & #4878929 (musclegirlxyp) +I have two sons. 我有兩個兒子。 CC-BY 2.0 (France) Attribution: tatoeba.org #2714934 (CK) & #6486891 (xjjAstrus) +I just threw up. 我剛才吐了。 CC-BY 2.0 (France) Attribution: tatoeba.org #3962738 (JSakuragi) & #3713809 (egg0073) +I know your son. 我认识你儿子。 CC-BY 2.0 (France) Attribution: tatoeba.org #1841674 (CK) & #10182738 (slo_oth) +I lent him a CD. 我借给他一盘CD。 CC-BY 2.0 (France) Attribution: tatoeba.org #260265 (CK) & #846778 (fucongcong) +I like Tom, too. 我也喜歡湯姆。 CC-BY 2.0 (France) Attribution: tatoeba.org #5840522 (CK) & #6333807 (verdastelo9604) +I like eggplant. 我喜歡茄子。 CC-BY 2.0 (France) Attribution: tatoeba.org #7156338 (Kiwi) & #6940065 (xjjAstrus) +I like football. 我喜歡足球。 CC-BY 2.0 (France) Attribution: tatoeba.org #858100 (miravalles) & #5568572 (egg0073) +I like potatoes. 我喜歡土豆。 CC-BY 2.0 (France) Attribution: tatoeba.org #5858134 (CK) & #6075487 (verdastelo9604) +I like the cold. 我喜歡寒冷。 CC-BY 2.0 (France) Attribution: tatoeba.org #252385 (CK) & #1647824 (egg0073) +I like this dog. 我喜欢这只狗。 CC-BY 2.0 (France) Attribution: tatoeba.org #439591 (landano) & #1785983 (sadhen) +I like your car. 我喜欢您的车。 CC-BY 2.0 (France) Attribution: tatoeba.org #257112 (CK) & #343424 (fucongcong) +I live with Tom. 我和汤姆住。 CC-BY 2.0 (France) Attribution: tatoeba.org #2261961 (CK) & #11282484 (biscotto) +I lost my money. 我丢了我的钱。 CC-BY 2.0 (France) Attribution: tatoeba.org #7798513 (sharris123) & #847698 (fucongcong) +I love barbecue. 我喜欢烧烤食物。 CC-BY 2.0 (France) Attribution: tatoeba.org #1635960 (Spamster) & #2595832 (iMaple) +I love this car. 我愛這台車。 CC-BY 2.0 (France) Attribution: tatoeba.org #4401060 (CK) & #5496248 (egg0073) +I love you, too. 我也愛你。 CC-BY 2.0 (France) Attribution: tatoeba.org #628763 (meloncurtains) & #5500487 (egg0073) +I might say yes. 我可能会说是。 CC-BY 2.0 (France) Attribution: tatoeba.org #2387228 (CK) & #5945148 (verdastelo9604) +I must help her. 我必須幫助她。 CC-BY 2.0 (France) Attribution: tatoeba.org #816064 (afeinberg) & #816890 (Martha) +I need a doctor. 我需要医生。 CC-BY 2.0 (France) Attribution: tatoeba.org #2280312 (CK) & #10699408 (GlossaMatik) +I need a friend. 我需要个朋友。 CC-BY 2.0 (France) Attribution: tatoeba.org #3824522 (CK) & #5983631 (verdastelo9604) +I need a lawyer. 我需要一名律師。 CC-BY 2.0 (France) Attribution: tatoeba.org #1887574 (CK) & #6292460 (xjjAstrus) +I need evidence. 我需要證據。 CC-BY 2.0 (France) Attribution: tatoeba.org #2246003 (CK) & #6293115 (verdastelo9604) +I need his help. 我需要他的帮助。 CC-BY 2.0 (France) Attribution: tatoeba.org #286703 (CK) & #343475 (fucongcong) +I need my boots. 我需要我的靴子。 CC-BY 2.0 (France) Attribution: tatoeba.org #7799644 (sharris123) & #6062102 (xjjAstrus) +I need you here. 我需要你在這裡。 CC-BY 2.0 (France) Attribution: tatoeba.org #1887591 (CK) & #6075557 (verdastelo9604) +I only want one. 我只想要一件东西。 CC-BY 2.0 (France) Attribution: tatoeba.org #1956085 (CK) & #7774358 (jiangche) +I paid the bill. 我买了单。 CC-BY 2.0 (France) Attribution: tatoeba.org #680368 (Source_VOA) & #808214 (fucongcong) +I play football. 我踢足球。 CC-BY 2.0 (France) Attribution: tatoeba.org #2175511 (frog1011) & #9953360 (GlossaMatik) +I played tennis. 我打網球了。 CC-BY 2.0 (France) Attribution: tatoeba.org #255092 (CK) & #826104 (Martha) +I run every day. 我每天跑步。 CC-BY 2.0 (France) Attribution: tatoeba.org #261849 (CK) & #414247 (fucongcong) +I study English. 我学英语。 CC-BY 2.0 (France) Attribution: tatoeba.org #256236 (CK) & #10448719 (GlossaMatik) +I talked to Tom. 我和汤姆说了话。 CC-BY 2.0 (France) Attribution: tatoeba.org #1887701 (CK) & #7768303 (jiangche) +I talked to her. 我跟她談了話。 CC-BY 2.0 (France) Attribution: tatoeba.org #1457695 (CK) & #5942089 (verdastelo9604) +I think it's OK. 我想沒關係。 CC-BY 2.0 (France) Attribution: tatoeba.org #433884 (CK) & #771479 (Martha) +I think so, too. 我也这么认为。 CC-BY 2.0 (France) Attribution: tatoeba.org #262339 (CK) & #411523 (fucongcong) +I think so, too. 我也这么想。 CC-BY 2.0 (France) Attribution: tatoeba.org #262339 (CK) & #440005 (GlossaMatik) +I think so, too. 我也是這麼想的。 CC-BY 2.0 (France) Attribution: tatoeba.org #262339 (CK) & #1227132 (tsayng) +I threw a party. 我举办了一场派对。 CC-BY 2.0 (France) Attribution: tatoeba.org #10547917 (sundown) & #10114137 (GlossaMatik) +I took a shower. 我洗了澡。 CC-BY 2.0 (France) Attribution: tatoeba.org #3126551 (lavenir) & #5624915 (verdastelo9604) +I totally agree. 我完全同意。 CC-BY 2.0 (France) Attribution: tatoeba.org #2247422 (CK) & #926858 (Martha) +I turned it off. 我把它关了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2570986 (Hybrid) & #9963079 (GlossaMatik) +I want a guitar. 我想要一把吉他。 CC-BY 2.0 (France) Attribution: tatoeba.org #63403 (CK) & #390449 (fucongcong) +I want that bag. 我想要那個袋子。 CC-BY 2.0 (France) Attribution: tatoeba.org #68478 (CK) & #824622 (Martha) +I want to drive. 我想開車。 CC-BY 2.0 (France) Attribution: tatoeba.org #258396 (CK) & #826158 (Martha) +I want to sleep. 真想睡过去啊。 CC-BY 2.0 (France) Attribution: tatoeba.org #321870 (CK) & #2442076 (fenfang557) +I wanted to cry. 我想哭。 CC-BY 2.0 (France) Attribution: tatoeba.org #4383868 (Hybrid) & #334542 (fucongcong) +I was a teacher. 我当过老师。 CC-BY 2.0 (France) Attribution: tatoeba.org #432340 (CM) & #432344 (GlossaMatik) +I was not drunk. 我沒醉。 CC-BY 2.0 (France) Attribution: tatoeba.org #1156060 (CK) & #8215707 (verdastelo9604) +I was surprised. 我吃了一驚。 CC-BY 2.0 (France) Attribution: tatoeba.org #2247521 (CK) & #5585229 (verdastelo9604) +I wish you luck. 我祝您好运。 CC-BY 2.0 (France) Attribution: tatoeba.org #858589 (piksea) & #344208 (fucongcong) +I wish you luck. 祝你好运。 CC-BY 2.0 (France) Attribution: tatoeba.org #858589 (piksea) & #812490 (fucongcong) +I wish you luck. 祝您好运。 CC-BY 2.0 (France) Attribution: tatoeba.org #858589 (piksea) & #10511466 (Selina) +I wish you'd go. 我希望你去。 CC-BY 2.0 (France) Attribution: tatoeba.org #2155930 (CM) & #864359 (Martha) +I woke up early. 我起得早。 CC-BY 2.0 (France) Attribution: tatoeba.org #2549543 (CK) & #6678462 (verdastelo9604) +I won't be long. 不會花很多時間的。 CC-BY 2.0 (France) Attribution: tatoeba.org #1779996 (Spamster) & #1170427 (egg0073) +I work too much. 我工作得太多了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1553441 (CK) & #1783806 (sadhen) +I write letters. 我寫字母。 CC-BY 2.0 (France) Attribution: tatoeba.org #9401975 (BobbyLee) & #2243454 (cienias) +I'll bring wine. 我會帶酒來。 CC-BY 2.0 (France) Attribution: tatoeba.org #5228978 (jaxhere) & #5640710 (verdastelo9604) +I'll go by taxi. 我坐出租車去。 CC-BY 2.0 (France) Attribution: tatoeba.org #2549527 (CK) & #9179887 (xjjAstrus) +I'll never stop. 我絕不會停。 CC-BY 2.0 (France) Attribution: tatoeba.org #2247791 (CK) & #6871856 (verdastelo9604) +I'm a detective. 我是个侦探。 CC-BY 2.0 (France) Attribution: tatoeba.org #2247888 (CK) & #7774795 (jiangche) +I'm a foreigner. 我是一個外國人。 CC-BY 2.0 (France) Attribution: tatoeba.org #809719 (Martha) & #809716 (Martha) +I'm a good cook. 我是个好厨师。 CC-BY 2.0 (France) Attribution: tatoeba.org #325794 (CK) & #346721 (fucongcong) +I'm a night owl. 我是個夜貓子。 CC-BY 2.0 (France) Attribution: tatoeba.org #321972 (CK) & #825924 (Martha) +I'm a professor. 我是大学教授。 CC-BY 2.0 (France) Attribution: tatoeba.org #5853142 (CK) & #8762958 (crescat) +I'm about ready. 我快好了。 CC-BY 2.0 (France) Attribution: tatoeba.org #33483 (CK) & #793259 (Martha) +I'm almost done. 我差不多完成了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2040 (Swift) & #333787 (fucongcong) +I'm always busy. 我总是有事。 CC-BY 2.0 (France) Attribution: tatoeba.org #2649020 (CK) & #7771930 (jiangche) +I'm always here. 我一直在這裡。 CC-BY 2.0 (France) Attribution: tatoeba.org #5975691 (CK) & #6114424 (verdastelo9604) +I'm chewing gum. 我嚼口香糖。 CC-BY 2.0 (France) Attribution: tatoeba.org #5853100 (CK) & #9956903 (GlossaMatik) +I'm daydreaming. 我在做白日夢。 CC-BY 2.0 (France) Attribution: tatoeba.org #5198885 (AlanF_US) & #6105117 (verdastelo9604) +I'm eating rice. 我在吃米饭。 CC-BY 2.0 (France) Attribution: tatoeba.org #6873303 (CK) & #334506 (fucongcong) +I'm feeling fit. 我覺得精神很好。 CC-BY 2.0 (France) Attribution: tatoeba.org #33524 (CK) & #826231 (Martha) +I'm from Boston. 他來自波士頓。 CC-BY 2.0 (France) Attribution: tatoeba.org #2549516 (CK) & #764477 (Martha) +I'm getting old. 我在变老。 CC-BY 2.0 (France) Attribution: tatoeba.org #1619683 (Spamster) & #7768006 (jiangche) +I'm job hunting. 我在找工作。 CC-BY 2.0 (France) Attribution: tatoeba.org #5858327 (CK) & #406364 (fucongcong) +I'm left-handed. 我是左撇子。 CC-BY 2.0 (France) Attribution: tatoeba.org #321826 (CK) & #832799 (Martha) +I'm not a witch. 我不是巫婆。 CC-BY 2.0 (France) Attribution: tatoeba.org #6873301 (CK) & #796646 (fucongcong) +I'm not jealous. 我不嫉妒。 CC-BY 2.0 (France) Attribution: tatoeba.org #2248154 (CK) & #7768001 (jiangche) +I'm not married. 我单身。 CC-BY 2.0 (France) Attribution: tatoeba.org #1841625 (CK) & #4977440 (musclegirlxyp) +I'm not married. 我單身。 CC-BY 2.0 (France) Attribution: tatoeba.org #1841625 (CK) & #5691850 (xjjAstrus) +I'm not serious. 我不是认真的。 CC-BY 2.0 (France) Attribution: tatoeba.org #1139052 (soj4l) & #461488 (fucongcong) +I'm out of here. 我走了。 CC-BY 2.0 (France) Attribution: tatoeba.org #455837 (lukaszpp) & #405498 (GlossaMatik) +I'm out of time. 我没时间了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2713773 (CK) & #5555760 (verdastelo9604) +I'm pretty busy. 我挺忙。 CC-BY 2.0 (France) Attribution: tatoeba.org #2046667 (CK) & #6940059 (Cheng) +I'm pretty tall. 我相当高。 CC-BY 2.0 (France) Attribution: tatoeba.org #2248216 (CK) & #7772595 (jiangche) +I'm really busy. 我真的好忙。 CC-BY 2.0 (France) Attribution: tatoeba.org #2046669 (CK) & #4760008 (ryanwoo) +I'm really cold. 我真的冷。 CC-BY 2.0 (France) Attribution: tatoeba.org #2248227 (CK) & #6065730 (verdastelo9604) +I'm so worn out. 我好累。 CC-BY 2.0 (France) Attribution: tatoeba.org #1556502 (brymck) & #785298 (Martha) +I'm still angry. 我还是很气。 CC-BY 2.0 (France) Attribution: tatoeba.org #4397631 (CK) & #9972435 (GlossaMatik) +I'm still young. 我還年輕。 CC-BY 2.0 (France) Attribution: tatoeba.org #1806286 (Spamster) & #832459 (Martha) +I'm very hungry. 我很餓。 CC-BY 2.0 (France) Attribution: tatoeba.org #433809 (CK) & #826048 (Martha) +I'm very hungry. 我好饿。 CC-BY 2.0 (France) Attribution: tatoeba.org #433809 (CK) & #9991926 (GlossaMatik) +I'm very lonely. 我很寂寞。 CC-BY 2.0 (France) Attribution: tatoeba.org #2649018 (CK) & #5091176 (mirrorvan) +I'm very sleepy. 我非常困。 CC-BY 2.0 (France) Attribution: tatoeba.org #2649017 (CK) & #8968587 (ZeroAurora) +I'm watching TV. 我在看电视。 CC-BY 2.0 (France) Attribution: tatoeba.org #2036345 (Dejo) & #10695997 (GlossaMatik) +I'm your deputy. 我是你的代理人。 CC-BY 2.0 (France) Attribution: tatoeba.org #3374193 (CK) & #10513310 (GlossaMatik) +I'm your father. 我是你爸爸。 CC-BY 2.0 (France) Attribution: tatoeba.org #1891163 (CK) & #6057860 (verdastelo9604) +I'm your lawyer. 我是你的律师。 CC-BY 2.0 (France) Attribution: tatoeba.org #2248326 (CK) & #10713945 (AwabiJan) +I'm your sister. 我是你的妹妹。 CC-BY 2.0 (France) Attribution: tatoeba.org #1979740 (CM) & #2782904 (GlossaMatik) +I've got a bike. 我有一輛自行車。 CC-BY 2.0 (France) Attribution: tatoeba.org #3091025 (CK) & #5112366 (xjjAstrus) +I've got a boat. 我有一艘小船。 CC-BY 2.0 (France) Attribution: tatoeba.org #8399047 (CK) & #9179805 (xjjAstrus) +I've got asthma. 我有哮喘。 CC-BY 2.0 (France) Attribution: tatoeba.org #10697421 (sundown) & #10699398 (GlossaMatik) +I've had a bath. 我洗了澡。 CC-BY 2.0 (France) Attribution: tatoeba.org #10657443 (sundown) & #5624915 (verdastelo9604) +I've had enough. 我已經受夠了。 CC-BY 2.0 (France) Attribution: tatoeba.org #433859 (CK) & #826273 (Martha) +I've had enough. 我已經吃飽了。 CC-BY 2.0 (France) Attribution: tatoeba.org #433859 (CK) & #826276 (Martha) +Is Tom Canadian? Tom是加拿大人嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #2244584 (CK) & #5350387 (egg0073) +Is Tom an actor? 汤姆是演员吗? CC-BY 2.0 (France) Attribution: tatoeba.org #2649011 (CK) & #8877876 (crescat) +Is Tom autistic? 汤姆有自闭症吗? CC-BY 2.0 (France) Attribution: tatoeba.org #2235809 (CK) & #8832691 (crescat) +Is Tom infected? 汤姆被感染了吗? CC-BY 2.0 (France) Attribution: tatoeba.org #2244610 (CK) & #8696436 (morningstar) +Is Tom swimming? 汤姆在游泳吗? CC-BY 2.0 (France) Attribution: tatoeba.org #2953034 (CK) & #8756401 (crescat) +Is Tom with you? 汤姆和你在一起吗? CC-BY 2.0 (France) Attribution: tatoeba.org #1886872 (CK) & #10157039 (yeyue) +Is anybody home? 家里有没有人? CC-BY 2.0 (France) Attribution: tatoeba.org #276298 (CK) & #408723 (GlossaMatik) +Is he breathing? 他在呼吸嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #239892 (CK) & #772142 (Martha) +Is it all there? 全都在那裡嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #2891415 (CK) & #6146643 (verdastelo9604) +Is it poisonous? 它有毒嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #2248466 (CK) & #8215687 (verdastelo9604) +Is it too salty? 还有多余的盐吗? CC-BY 2.0 (France) Attribution: tatoeba.org #995263 (NickC) & #993764 (leoyzy) +Is she Japanese? 她是日本人嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #1123763 (CK) & #1671358 (egg0073) +Is this a river? 這是一條河嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #56259 (CK) & #788741 (Martha) +Isn't that mine? 那是我的吗? CC-BY 2.0 (France) Attribution: tatoeba.org #2248691 (CK) & #4463426 (MirendaBABY) +It is up to you. 由你來決定。 CC-BY 2.0 (France) Attribution: tatoeba.org #42493 (CK) & #834868 (Martha) +It really works. 真的有用。 CC-BY 2.0 (France) Attribution: tatoeba.org #2032690 (Amastan) & #9953347 (GlossaMatik) +It snowed a lot. 下了很多的雪。 CC-BY 2.0 (France) Attribution: tatoeba.org #1045510 (tatomeimei) & #759541 (Martha) +It was my fault. 这是我的错。 CC-BY 2.0 (France) Attribution: tatoeba.org #1745701 (Spamster) & #790573 (GlossaMatik) +It was terrible. 真糟糕。 CC-BY 2.0 (France) Attribution: tatoeba.org #2248884 (CK) & #5576793 (verdastelo9604) +It was very far. 很遠。 CC-BY 2.0 (France) Attribution: tatoeba.org #5758327 (CM) & #6132230 (verdastelo9604) +It'll be cloudy. 天要变多云了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2631810 (Joseph) & #6080240 (verdastelo9604) +It'll rain soon. 天快要下雨了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2248988 (CK) & #335128 (fucongcong) +It's a dead end. 这是个死胡同。 CC-BY 2.0 (France) Attribution: tatoeba.org #2176 (CK) & #503300 (fucongcong) +It's a nice day. 今天天氣很好。 CC-BY 2.0 (France) Attribution: tatoeba.org #433659 (CK) & #819387 (Martha) +It's a surprise. 这是一个惊喜。 CC-BY 2.0 (France) Attribution: tatoeba.org #1567 (CK) & #334423 (fucongcong) +It's almost six. 差不多六点了。 CC-BY 2.0 (France) Attribution: tatoeba.org #519311 (CK) & #609853 (CLARET) +It's almost six. 快要六點了。 CC-BY 2.0 (France) Attribution: tatoeba.org #519311 (CK) & #832800 (Martha) +It's already 11. 已经是11点了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1230697 (alec) & #334137 (fucongcong) +It's cool today. 今天很凉快。 CC-BY 2.0 (France) Attribution: tatoeba.org #242990 (CK) & #405263 (fucongcong) +It's fine today. 今天天气很好。 CC-BY 2.0 (France) Attribution: tatoeba.org #242938 (CK) & #333127 (fucongcong) +It's impossible. 這是不可能的。 CC-BY 2.0 (France) Attribution: tatoeba.org #433459 (CK) & #824702 (Martha) +It's lunch time. 午餐時間到了。 CC-BY 2.0 (France) Attribution: tatoeba.org #433692 (CK) & #825916 (Martha) +It's nearly six. 差不多六点了。 CC-BY 2.0 (France) Attribution: tatoeba.org #5290178 (Joseph) & #609853 (CLARET) +It's okay to go. 你可以走了。 CC-BY 2.0 (France) Attribution: tatoeba.org #518554 (CK) & #824627 (Martha) +It's over there. 在那裡。 CC-BY 2.0 (France) Attribution: tatoeba.org #2249154 (CK) & #5856785 (verdastelo9604) +It's really big. 它很大。 CC-BY 2.0 (France) Attribution: tatoeba.org #2249203 (CK) & #832782 (Martha) +It's time to go. 該走了。 CC-BY 2.0 (France) Attribution: tatoeba.org #266757 (CK) & #793328 (Martha) +It's time to go. 是該離開的時候了。 CC-BY 2.0 (France) Attribution: tatoeba.org #266757 (CK) & #793329 (Martha) +Jesus loves you. 耶穌愛你。 CC-BY 2.0 (France) Attribution: tatoeba.org #823857 (slomox) & #824412 (Martha) +Keep on smiling. 保持微笑。 CC-BY 2.0 (France) Attribution: tatoeba.org #318128 (CK) & #778735 (Martha) +Keep on working. 繼續工作! CC-BY 2.0 (France) Attribution: tatoeba.org #3507575 (CK) & #3982106 (tsayng) +Keep the change! 不用找零钱了。 CC-BY 2.0 (France) Attribution: tatoeba.org #39748 (CK) & #1411509 (asosan) +Large, isn't it? 很大, 不是嗎? CC-BY 2.0 (France) Attribution: tatoeba.org #435613 (CK) & #771584 (Martha) +Leave him alone. 让他一个人待着。 CC-BY 2.0 (France) Attribution: tatoeba.org #278533 (CK) & #363872 (fucongcong) +Lemons are sour. 檸檬是酸的。 CC-BY 2.0 (France) Attribution: tatoeba.org #435751 (CK) & #826253 (Martha) +Let me go alone. 讓我一個人去。 CC-BY 2.0 (France) Attribution: tatoeba.org #27652 (CK) & #825893 (Martha) +Let me see that. 讓我看看。 CC-BY 2.0 (France) Attribution: tatoeba.org #41848 (CK) & #819468 (Martha) +Let them decide. 讓他們決定。 CC-BY 2.0 (France) Attribution: tatoeba.org #3071634 (sharptoothed) & #4732044 (egg0073) +Let's eat sushi. 讓我們吃壽司吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #449059 (CK) & #824678 (Martha) +Let's get drunk. 让我们一醉方休吧! CC-BY 2.0 (France) Attribution: tatoeba.org #1891276 (CK) & #10552163 (GlossaMatik) +Let's go by bus. 讓我們坐公共汽車去。 CC-BY 2.0 (France) Attribution: tatoeba.org #450028 (CK) & #826293 (Martha) +Let's not argue. 我們別吵了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2007873 (CK) & #2660863 (egg0073) +Let's rest here. 在这里稍微休息一下吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #61882 (CK) & #8749668 (crescat) +Let's turn back. 我们掉头吧! CC-BY 2.0 (France) Attribution: tatoeba.org #27144 (CK) & #472905 (fucongcong) +Look at the sky. 看天上。 CC-BY 2.0 (France) Attribution: tatoeba.org #2648989 (CK) & #2081723 (sadhen) +Look behind you. 瞧你身後。 CC-BY 2.0 (France) Attribution: tatoeba.org #433623 (CK) & #819456 (Martha) +Make it smaller. 把它弄小一點。 CC-BY 2.0 (France) Attribution: tatoeba.org #433495 (CK) & #825894 (Martha) +May I leave now? 我现在能走了吗? CC-BY 2.0 (France) Attribution: tatoeba.org #242132 (CK) & #476636 (fucongcong) +May I try it on? 我能试一下吗? CC-BY 2.0 (France) Attribution: tatoeba.org #41784 (CK) & #782915 (fucongcong) +Maybe next time. 也许下一次吧。 CC-BY 2.0 (France) Attribution: tatoeba.org #1516119 (gonnastop) & #710745 (Yashanti) +Men should work. 男人应该工作。 CC-BY 2.0 (France) Attribution: tatoeba.org #1479231 (weihaiping) & #334672 (fucongcong) +Merry Christmas! 聖誕快樂。 CC-BY 2.0 (France) Attribution: tatoeba.org #1723 (brauliobezerra) & #779499 (Martha) +Mom, I'm hungry. 妈妈,我肚子饿了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2764199 (CK) & #4473138 (yuiyu) +My father walks. 我爸爸走路。 CC-BY 2.0 (France) Attribution: tatoeba.org #557422 (CK) & #4757681 (ryanwoo) +My house is big. 我家很大。 CC-BY 2.0 (France) Attribution: tatoeba.org #250554 (Scott) & #336235 (fucongcong) +Never say never. 永远不要说永远。 CC-BY 2.0 (France) Attribution: tatoeba.org #505754 (Mehdi) & #1330012 (vicch) +Nice to see you. 见到你真好。 CC-BY 2.0 (France) Attribution: tatoeba.org #32688 (CK) & #795754 (fucongcong) +No one was late. 没有人迟到。 CC-BY 2.0 (France) Attribution: tatoeba.org #415455 (CM) & #803851 (fucongcong) +No, I didn't go. 不,我沒去。 CC-BY 2.0 (France) Attribution: tatoeba.org #516735 (CK) & #819356 (Martha) +Nobody wants it. 这个没人要。 CC-BY 2.0 (France) Attribution: tatoeba.org #672179 (Eldad) & #6799704 (basilhan) +Open the bottle. 把瓶子打开。 CC-BY 2.0 (France) Attribution: tatoeba.org #49963 (CK) & #1411634 (asosan) +Please be quiet. 請安靜。 CC-BY 2.0 (France) Attribution: tatoeba.org #449049 (CK) & #825998 (Martha) +Please continue. 请继续。 CC-BY 2.0 (France) Attribution: tatoeba.org #870628 (CK) & #5102256 (mirrorvan) +Please sit down. 请坐一下。 CC-BY 2.0 (France) Attribution: tatoeba.org #415594 (CM) & #415599 (GlossaMatik) +Please sit down. 請坐下。 CC-BY 2.0 (France) Attribution: tatoeba.org #415594 (CM) & #826147 (Martha) +Prices are high. 价格高。 CC-BY 2.0 (France) Attribution: tatoeba.org #65710 (CK) & #8696342 (crescat) +Put your hat on. 戴上你的帽子。 CC-BY 2.0 (France) Attribution: tatoeba.org #321117 (CK) & #895823 (Martha) +Say no to drugs. 對毒品說不。 CC-BY 2.0 (France) Attribution: tatoeba.org #827226 (Scott) & #827526 (Martha) +Scary, isn't it? 是不是嚇人? CC-BY 2.0 (France) Attribution: tatoeba.org #2549491 (CK) & #6150894 (verdastelo9604) +See you about 7. 我们7点左右碰头。 CC-BY 2.0 (France) Attribution: tatoeba.org #72342 (CK) & #375350 (fucongcong) +See you tonight. 今晚見。 CC-BY 2.0 (France) Attribution: tatoeba.org #2648979 (CK) & #6028180 (verdastelo9604) +Send it airmail. 航空邮寄它。 CC-BY 2.0 (France) Attribution: tatoeba.org #2259106 (_undertoad) & #9961356 (GlossaMatik) +She calmed down. 她冷靜下來。 CC-BY 2.0 (France) Attribution: tatoeba.org #3272732 (CM) & #6132218 (verdastelo9604) +She disappeared. 她消失了。 CC-BY 2.0 (France) Attribution: tatoeba.org #1442219 (CK) & #5372267 (egg0073) +She is graceful. 她举止优雅。 CC-BY 2.0 (France) Attribution: tatoeba.org #317252 (CK) & #4972683 (wzhd) +She looked away. 她轉移了視線。 CC-BY 2.0 (France) Attribution: tatoeba.org #512653 (CK) & #825166 (Martha) +She looks young. 她看起来很年轻。 CC-BY 2.0 (France) Attribution: tatoeba.org #314853 (CK) & #2188409 (sadhen) +She lost a book. 她弄丟了一本書。 CC-BY 2.0 (France) Attribution: tatoeba.org #1275204 (CK) & #1275212 (egg0073) +She married him. 她嫁给了他。 CC-BY 2.0 (France) Attribution: tatoeba.org #316246 (CK) & #4970155 (wzhd) +She worked hard. 她努力地工作。 CC-BY 2.0 (France) Attribution: tatoeba.org #312575 (CK) & #817269 (fucongcong) +She's my sister. 她是我的姊妹。 CC-BY 2.0 (France) Attribution: tatoeba.org #469126 (CK) & #825891 (Martha) +She's on a diet. 她在节食中。 CC-BY 2.0 (France) Attribution: tatoeba.org #707288 (papabear) & #1878324 (sadhen) +She's on a diet. 她在节食。 CC-BY 2.0 (France) Attribution: tatoeba.org #707288 (papabear) & #7767995 (jiangche) +She's seventeen. 她十七岁了。 CC-BY 2.0 (France) Attribution: tatoeba.org #2765315 (CK) & #3485499 (GlossaMatik) +Shut your mouth. 闭上你的嘴。 CC-BY 2.0 (France) Attribution: tatoeba.org #240561 (CK) & #1691765 (sadhen) +So far, so good. 迄今,一切妥当。 CC-BY 2.0 (France) Attribution: tatoeba.org #55348 (CM) & #1749264 (sadhen) +Spring has come. 春天到了。 CC-BY 2.0 (France) Attribution: tatoeba.org #441964 (CK) & #1490515 (sadhen) +That dog is big. 這隻狗很大。 CC-BY 2.0 (France) Attribution: tatoeba.org #68734 (CK) & #825158 (Martha) +That feels good. 那看來很好。 CC-BY 2.0 (France) Attribution: tatoeba.org #2250109 (CK) & #5845579 (verdastelo9604) +That isn't fair. 這不公平。 CC-BY 2.0 (France) Attribution: tatoeba.org #442966 (CK) & #819322 (Martha) +That smells bad. 那不好聞。 CC-BY 2.0 (France) Attribution: tatoeba.org #4062886 (CK) & #6091666 (verdastelo9604) +That's a pencil. 那是一支铅笔。 CC-BY 2.0 (France) Attribution: tatoeba.org #8305536 (shekitten) & #336695 (fucongcong) +That's my money. 那是我的钱。 CC-BY 2.0 (France) Attribution: tatoeba.org #6670223 (thegui) & #8727837 (crescat) diff --git a/examples/trans/data.py b/examples/trans/data.py new file mode 100644 index 000000000..8be5157ed --- /dev/null +++ b/examples/trans/data.py @@ -0,0 +1,181 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +import re +import numpy as np +from collections import Counter + + +class Vocab: + """ + The class of vocab, include 2 dicts of token to index and index to token + """ + def __init__(self, sentences): + """ + Args: + sentences: a 2-dim list + """ + flatten = lambda lst: [item for sublist in lst for item in sublist] + self.sentence = sentences + self.token2index = {'': 0, '': 1, '': 2, '': 3} + self.token2index.update({ + token: index + 4 + for index, (token, freq) in enumerate( + sorted(Counter(flatten(self.sentence)).items(), key=lambda x: x[1], reverse=True)) + }) + self.index2token = {index: token for token, index in self.token2index.items()} + + def __getitem__(self, query): + if isinstance(query, str): + return self.token2index.get(query, self.token2index.get('')) + elif isinstance(query, (int, np.int32, np.int64)): + return self.index2token.get(query, '') + elif isinstance(query, (list, tuple, np.ndarray)): + return [self.__getitem__(item) for item in query] + else: + raise ValueError("The type of query is invalid.") + + def __len__(self): + return len(self.index2token) + + +class CmnDataset: + def __init__(self, path='cmn-eng/cmn.txt', shuffle=False, batch_size=32, train_ratio=0.8, random_seed=0): + """ + cmn dataset, download from https://www.manythings.org/anki/, contains 29909 Chinese and English translation + pairs, the pair format: English + TAB + Chinese + TAB + Attribution + Args: + path: the path of the dataset, default 'cmn-eng/cnn.txt' + shuffle: shuffle the dataset, default False + batch_size: the size of every batch, default 32 + train_ratio: the proportion of the training set to the total data set, default 0.8 + random_seed: the random seed, used for shuffle operation, default 0 + """ + src_max_len, tgt_max_len, src_sts, tgt_sts = CmnDataset._split_sentences(path) + en_vab, cn_vab = Vocab(src_sts), Vocab(tgt_sts) + src_np, tgt_in_np, tgt_out_np = CmnDataset._encoding_stc(src_sts, tgt_sts, src_max_len, tgt_max_len, + en_vab, cn_vab) + + self.src_max_len, self.tgt_max_len = src_max_len, tgt_max_len + self.en_vab, self.cn_vab = en_vab, cn_vab + self.en_vab_size, self.cn_vab_size = len(en_vab), len(cn_vab) + + self.src_inputs, self.tgt_inputs, self.tgt_outputs = src_np, tgt_in_np, tgt_out_np + + self.shuffle, self.random_seed = shuffle, random_seed + + assert batch_size > 0, "The number of batch_size must be greater than 0" + self.batch_size = batch_size + + assert (0 < train_ratio <= 1.0), "The number of train_ratio must be in (0.0, 1.0]" + self.train_ratio = train_ratio + + self.total_size = len(src_np) + self.train_size = int(self.total_size * train_ratio) + self.test_size = self.total_size - self.train_size + + if shuffle: + index = [i for i in range(self.total_size)] + np.random.seed(self.random_seed) + np.random.shuffle(index) + + self.src_inputs = src_np[index] + self.tgt_inputs = tgt_in_np[index] + self.tgt_outputs = tgt_out_np[index] + + self.train_src_inputs, self.test_src_inputs = self.src_inputs[:self.train_size], self.src_inputs[self.train_size:] + self.train_tgt_inputs, self.test_tgt_inputs = self.tgt_inputs[:self.train_size], self.tgt_inputs[self.train_size:] + self.train_tgt_outputs, self.test_tgt_outputs = self.tgt_outputs[:self.train_size], self.tgt_outputs[self.train_size:] + + @staticmethod + def _split_sentences(path): + en_max_len, cn_max_len = 0, 0 + en_sts, cn_sts = [], [] + with open(path, 'r', encoding='utf-8') as f: + for line in f: + line_split = line.split('\t') + line_split[0] = re.sub(r'[^\w\s\'-]', '', line_split[0]) + line_split[0] = line_split[0].lower() + # [\u4e00-\u9fa5] matching Chinese characters + line_split[1] = re.sub("[^\u4e00-\u9fa5]", "", line_split[1]) + + en_stc = line_split[0].split(' ') + cn_stc = [word for word in line_split[1]] + en_sts.append(en_stc) + cn_sts.append(cn_stc) + en_max_len = max(en_max_len, len(en_stc)) + cn_max_len = max(cn_max_len, len(cn_stc)) + return en_max_len, cn_max_len, en_sts, cn_sts + + @staticmethod + def _encoding_stc(src_tokens, tgt_tokens, src_max_len, tgt_max_len, src_vocab, tgt_vocab): + src_list = [] + for line in src_tokens: + if len(line) > src_max_len: + line = line[:src_max_len] + lst = src_vocab[line + [''] * (src_max_len + 1 - len(line))] + src_list.append(lst) + tgt_in_list, tgt_out_list = [], [] + for line in tgt_tokens: + if len(line) > tgt_max_len: + line = line[:tgt_max_len] + in_lst = tgt_vocab[[''] + line + [''] * (tgt_max_len - len(line))] + out_lst = tgt_vocab[line + [''] + [''] * (tgt_max_len - len(line))] + tgt_in_list.append(in_lst) + tgt_out_list.append(out_lst) + src_np = np.asarray(src_list, dtype=np.int32) + tgt_in_np = np.asarray(tgt_in_list, dtype=np.int32) + tgt_out_np = np.asarray(tgt_out_list, dtype=np.int32) + return src_np, tgt_in_np, tgt_out_np + + def get_batch_data(self, batch, mode='train'): + assert (mode == 'train' or mode == 'test'), "The mode must be 'train' or 'test'." + total_size = self.train_size + if mode == 'test': + total_size = self.test_size + + max_batch = total_size // self.batch_size + if total_size % self.batch_size > 0: + max_batch += 1 + assert batch < max_batch, "The batch number is out of bounds." + + low = batch * self.batch_size + if (batch + 1) * self.batch_size < total_size: + high = (batch + 1) * self.batch_size + else: + high = total_size + if mode == 'train': + if high-low != self.batch_size: + return (np.concatenate((self.train_src_inputs[low:high], self.train_src_inputs[:self.batch_size-high+low]), axis=0), + np.concatenate((self.train_tgt_inputs[low:high], self.train_tgt_inputs[:self.batch_size-high+low]), axis=0), + np.concatenate((self.train_tgt_outputs[low:high], self.train_tgt_outputs[:self.batch_size-high+low]), axis=0)) + else: + return self.train_src_inputs[low:high], self.train_tgt_inputs[low:high], self.train_tgt_outputs[low:high] + else: + if high-low != self.batch_size: + return (np.concatenate((self.test_src_inputs[low:high], self.test_src_inputs[:self.batch_size-high+low]), axis=0), + np.concatenate((self.test_tgt_inputs[low:high], self.test_tgt_inputs[:self.batch_size-high+low]), axis=0), + np.concatenate((self.test_tgt_outputs[low:high], self.test_tgt_outputs[:self.batch_size-high+low]), axis=0)) + return self.test_src_inputs[low:high], self.test_tgt_inputs[low:high], self.test_tgt_outputs[low:high] + + def __len__(self): + return self.src_inputs.shape[0] + + def __getitem__(self, idx): + return self.src_inputs[idx], self.tgt_inputs[idx], self.tgt_outputs[idx] diff --git a/examples/trans/model.py b/examples/trans/model.py new file mode 100644 index 000000000..fc94a0cbc --- /dev/null +++ b/examples/trans/model.py @@ -0,0 +1,625 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +import math +import numpy as np +from singa import tensor +from singa import autograd +from singa import layer +from singa import model +from singa.tensor import Tensor + + +class Transformer(model.Model): + def __init__(self, src_n_token, tgt_n_token, d_model=512, n_head=8, dim_feedforward=2048, n_layers=6): + """ + Transformer model + Args: + src_n_token: the size of source vocab + tgt_n_token: the size of target vocab + d_model: the number of expected features in the encoder/decoder inputs (default=512) + n_head: the number of heads in the multi head attention models (default=8) + dim_feedforward: the dimension of the feedforward network model (default=2048) + n_layers: the number of sub-en(de)coder-layers in the en(de)coder (default=6) + """ + super(Transformer, self).__init__() + + self.opt = None + self.src_n_token = src_n_token + self.tgt_n_token = tgt_n_token + self.d_model = d_model + self.n_head = n_head + self.dim_feedforward = dim_feedforward + self.n_layers = n_layers + + # encoder / decoder / linear + self.encoder = TransformerEncoder(src_n_token=src_n_token, d_model=d_model, n_head=n_head, + dim_feedforward=dim_feedforward, n_layers=n_layers) + self.decoder = TransformerDecoder(tgt_n_token=tgt_n_token, d_model=d_model, n_head=n_head, + dim_feedforward=dim_feedforward, n_layers=n_layers) + + self.linear3d = Linear3D(in_features=d_model, out_features=tgt_n_token, bias=False) + + self.soft_cross_entropy = layer.SoftMaxCrossEntropy() + + def forward(self, enc_inputs, dec_inputs): + """ + Args: + enc_inputs: [batch_size, src_len] + dec_inputs: [batch_size, tgt_len] + + """ + # enc_outputs: [batch_size, src_len, d_model], + # enc_self_attns: [n_layers, batch_size, n_heads, src_len, src_len] + enc_outputs, enc_self_attns = self.encoder(enc_inputs) + + # dec_outputs: [batch_size, tgt_len, d_model] + # dec_self_attns: [n_layers, batch_size, n_heads, tgt_len, tgt_len] + # dec_enc_attn: [n_layers, batch_size, tgt_len, src_len] + dec_outputs, dec_self_attns, dec_enc_attns = self.decoder(dec_inputs, enc_inputs, enc_outputs) + + # dec_logits: [batch_size, tgt_len, tgt_vocab_size] + dec_logits = self.linear3d(dec_outputs) + return dec_logits, enc_self_attns, dec_self_attns, dec_enc_attns + + def train_one_batch(self, enc_inputs, dec_inputs, dec_outputs, pad): + out, _, _, _ = self.forward(enc_inputs, dec_inputs) + shape = out.shape[-1] + out = autograd.reshape(out, [-1, shape]) + + out_np = tensor.to_numpy(out) + preds_np = np.argmax(out_np, -1) + + dec_outputs_np = tensor.to_numpy(dec_outputs) + dec_outputs_np = dec_outputs_np.reshape(-1) + + y_label_mask = dec_outputs_np != pad + correct = preds_np == dec_outputs_np + acc = np.sum(y_label_mask * correct) / np.sum(y_label_mask) + dec_outputs = tensor.from_numpy(dec_outputs_np) + + loss = self.soft_cross_entropy(out, dec_outputs) + self.opt(loss) + return out, loss, acc + + def set_optimizer(self, opt): + self.opt = opt + + +class TransformerDecoder(layer.Layer): + """TransformerDecoder is a stack of N decoder layers + Args: + tgt_n_token: the size of target vocab + d_model: the number of expected features in the decoder inputs (default=512). + n_head: the number of heads in the multi head attention models (default=8). + dim_feedforward: the dimension of the feedforward network model (default=2048). + n_layers: the number of sub-decoder-layers in the decoder (default=6). + """ + + def __init__(self, tgt_n_token, d_model=512, n_head=8, dim_feedforward=2048, n_layers=6): + super(TransformerDecoder, self).__init__() + self.tgt_n_token = tgt_n_token + self.d_model = d_model + self.n_head = n_head + self.dim_feedforward = dim_feedforward + self.n_layers = n_layers + + # target_emb / pos_emb / n-layers + self.target_emb = layer.Embedding(input_dim=tgt_n_token, output_dim=d_model) + self.target_pos_emb = layer.Embedding(input_dim=tgt_n_token, output_dim=d_model) + self.layers = [] + for _ in range(n_layers): + self.layers.append(TransformerDecoderLayer(d_model=d_model, n_head=n_head, dim_feedforward=dim_feedforward)) + + def forward(self, dec_inputs, enc_inputs, enc_outputs): + """ + Args: + dec_inputs: [batch_size, tgt_len] + enc_inputs: [batch_size, src_len] + enc_outputs: [batch_size, src_len, d_model] + + """ + + # [batch_size, tgt_len, d_model] + tgt_word_emb = self.target_emb(dec_inputs) + self.target_pos_emb.initialize(dec_inputs) + self.target_pos_emb.from_pretrained(W=TransformerDecoder._get_sinusoid_encoding_table(self.tgt_n_token, self.d_model), + freeze=True) + # [batch_size, tgt_len, d_model] + tgt_pos_emb = self.target_pos_emb(dec_inputs) + # [batch_size, tgt_len, d_model] + dec_outputs = autograd.add(tgt_word_emb, tgt_pos_emb) + + # dec_self_attn_pad_mask [batch_size, tgt_len, tgt_len] + dec_self_attn_pad_mask = TransformerDecoder._get_attn_pad_mask(dec_inputs, dec_inputs) + # [batch_size, tgt_len, tgt_len] + dec_self_attn_subsequent_mask = TransformerDecoder._get_attn_subsequence_mask(dec_inputs) + + # dec_self_attn_mask [batch_size, tgt_len, tgt_len] + dec_self_attn_mask = tensor.gt((dec_self_attn_pad_mask + dec_self_attn_subsequent_mask), 0) + + # dec_enc_attn_mask [batch_size, tgt_len, src_len] + dec_enc_attn_mask = TransformerDecoder._get_attn_pad_mask(dec_inputs, enc_inputs) + + dec_self_attns, dec_enc_attns = [], [] + + for layer in self.layers: + # dec_outputs: [batch_size, tgt_len, d_model], + # dec_self_attn: [batch_size, n_heads, tgt_len, tgt_len], + # dec_enc_attn: [batch_size, h_heads, tgt_len,src_len] + dec_outputs, dec_self_attn, dec_enc_attn = layer(dec_outputs, enc_outputs, dec_self_attn_mask, + dec_enc_attn_mask) + dec_self_attns.append(dec_self_attn) + dec_enc_attns.append(dec_enc_attn) + return dec_outputs, dec_self_attns, dec_enc_attns + + @staticmethod + def _get_attn_pad_mask(seq_q, seq_k): + """ + Args: + seq_q: [batch_size, seq_len] + seq_k: [batch_size, seq_len] + Returns: + [batch_size, seq_len, seq_len] + """ + + batch_size, len_q = seq_q.shape + batch_size, len_k = seq_k.shape + seq_k_np = tensor.to_numpy(seq_k) + pad_attn_mask_np = np.where(seq_k_np == 0, 1, 0) + pad_attn_mask_np.astype(np.int32) + pad_attn_mask_np = np.expand_dims(pad_attn_mask_np, axis=1) + pad_attn_mask_np = np.broadcast_to(pad_attn_mask_np, (batch_size, len_q, len_k)) + pad_attn_mask_np = tensor.from_numpy(pad_attn_mask_np) + return pad_attn_mask_np + + @staticmethod + def _get_attn_subsequence_mask(seq): + """ + Args: + seq: [batch_size, tgt_len] + + Returns: + """ + attn_shape = [seq.shape[0], seq.shape[1], seq.shape[1]] + + # generate the upper triangular matrix, [batch_size, tgt_len, tgt_len] + subsequence_mask = np.triu(np.ones(attn_shape), k=1) + subsequence_mask.astype(np.int32) + subsequence_mask = tensor.from_numpy(subsequence_mask) + return subsequence_mask + + @staticmethod + def _get_sinusoid_encoding_table(n_position, d_model): + def cal_angle(position, hid_idx): + return position / np.power(10000, 2 * (hid_idx // 2) / d_model) + + def get_posi_angle_vec(position): + return [cal_angle(position, hid_j) for hid_j in range(d_model)] + + sinusoid_table = np.array([get_posi_angle_vec(pos_i) for pos_i in range(n_position)], np.float32) + sinusoid_table[:, 0::2] = np.sin(sinusoid_table[:, 0::2]) # Even bits use sine functions + sinusoid_table[:, 1::2] = np.cos(sinusoid_table[:, 1::2]) # Cosine function for odd digits + return tensor.Tensor(data=sinusoid_table, requires_grad=False) + + +class TransformerDecoderLayer(layer.Layer): + def __init__(self, d_model=512, n_head=8, dim_feedforward=2048): + super(TransformerDecoderLayer, self).__init__() + + self.d_model = d_model + self.n_head = n_head + self.dim_feedforward = dim_feedforward + + self.dec_self_attn = MultiHeadAttention(d_model=d_model, n_head=n_head) + self.dec_enc_attn = MultiHeadAttention(d_model=d_model, n_head=n_head) + self.pos_ffn = PoswiseFeedForwardNet(d_model=d_model, dim_feedforward=dim_feedforward) + + def forward(self, dec_inputs, enc_outputs, dec_self_attn_mask, dec_enc_attn_mask): + """ + Args: + dec_inputs: [batch_size, tgt_len, d_model] + enc_outputs: [batch_size, src_len, d_model] + dec_self_attn_mask: [batch_size, tgt_len, tgt_len] + dec_enc_attn_mask: [batch_size, tgt_len, src_len] + """ + + # dec_outputs: [batch_size, tgt_len, d_model] + # dec_self_attn: [batch_size, n_heads, tgt_len, tgt_len] + dec_outputs, dec_self_attn = self.dec_self_attn(dec_inputs, dec_inputs, dec_inputs, dec_self_attn_mask) + + # dec_outputs: [batch_size, tgt_len, d_model] + # dec_self_attn: [batch_size, n_heads, tgt_len, src_len] + dec_outputs, dec_enc_attn = self.dec_enc_attn(dec_outputs, enc_outputs, enc_outputs, dec_enc_attn_mask) + # [batch_size, tgt_len, d_model] + dec_outputs = self.pos_ffn(dec_outputs) + return dec_outputs, dec_self_attn, dec_enc_attn + + +class TransformerEncoder(layer.Layer): + """TransformerEncoder is a stack of N encoder layers + Args: + src_n_token: the source vocab size + d_model: the number of expected features in the encoder inputs (default=512). + n_head: the number of heads in the multi head attention models (default=8). + dim_feedforward: the dimension of the feedforward network model (default=2048). + n_layers: the number of sub-encoder-layers in the encoder (default=6). + """ + + def __init__(self, src_n_token, d_model=512, n_head=8, dim_feedforward=2048, n_layers=6): + super(TransformerEncoder, self).__init__() + self.src_n_token = src_n_token + self.d_model = d_model + self.n_head = n_head + self.dim_feedforward = dim_feedforward + self.n_layers = n_layers + + # input_emb / pos_emb / n-encoder layers + self.input_emb = layer.Embedding(input_dim=src_n_token, output_dim=d_model) + self.pos_emb = layer.Embedding(input_dim=src_n_token, output_dim=d_model) + self.layers = [] + for _ in range(self.n_layers): + self.layers.append(TransformerEncoderLayer(d_model=d_model, n_head=n_head, dim_feedforward=dim_feedforward)) + + def forward(self, enc_inputs): + """Pass the input through the encoder in turn. + Args: + enc_inputs: the sequence to the encoder (required). [batch_size, src_len] + """ + # [batch_size, src_len, d_model] + word_emb = self.input_emb(enc_inputs) + + self.pos_emb.initialize(enc_inputs) + self.pos_emb.from_pretrained(W=TransformerEncoder._get_sinusoid_encoding_table(self.src_n_token, self.d_model), freeze=True) + # [batch_size, src_len, d_model] + pos_emb = self.pos_emb(enc_inputs) + # enc_outputs [batch_size, src_len, d_model] + enc_outputs = autograd.add(word_emb, pos_emb) + + # enc_self_attn_mask [batch_size, src_len, src_len] + enc_self_attn_mask = TransformerEncoder._get_attn_pad_mask(enc_inputs, enc_inputs) + + enc_self_attns = [] + for layer in self.layers: + enc_outputs, enc_self_attn = layer(enc_outputs, enc_self_attn_mask) + enc_self_attns.append(enc_self_attn) + return enc_outputs, enc_self_attns + + @staticmethod + def _get_attn_pad_mask(seq_q, seq_k): + """ + Args: + seq_q: [batch_size, seq_len] + seq_k: [batch_size, seq_len] + Returns: [batch_size, seq_len, seq_len] + """ + batch_size, len_q = seq_q.shape + batch_size, len_k = seq_k.shape + seq_k_np = tensor.to_numpy(seq_k) + pad_attn_mask_np = np.where(seq_k_np == 0, 1, 0) + pad_attn_mask_np.astype(np.int32) + pad_attn_mask_np = np.expand_dims(pad_attn_mask_np, axis=1) + pad_attn_mask_np = np.broadcast_to(pad_attn_mask_np, (batch_size, len_q, len_k)) + pad_attn_mask_np = tensor.from_numpy(pad_attn_mask_np) + return pad_attn_mask_np + + @staticmethod + def _get_sinusoid_encoding_table(n_position, d_model): + def cal_angle(position, hid_idx): + return position / np.power(10000, 2 * (hid_idx // 2) / d_model) + + def get_posi_angle_vec(position): + return [cal_angle(position, hid_j) for hid_j in range(d_model)] + + sinusoid_table = np.array([get_posi_angle_vec(pos_i) for pos_i in range(n_position)], np.float32) + sinusoid_table[:, 0::2] = np.sin(sinusoid_table[:, 0::2]) + sinusoid_table[:, 1::2] = np.cos(sinusoid_table[:, 1::2]) + return tensor.Tensor(data=sinusoid_table, requires_grad=False) + + +class TransformerEncoderLayer(layer.Layer): + def __init__(self, d_model=512, n_head=8, dim_feedforward=2048): + super(TransformerEncoderLayer, self).__init__() + self.d_model = d_model + self.n_head = n_head + self.dim_feedforward = dim_feedforward + self.enc_self_attn = MultiHeadAttention(d_model, n_head) + self.pos_ffn = PoswiseFeedForwardNet(d_model=d_model, dim_feedforward=dim_feedforward, bias=False) + + def forward(self, enc_inputs, enc_self_attn_mask): + """ + Args: + enc_inputs: [batch_size, src_len, d_model] + enc_self_attn_mask: [batch_size, src_len, src_len] + + Returns: + enc_outputs: [batch_size, src_len, d_model] + attn: [batch_size, n_heads, src_len, src_len] + """ + # enc_inputs to same Q,K,V + enc_outputs, attn = self.enc_self_attn(enc_inputs, enc_inputs, enc_inputs, enc_self_attn_mask) + enc_outputs = self.pos_ffn(enc_outputs) + return enc_outputs, attn + + +def matmul4d(x1, x2): + batchs, heads = x1.shape[0], x1.shape[1] + ys = [] + for b in range(batchs): + x1b, x2b = autograd.squeeze(x1[b]), autograd.squeeze(x2[b]) + yb = [] + for h in range(heads): + x1h, x2h = autograd.squeeze(x1b[h]), autograd.squeeze(x2b[h]) + yh = autograd.matmul(x1h, x2h) + yh = autograd.unsqueeze(yh, axis=[0]) + yb.append(yh) + yb = autograd.cat(yb, axis=0) + yb = autograd.unsqueeze(yb, axis=[0]) + ys.append(yb) + y = autograd.cat(ys, axis=0) + return y + + +class MultiHeadAttention(layer.Layer): + def __init__(self, d_model=512, n_head=8): + super(MultiHeadAttention, self).__init__() + self.d_k = d_model // n_head + assert ( + self.d_k * n_head == d_model + ), "embed_dim must be divisible by num_heads" + self.d_model = d_model + self.d_v = self.d_k + self.n_head = n_head + self.W_Q = Linear3D(d_model, self.d_k * n_head) + self.W_K = Linear3D(d_model, self.d_k * n_head) + self.W_V = Linear3D(d_model, self.d_v * n_head) + + self.scaled_dot_product_attention = ScaledDotProductAttention(d_model, n_head) + self.linear = Linear3D(self.d_v * n_head, d_model) + self.add = layer.Add() + self.layer_norm = LayerNorm(d_model) + + def forward(self, query, key, value, attn_mask): + """ + Args: + query: [batch_size, len_q, d_model] + key: [batch_size, len_k, d_model] + value: [batch_size, len_v(=len_k), d_model] + attn_mask: [batch_size, seq_len, seq_len] + Returns: + """ + residual = query + batch_size = query.shape[0] + + # (B, S, D) -proj-> (B, S, D_new) -split-> (B, S, H, W) -trans-> (B, H, S, W) + Q = self.W_Q(query) + Q = autograd.reshape(Q, [batch_size, -1, self.n_head, self.d_k]) + Q = autograd.transpose(Q, [0, 2, 1, 3]) + + K = self.W_K(key) + K = autograd.reshape(K, [batch_size, -1, self.n_head, self.d_k]) + K = autograd.transpose(K, [0, 2, 1, 3]) + + V = self.W_V(value) + V = autograd.reshape(V, [batch_size, -1, self.n_head, self.d_v]) + V = autograd.transpose(V, [0, 2, 1, 3]) + + # Q: [batch_size, n_heads, len_q, d_k] + # K: [batch_size, n_heads, len_k, d_k] + # V: [batch_size, n_heads, len_v(=len_k), d_v] + + # attn_mask : [batch_size, n_heads, seq_len, seq_len] + attn_mask = MultiHeadAttention._get_attn_mask(attn_mask, self.n_head) + + # context: [batch_size, n_heads, len_q, d_v] + # attn: [batch_size, n_heads, seq_len, seq_len] + context, attn = self.scaled_dot_product_attention(Q, K, V, attn_mask) + context = autograd.transpose(context, [0, 2, 1, 3]) + # context: [batch_size, len_q, n_heads * d_v] + context = autograd.reshape(context, [batch_size, -1, self.n_head * self.d_v]) + + output = self.linear(context) + output = self.add(output, residual) + # [batch_size, len_q, d_model] + output = self.layer_norm(output) + return output, attn + + @staticmethod + def _get_attn_mask(attn_mask, n_head): + batch_size, seq_q_len,seq_k_len = attn_mask.shape[0], attn_mask.shape[1], attn_mask.shape[2] + attn_mask_np = tensor.to_numpy(attn_mask) + attn_mask_np = np.expand_dims(attn_mask_np, axis=1) + attn_mask_np = np.broadcast_to(attn_mask_np, (batch_size, n_head, seq_q_len, seq_k_len)) + return tensor.from_numpy(attn_mask_np) + + +class ScaledDotProductAttention(layer.Layer): + def __init__(self, d_model=512, n_head=8): + super(ScaledDotProductAttention, self).__init__() + self.d_k = d_model // n_head + assert ( + self.d_k * n_head == d_model + ), "embed_dim must be divisible by num_heads" + + def forward(self, query, key, value, attn_mask): + """ + Args: + query: [batch_size, n_heads, len_q, d_k] + key: [batch_size, n_heads, len_k, d_k] + value: [batch_size, n_heads, len_v(=len_k), d_v] + attn_mask: [batch_size, n_heads, seq_len, seq_len] + Returns: + """ + + K_trans = autograd.transpose(key, [0, 1, 3, 2]) + + # scores : [batch_size, n_heads, len_q, len_k] + # query [batch_size, n_heads, len_q, d_k] + # k^T [batch_size, n_heads, d_k, len_k] + scores = matmul4d(query, K_trans) + d_k_sqrt = Tensor(shape=(1,), requires_grad=False, stores_grad=False) + d_k_sqrt.set_value(np.sqrt(self.d_k)) + scores = autograd.div(scores, d_k_sqrt) + + mask_fill = Tensor(shape=attn_mask.shape, data=np.full(attn_mask.shape, -1e6, dtype=np.float32), requires_grad=False, stores_grad=False) + attn_mask_np = tensor.to_numpy(attn_mask) + scores = autograd.where(mask_fill, scores, attn_mask_np) + + attn = autograd.softmax(scores, axis=-1) + # context: [batch_size, n_heads, len_q, d_v] + # attn: [batch_size, n_heads, len_q, len_k] value: [batch_size, n_heads, len_v(=len_k), d_v] + context = matmul4d(attn, value) + return context, attn + + +class PoswiseFeedForwardNet(layer.Layer): + def __init__(self, d_model=512, dim_feedforward=2048, bias=False): + super(PoswiseFeedForwardNet, self).__init__() + + self.d_model = d_model + self.dim_feedforward = dim_feedforward + self.bias = bias + + self.linear1 = Linear3D(d_model, dim_feedforward, bias=bias) + self.relu = layer.ReLU() + self.linear2 = Linear3D(dim_feedforward, d_model, bias=bias) + self.add = layer.Add() + self.norm = LayerNorm(d_model) + + def forward(self, inputs): + # inputs: [batch_size, seq_len, d_model] + residual = inputs + output = self.linear1(inputs) + output = self.relu(output) + output = self.linear2(output) + # [batch_size, seq_len, d_model] + output = self.add(output, residual) + output = self.norm(output) + return output + + +class LayerNorm(layer.Layer): + def __init__(self, n_features, eps=1e-6): + super(LayerNorm, self).__init__() + self.n_features = n_features + self.eps = eps + + def initialize(self, x): + shape = (self.n_features,) + self.Gamma = Tensor(shape=shape, dtype=x.dtype, requires_grad=False, stores_grad=False) + self.Beta = Tensor(shape=shape, dtype=x.dtype, requires_grad=False, stores_grad=False) + self.Gamma.set_value(1.0) + self.Beta.set_value(0.0) + + def forward(self, x): + # x: input tensor with shape [batch_size, n_features] + # x_normalized = (x - tensor.from_numpy(self.mean)) / tensor.from_numpy(np.sqrt(self.var + self.eps)) + # y = self.gamma * x_normalized + self.beta + mean = np.mean(tensor.to_numpy(x), axis=-1, keepdims=True) + var = np.var(tensor.to_numpy(x), axis=-1, keepdims=True) + + sub1 = tensor.from_numpy(mean) + div1 = tensor.from_numpy(np.sqrt(var + self.eps)) + x_normalized = autograd.div(autograd.sub(x, sub1), div1) + y = autograd.mul(self.Gamma, x_normalized) + y = autograd.add(y, self.Beta) + return y + + +class Linear3D(layer.Layer): + """ + Generate a Linear3D operator + """ + + # TODO: replace current with + # def __init__(self, out_features, bias=True): + def __init__(self, out_features, *args, bias=False, **kwargs): + """ + Args: + ut_channels: int, the channel of output, also is the number of + filters + bias: bool + """ + super(Linear3D, self).__init__() + self.out_features = out_features + + # TODO: for backward compatibility, to remove + if len(args) > 0: + self.in_features = out_features + self.out_features = args[0] + if len(args) > 1: + self.bias = args[1] + else: + self.bias = bias + + def initialize(self, x): + self.in_features = x.shape[-1] + w_shape = (self.in_features, self.out_features) + b_shape = (self.out_features,) + + self.W = Tensor(shape=w_shape, + dtype=x.dtype, + requires_grad=True, + stores_grad=True) + std = math.sqrt(2.0 / (self.in_features + self.out_features)) + self.W.gaussian(0.0, std) + + if self.bias: + self.b = Tensor(shape=b_shape, + dtype=x.dtype, + requires_grad=True, + stores_grad=True) + self.b.set_value(0.0) + else: + self.b = None + + def forward(self, x): + if self.b: + self.device_check(x, self.W, self.b) + self.dtype_check(x, self.W, self.b) + else: + self.device_check(x, self.W) + self.dtype_check(x, self.W) + + assert x.shape[-1] == self.W.shape[0], ( + "Linear3D layer expects input features size %d received %d" % + (self.W.shape[0], x.shape[-1])) + + ys = [] + batch = x.shape[0] + for i in range(batch): + xi = autograd.squeeze(x[i]) + yi = autograd.matmul(xi, self.W) + if self.bias: + yi = autograd.add_bias(yi, self.b, axis=0) + yi = autograd.unsqueeze(yi, axis=[0]) + ys.append(yi) + y = autograd.cat(ys, axis=0) + return y + + def get_params(self): + if self.bias: + return {self.W.name: self.W, self.b.name: self.b} + else: + return {self.W.name: self.W} + + def set_params(self, parameters): + self.W.copy_from(parameters[self.W.name]) + if self.bias: + self.b.copy_from(parameters[self.b.name]) diff --git a/examples/trans/run.sh b/examples/trans/run.sh new file mode 100644 index 000000000..3e7e11bc0 --- /dev/null +++ b/examples/trans/run.sh @@ -0,0 +1,21 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +# run this example +python train.py --dataset cmn-2000.txt --max-epoch 300 --batch-size 32 --lr 0.01 \ No newline at end of file diff --git a/examples/trans/train.py b/examples/trans/train.py new file mode 100644 index 000000000..995312033 --- /dev/null +++ b/examples/trans/train.py @@ -0,0 +1,167 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +import random +import time +import argparse +import numpy as np +from singa import device +from singa import tensor +from singa import opt +from model import Transformer +import matplotlib.pyplot as plt +from data import CmnDataset + + +def run(args): + dev = device.create_cpu_device() + dev.SetRandSeed(args.seed) + np.random.seed(args.seed) + + batch_size = args.batch_size + cmn_dataset = CmnDataset(path="cmn-eng/"+args.dataset, shuffle=args.shuffle, batch_size=batch_size, train_ratio=0.8) + + print("【step-0】 prepare dataset...") + src_vocab_size, tgt_vocab_size = cmn_dataset.en_vab_size, cmn_dataset.cn_vab_size + src_len, tgt_len = cmn_dataset.src_max_len+1, cmn_dataset.tgt_max_len+1 + pad = cmn_dataset.cn_vab[""] + # train set + train_size = cmn_dataset.train_size + train_max_batch = train_size // batch_size + if train_size % batch_size > 0: + train_max_batch += 1 + + # test set + test_size = cmn_dataset.test_size + test_max_batch = test_size // batch_size + if test_size % batch_size > 0: + test_max_batch += 1 + print("【step-0】 src_vocab_size: %d, tgt_vocab_size: %d, src_max_len: %d, tgt_max_len: %d, " + "train_size: %d, test_size: %d, train_max_batch: %d, test_max_batch: %d" % + (src_vocab_size, tgt_vocab_size, src_len, tgt_len, train_size, test_size, train_max_batch, test_max_batch)) + + print("【step-1】 prepare transformer model...") + model = Transformer(src_n_token=src_vocab_size, + tgt_n_token=tgt_vocab_size, + d_model=args.d_model, + n_head=args.n_head, + dim_feedforward=args.dim_feedforward, + n_layers=args.n_layers) + + optimizer = opt.SGD(lr=args.lr, momentum=0.9, weight_decay=1e-5) + model.set_optimizer(optimizer) + print("【step-1】 src_n_token: %d, tgt_n_token: %d, d_model: %d, n_head: %d, dim_feedforward: %d, n_layers: %d, lr: %f" + % (src_vocab_size, tgt_vocab_size, args.d_model, args.n_head, args.dim_feedforward, args.n_layers, args.lr)) + + tx_enc_inputs = tensor.Tensor((batch_size, src_len), dev, tensor.int32, + np.zeros((batch_size, src_len), dtype=np.int32)) + tx_dec_inputs = tensor.Tensor((batch_size, tgt_len), dev, tensor.int32, + np.zeros((batch_size, tgt_len), dtype=np.int32)) + ty_dec_outputs = tensor.Tensor((batch_size, tgt_len), dev, tensor.int32, + np.zeros((batch_size, tgt_len), dtype=np.int32)) + # model.compile([tx_enc_inputs, tx_dec_inputs], is_train=True) + + print("【step-2】 training start...") + train_epoch_avg_loss_history = [] + train_epoch_avg_acc_history = [] + test_epoch_avg_acc_history = [] + for epoch in range(args.max_epoch): + # ok = input("Train[Yes/No]") + # if ok == "No": + # break + model.train() + model.graph(mode=False, sequential=False) + train_epoch_total_loss = 0 + train_epoch_total_acc = 0.0 + print("【Train epoch %d】 Start..." % epoch) + start_time = time.time() + for bat in range(train_max_batch): + x_enc_inputs, x_dec_inputs, y_dec_outputs = cmn_dataset.get_batch_data(batch=bat, mode='train') + tx_enc_inputs.copy_from_numpy(x_enc_inputs) + tx_dec_inputs.copy_from_numpy(x_dec_inputs) + ty_dec_outputs.copy_from_numpy(y_dec_outputs) + out, loss, acc = model(tx_enc_inputs, tx_dec_inputs, ty_dec_outputs, pad) + loss_np = tensor.to_numpy(loss) + batch_loss = loss_np[0] + train_epoch_total_loss += batch_loss + train_epoch_total_acc += acc + if bat % 5 == 0: + end_time = time.time() + print("[Train epoch-%d] [%d/%d] batch loss: [%.6f], acc: [%.3f %%] time:[%.6fs]" % + (epoch, bat, train_max_batch, batch_loss, acc*100.0, end_time-start_time)) + start_time = time.time() + train_epoch_avg_loss = train_epoch_total_loss / train_max_batch + train_epoch_avg_acc = train_epoch_total_acc / train_max_batch + train_epoch_avg_loss_history.append(train_epoch_avg_loss) + train_epoch_avg_acc_history.append(train_epoch_avg_acc) + print("[Train epoch-%d] avg loss: [%.6f], avg acc: [%.3f %%]" % (epoch, train_epoch_avg_loss, train_epoch_avg_acc*100.0)) + print("【Train Epoch %d】 End" % (epoch)) + # eval + model.eval() + print("【Test Eval】 Start...") + avg_acc = 0.0 + for bat in range(test_max_batch): + x_enc_inputs, x_dec_inputs, y_dec_outputs = cmn_dataset.get_batch_data(batch=bat, mode='test') + tx_enc_inputs.copy_from_numpy(x_enc_inputs) + tx_dec_inputs.copy_from_numpy(x_dec_inputs) + # ty_dec_outputs.copy_from_numpy(y_dec_outputs) + # y_dec_outputs [batch_size, tgt_len] + # out [batch_size, tgt_len, tgt_vocab_size] + out, _, _, _ = model(tx_enc_inputs, tx_dec_inputs) + out_np = tensor.to_numpy(out) + out_np = np.reshape(out_np, (-1, out_np.shape[-1])) + pred_np = np.argmax(out_np, -1) + y_dec_outputs = np.reshape(y_dec_outputs, -1) + y_label_mask = y_dec_outputs != pad + correct = pred_np == y_dec_outputs + acc = np.sum(y_label_mask * correct) / np.sum(y_label_mask) + avg_acc += acc + avg_acc = avg_acc / test_max_batch + test_epoch_avg_acc_history.append(avg_acc) + print("[Test epoch-%d] avg acc: %.3f %%" % (epoch, avg_acc*100.0)) + print("【Test Eval】 End...") + plt.subplot(2, 1, 1) + plt.plot(train_epoch_avg_loss_history, 'r-', label="train loss") + plt.legend() + + plt.subplot(2, 1, 2) + plt.plot(train_epoch_avg_acc_history, 'r-', label="train acc") + plt.plot(test_epoch_avg_acc_history, 'b-', label="test acc") + plt.legend() + plt.show() + timestamp = time.time() + plt.savefig("batch_train_loss" + str(timestamp).replace(".", "_") + ".png") + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description="Training Transformer Model.") + parser.add_argument('--dataset', choices=['cmn.txt', 'cmn-15000.txt', + 'cmn-2000.txt'], default='cmn-2000.txt') + parser.add_argument('--max-epoch', default=100, type=int, help='maximum epochs.', dest='max_epoch') + parser.add_argument('--batch-size', default=64, type=int, help='batch size', dest='batch_size') + parser.add_argument('--shuffle', default=True, type=bool, help='shuffle the dataset', dest='shuffle') + parser.add_argument('--lr', default=0.005, type=float, help='learning rate', dest='lr') + parser.add_argument('--seed', default=0, type=int, help='random seed', dest='seed') + parser.add_argument('--d_model', default=512, type=int, help='transformer model d_model', dest='d_model') + parser.add_argument('--n_head', default=8, type=int, help='transformer model n_head', dest='n_head') + parser.add_argument('--dim_feedforward', default=2048, type=int, help='transformer model dim_feedforward', dest='dim_feedforward') + parser.add_argument('--n_layers', default=6, type=int, help='transformer model n_layers', dest='n_layers') + args = parser.parse_args() + print(args) + run(args) diff --git a/java/pom.xml b/java/pom.xml index 7f40b2d15..82976f942 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -108,6 +108,7 @@ examples/model_selection/Trails/internal/pg_extension/template/Cargo.pg11.toml examples/model_selection/Trails/documents/ai_db.001.jpeg examples/singa_easy/examples/data/SampleQuestion.json + examples/trans/cmn-eng/cmn-2000.txt True diff --git a/setup.py b/setup.py index c057b78c4..a7811c77f 100644 --- a/setup.py +++ b/setup.py @@ -83,7 +83,7 @@ from datetime import date # stable version -VERSION = '4.2.0' +VERSION = '4.3.0' # get the git hash # git_hash = subprocess.check_output(["git", "describe"]).strip().split('-')[-1][1:] # comment the next line to build wheel for stable version diff --git a/tool/conda/singa/meta.yaml b/tool/conda/singa/meta.yaml index a3428a598..e8e2fcc60 100644 --- a/tool/conda/singa/meta.yaml +++ b/tool/conda/singa/meta.yaml @@ -20,7 +20,7 @@ # https://docs.conda.io/projects/conda-build/en/latest/resources/define-metadata.html#templating-with-jinja # {% set data = load_setup_py_data(setup_file='../../../python/singa/setup.py', from_recipe_dir=True) %} -{% set version = "4.2.0" %} +{% set version = "4.3.0" %} package: name: singa