目录

        • 引言
        • TFRecord
          • tfrecord写入代码:
          • 基于PyTorch下tfrecord读取代码:
        • LMDB
          • 写入LMDB
          • 读取LMDB
        • 二进制大文件
          • 写入bins
          • 读取bins
        • Sqlite
          • 写入到sqlite数据库中
          • 读取数据库
        • 最终结论
        • 参考资料

引言

  • Tensorflow有着专门的数据读取模块tfrecord,可以高效地读取训练神经网络模型所用的数据,充分喂饱GPU
  • Caffe用lmdb来读取数据,也可以很高效地去读取
  • PyTorch有DataLoader读取数据,但是速度比较慢,尤其是小文件较多情况下
  • 如何基于PyTorch,高效读取数据,充分利用GPU性能,成为一个关键问题?

TFRecord

  • 是否可以将tensorflow下的tfrecord借来一用?未尝不可
  • 目前已经有伙伴实现了,详情参见:tfrecord
  • 同时,在Kaggle上,也有大神手动实现,详情参见:PyTorch TFRecord-Loader
tfrecord写入代码:
```python
import cv2
import numpy as np
import tensorflow as tf
from tqdm import tqdmfrom data_loader import TFRecordDataLoaderdef read_txt(txt_path):with open(txt_path, 'r', encoding='utf-8') as f:data = f.readlines()data = list(map(lambda x: x.rstrip('\n'), data))return datadef bytes_to_numpy(image_bytes):image_np = np.frombuffer(image_bytes, dtype=np.uint8)image_np2 = cv2.imdecode(image_np, cv2.IMREAD_COLOR)return image_np2  def list_record_features(tfrecords_path):"""查看tfrecords结构https://stackoverflow.com/questions/63562691/reading-a-tfrecord-file-where-features-that-were-used-to-encode-is-not-knownArgs:tfrecords_path (str): tfrecords路径Returns:dict: 结构信息"""features = {}dataset = tf.data.TFRecordDataset([str(tfrecords_path)])data = next(iter(dataset))example = tf.train.Example()example_bytes = data.numpy()example.ParseFromString(example_bytes)for key, value in example.features.feature.items():kind = value.WhichOneof('kind')size = len(getattr(value, kind).value)if key in features:kind2, size2 = features[key]if kind != kind2:kind = Noneif size != size2:size = Nonefeatures[key] = (kind, size)return featuresclass TFRecorder(object):def __init__(self) -> None:super().__init__()self.feature_dict = {'height': None,'width': None,'depth': None,'label': None,'image_raw': None}self.AUTO = tf.data.experimental.AUTOTUNEdef image_to_feature(self, image_string, label):height, width, channel = tf.image.decode_image(image_string).shapeself.feature_dict = {'height': self._int64_feature(height),'width': self._int64_feature(width),'depth': self._int64_feature(channel),'label': self._int64_feature(label),'image_raw': self._bytes_feature(image_string)}return tf.train.Example(features=tf.train.Features(feature=self.feature_dict))def write(self, save_path, img_label_dict):with tf.io.TFRecordWriter(save_path) as writer:for file_name, label in tqdm(img_label_dict.items()):img_string = open(file_name, 'rb').read()feature = self.image_to_feature(img_string, label)writer.write(feature.SerializeToString())def read(self, tfrecord_path):reader = tf.data.TFRecordDataset(tfrecord_path)dataset = reader.map(self._parse_image_function,num_parallel_calls=self.AUTO)return datasetdef _parse_image_function(self, example_proto):self.feature_dict = {'height': tf.io.FixedLenFeature([], tf.int64),'width': tf.io.FixedLenFeature([], tf.int64),'depth': tf.io.FixedLenFeature([], tf.int64),'label': tf.io.FixedLenFeature([], tf.int64),'image_raw': tf.io.FixedLenFeature([], tf.string)}example = tf.io.parse_single_example(example_proto,self.feature_dict)return example@staticmethoddef _bytes_feature(value):"""Returns a bytes_list from a string / byte."""if isinstance(value, type(tf.constant(0))):# BytesList won't unpack a string from an EagerTensor.value = value.numpy()return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))@staticmethoddef _float_feature(value):"""Returns a float_list from a float / double."""return tf.train.Feature(float_list=tf.train.FloatList(value=[value]))@staticmethoddef _int64_feature(value):"""Returns an int64_list from a bool / enum / int / uint."""return tf.train.Feature(int64_list=tf.train.Int64List(value=[value]))if __name__ == '__main__':tfrecorder = TFRecorder()# val.txt中存放的是图像的相对路径img_path = read_txt('dataset/val.txt')# Path(v).parent.name: 图像的标签img_label_dict = {v: int(Path(v).parent.name) for v in img_path}save_path = 'temp/val.tfrecords'tfrecorder.write(save_path, img_label_dict)dataset = tfrecorder.read('dataset/val.tfrecords')for v in dataset:img, label = vprint('ok')# 查看未知tfrecords结构信息list_record_features('xxxx.tfrecords')
```
基于PyTorch下tfrecord读取代码:
```python
import cv2
import numpy as np
import tensorflow as tf
import tensorflow_datasets as tfdsAUTO = tf.data.experimental.AUTOTUNEdef bytes_to_numpy(image_bytes):image_np = np.frombuffer(image_bytes, dtype=np.uint8)image_np2 = cv2.imdecode(image_np, cv2.IMREAD_COLOR)return image_np2def read_labeled_tfrecord(example_proto):feature_dict = {'height': tf.io.FixedLenFeature([], tf.int64),'width': tf.io.FixedLenFeature([], tf.int64),'depth': tf.io.FixedLenFeature([], tf.int64),'label': tf.io.FixedLenFeature([], tf.int64),'image_raw': tf.io.FixedLenFeature([], tf.string)}example = tf.io.parse_single_example(example_proto,feature_dict)img = tf.io.decode_image(example['image_raw'], channels=3,expand_animations=False)img = tf.image.resize_with_crop_or_pad(img,target_height=388,target_width=270)return img, example['label']def get_dataset(files, batch_size=16, repeat=False,cache=False, shuffle=False):ds = tf.data.TFRecordDataset(files, num_parallel_reads=AUTO)if cache:ds = ds.cache()if repeat:ds = ds.repeat()if shuffle:ds = ds.shuffle(1024 * 2)opt = tf.data.Options()opt.experimental_deterministic = Falseds = ds.with_options(opt)ds = ds.map(read_labeled_tfrecord, num_parallel_calls=AUTO)ds = ds.batch(batch_size)ds = ds.prefetch(AUTO)return tfds.as_numpy(ds)def count_data_items(file):num_ds = tf.data.TFRecordDataset(file, num_parallel_reads=AUTO)num_ds = num_ds.map(read_labeled_tfrecord, num_parallel_calls=AUTO)num_ds = num_ds.repeat(1)num_ds = num_ds.batch(1)c = 0for _ in num_ds:c += 1del num_dsreturn cclass TFRecordDataLoader:def __init__(self, files, batch_size=32, cache=False, train=True,repeat=False, shuffle=False, labeled=True,return_image_ids=True):self.ds = get_dataset(files,batch_size=batch_size,cache=cache,repeat=repeat,shuffle=shuffle,)if train:self.num_examples = count_data_items(files)self.batch_size = batch_sizeself.labeled = labeledself.return_image_ids = return_image_idsself._iterator = Nonedef __iter__(self):if self._iterator is None:self._iterator = iter(self.ds)else:self._reset()return self._iteratordef _reset(self):self._iterator = iter(self.ds)def __next__(self):batch = next(self._iterator)return batchdef __len__(self):n_batches = self.num_examples // self.batch_sizeif self.num_examples % self.batch_size == 0:return n_batcheselse:return n_batches + 1# 使用
train_txt_path = 'dataset/minist/train.tfrecords'
train_dataloader = TFRecordDataLoader(train_txt_path,batch_size=batch_size,shuffle=True)
for v in train_dataloader:pass
```

LMDB

  • 纵观各大论坛,说到基于PyTorch下提高小文件读取速度,不得不说到LMDB(Lightning Memory-Mapped Database)了,我也做了一些尝试,最终结论将在最后给出
写入LMDB
 import osimport picklefrom pathlib import Pathimport cv2import lmdbimport numpy as npfrom PIL import Imagefrom torch.utils.data import DataLoader, Datasetfrom torchvision import transformsfrom tqdm import tqdmimport utilsclass SimpleDataset(Dataset):def __init__(self, txt_path, transform=None) -> None:self.img_paths = utils.read_txt(txt_path)self.transform = transformdef __getitem__(self, index: int):img_path = self.img_paths[index]label = int(Path(img_path).parent.name)try:img = Image.open(img_path)img = img.convert('RGB')except:img = cv2.imread(img_path)img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)img = Image.fromarray(img)if self.transform:img = self.transform(img)img = np.array(img)return img, labeldef __len__(self) -> int:return len(self.img_paths)class LMDB_Image:def __init__(self, image, label):# Dimensions of image for reconstruction - not really necessary# for this dataset, but some datasets may include images of# varying sizesself.channels = image.shape[2]self.size = image.shape[:2]self.image = image.tobytes()self.label = labeldef get_image(self):""" Returns the image as a numpy array. """image = np.frombuffer(self.image, dtype=np.uint8)return image.reshape(*self.size, self.channels)def data2lmdb(dpath, name="train", txt_path=None,write_frequency=10, num_workers=4):dataset = SimpleDataset(txt_path=txt_path)data_loader = DataLoader(dataset, num_workers=num_workers,collate_fn=lambda x: x)lmdb_path = os.path.join(dpath, "%s.lmdb" % name)isdir = os.path.isdir(lmdb_path)print("Generate LMDB to %s" % lmdb_path)db = lmdb.open(lmdb_path, subdir=isdir,map_size=1099511627776,  # 单位bytereadonly=False,meminit=False,map_async=True)txn = db.begin(write=True)for idx, data in enumerate(tqdm(data_loader)):image, label = data[0]temp = LMDB_Image(image, label)txn.put(u'{}'.format(idx).encode('ascii'), pickle.dumps(temp))if idx % write_frequency == 0:print("[%d/%d]" % (idx, len(data_loader)))txn.commit()txn = db.begin(write=True)# finish iterating through datasettxn.commit()keys = [u'{}'.format(k).encode('ascii') for k in range(idx + 1)]with db.begin(write=True) as txn:txn.put(b'__keys__', pickle.dumps(keys))txn.put(b'__len__', pickle.dumps(len(keys)))print("Flushing database ...")db.sync()db.close()if __name__ == '__main__':save_dir = 'dataset/minist'data2lmdb(save_dir, name='val', txt_path='dataset/minist/val.txt')
读取LMDB
class DatasetLMDB(Dataset):def __init__(self, db_path, transform=None):self.db_path = db_pathself.env = lmdb.open(db_path,subdir=os.path.isdir(db_path),readonly=True, lock=False,readahead=False, meminit=False)with self.env.begin() as txn:self.length = pickle.loads(txn.get(b'__len__'))self.keys = pickle.loads(txn.get(b'__keys__'))self.transform = transformdef __getitem__(self, index):with self.env.begin() as txn:byteflow = txn.get(self.keys[index])IMAGE = pickle.loads(byteflow)img, label = IMAGE.get_image(), IMAGE.labelreturn Image.fromarray(img).convert('RGB'), labeldef __len__(self):return self.length# 使用
train_transforms = transforms.Compose([transforms.Resize((388, 270)),transforms.RandomChoice([transforms.RandomRotation(10),transforms.RandomHorizontalFlip(0.5),transforms.RandomGrayscale(p=0.3),transforms.RandomPerspective(distortion_scale=0.6, p=0.5),transforms.ColorJitter(brightness=.5, hue=.3),]),transforms.ToTensor(),normalize,transforms.RandomErasing(),])train_dataset = DatasetLMDB(train_txt_path, train_transforms)
train_dataloader = DataLoader(train_dataset,batch_size=batch_size,shuffle=True,num_workers=n_worker,pin_memory=True)
# do other things

二进制大文件

  • 直接将现有数据集按照二进制读取,存入一个bins的大文件中,也不失为一种选择
写入bins
import cv2
import numpy as np
from tqdm import tqdmdef write_bin(save_bin_path, save_index_path, data):"""将现有基于文件的数据集写为bin大文件写入到save_index_path中的索引位置和标签,中间以\t分割Args:save_bin_path (str): 保存bin的位置save_index_path (str): 保存bin中索引和对应标签data (str): 存放图像路径和对应标签的list,e.g. [['xxx/1.jpg', 'cat'], ['xxx/2.jpg', 'dog']]"""with open(save_bin_path, 'wb') as f_w, \open(save_index_path, 'w') as f_index:start_index = 0for img_path, label in tqdm(data):with open(img_path, 'rb') as f:img_bin = f.read()f_w.write(img_bin)len_bin = len(img_bin)f_index.write(f'{start_index}\t{len_bin}\t{label}\n')start_index += len_bindef read_bin(bin_path, index_path):"""读取bin大文件和对应的索引标签txtArgs:bin_path (str): bin大文件存放路径index_path (str): 索引和标签存放txt的路径"""with open(bin_path, 'rb') as f_bin, open(index_path, 'r') as f_index:index_lines = list(map(lambda x: x.strip(), f_index.readlines()))index_lines = list(map(lambda x: x.split('\t'), index_lines))for i, (start_index, length) in enumerate(index_lines):start_index = int(start_index)length = int(length.strip())# 定位到当前指针位置到start_indexf_bin.seek(start_index)# 读取length的字节值img_bytes = f_bin.read(length)img = np.frombuffer(img_bytes, dtype='uint8')img = cv2.imdecode(img, -1)  # -1: cv.IMREAD_UNCHANGED# 转为PIL# img = Image.fromarray(img)# img = img.convert('RGB')# 保存图像# cv2.imwrite(f'temp/images/{i}.jpg', img)
读取bins
from io import BytesIO
from PIL import Image
import cv2
import numpy as npclass SimpleDataset(Dataset):def __init__(self, txt_path, bin_path, transform=None) -> None:self.index_info = utils.read_txt(txt_path)self.index_info = list(map(lambda x: x.split('\t'), self.index_info))self.f_bin = open(bin_path, 'rb')self.transform = transformdef __getitem__(self, index: int):start_index, length, label = list(map(int, self.index_info[index]))print(start_index)self.f_bin.seek(start_index)img_bytes = self.f_bin.read(length)# 方案一:img = np.frombuffer(img_bytes, dtype='uint8')img = cv2.imdecode(img, -1)if img is None:return self.__getitem__(random.randint(0, self.__len__() - 1))img = Image.fromarray(img)img = img.convert('RGB')# 方案二:try:img = Image.open(BytesIO(img_bytes))img = img.convert('RGB')except:return self.__getitem__(random.randint(0, self.__len__() - 1))if self.transform:img = self.transform(img)return img, labeldef __len__(self) -> int:return len(self.index_info)

Sqlite

  • 采用python内置的sqlite3作为存储格式,也是一种好的选择
写入到sqlite数据库中
import sqlite3
from pathlib import Pathfrom tqdm import tqdmdef read_txt(txt_path):with open(txt_path, 'r', encoding='utf-8-sig') as f:data = list(map(lambda x: x.rstrip('\n'), f))return datadef img_to_bytes(img_path):with open(img_path, 'rb') as f:img_bytes = f.read()return img_bytesclass SQLiteWriter(object):def __init__(self, db_path):self.conn = sqlite3.connect(db_path)self.cursor = self.conn.cursor()def execute(self, sql, value=None):if value:self.cursor.execute(sql, value)else:self.cursor.execute(sql)def __enter__(self):return selfdef __exit__(self, exc_type, exc_val, exc_tb):self.cursor.close()self.conn.commit()self.conn.close()if __name__ == '__main__':dataset_dir = Path('datasets/minist')save_db_dir = dataset_dir / 'sqlite'save_db_path = str(save_db_dir / 'val.db')# val.txt中 每行为:图像路径\t对应文本值 e.g. xxxx.jpg\txxxxxximg_paths = read_txt(str(dataset_dir / 'val.txt'))with SQLiteWriter(save_db_path) as db_writer:# 创建表table_name = 'minist'# 注意这里的表中字段,要根据自己数据集来定义# 具体数据库类型,可参考:https://docs.python.org/zh-cn/3/library/sqlite3.html#sqlite-and-python-types# demo中示例所涉及到的数据集为文本识别数据集,样本为图像,标签为对应文本,# 下面示例字段的数据类型为python下的数据类型,只需转为以下对应数据类型即可写入数据库的表中# e.g. img_path: str(xxxx.jpg), img_data: bytes格式的图像数据, img_label: str(xxxxx)create_table_sql = f'create table {table_name} (img_path TEXT primary key, img_data BLOB, img_label TEXT)'db_writer.execute(create_table_sql)# 向表中插入数据,value部分采用占位符insert_sql = f'insert into {table_name} (img_path, img_data, img_label) values(?, ?, ?)'for img_info in tqdm(img_paths):img_path, label = img_info.split('\t')img_full_path = str(dataset_dir / 'images' / img_path)img_data = img_to_bytes(img_full_path)db_writer.execute(insert_sql, (img_path, img_data, label))
读取数据库
class SimpleDataset(Dataset):def __init__(self, db_path, transform=None) -> None:self.db_path = db_pathself.conn = Noneself.establish_conn()# 数据库中表名self.table_name = 'Synthetic_chinese_dataset'self.cursor.execute(f'select max(rowid) from {self.table_name}')self.nums = self.cursor.fetchall()[0][0]self.transform = transformdef __getitem__(self, index: int):self.establish_conn()# 查询search_sql = f'select * from {self.table_name} where rowid=?'self.cursor.execute(search_sql, (index+1, ))img_path, img_bytes, label = self.cursor.fetchone()# 还原图像和标签img = Image.open(BytesIO(img_bytes))img = img.convert('RGB')img = scale_resize_pillow(img, (320, 32))if self.transform:img = self.transform(img)return img, labeldef __len__(self) -> int:return self.numsdef establish_conn(self):if self.conn is None:self.conn = sqlite3.connect(self.db_path,check_same_thread=False,cached_statements=1024)self.cursor = self.conn.cursor()return selfdef close_conn(self):if self.conn is not None:self.cursor.close()self.conn.close()del self.connself.conn = Nonereturn self  # --------------------------------------------------
train_dataset = SimpleDataset(train_db_path, train_transforms)
# ✧✧使用部分,需要手动关闭数据库连接
train_dataset.close_conn()
train_dataloader = DataLoader(train_dataset,batch_size=batch_size,num_workers=n_worker,pin_memory=True,sampler=train_sampler)

最终结论

  • TFRecord

    • 转换前后,数据存储大小不变,可以充分利用GPU
    • tfrecord不能接入到其他数据增强方式(imgaug,opencv),且数据增强方式十分有限
  • LMDB

    • 转换前后,数据存储大小会变得很大(原始4.2G→转换后96G)
    • PyTorch多进程读取数据时,会出现图像不能还原为原始图像问题,暂时未找到解决方案
    • 读取效率可以充分利用GPU
  • 二进制大文件

    • 转换前后,数据存储大小不变
    • 同样,PyTorch多进程读取,也会出现图像不能正确还原的问题,暂时未找到解决方案
  • ✧ sqlite(推荐使用)

    • 转换前后,数据存储大小不变
    • 可以正常多进程读取

参考资料

  • pytorch-sqlite
  • sqlite_dataset
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 从上传webshell到突破TCP/IP筛选到3389终端登陆 作者:LvHuaNa

    日期:2004.12.11LvHuaNa一:得到webshell今天晚上的一次小小测试,由于本人太菜,再高深的技术我也不会,只能这样了..........一切都已经过去了,没有办法补图了,希望能看的懂这个小帖子。今天又是无聊的一天,晚上实在无聊没有事情干,就到一个视频聊天站点看秀,嘿嘿~突然…...

    2024/3/6 3:53:47
  2. os.chdir用法

    def chdir(*args, **kwargs): # real signature unknown"""Change the current working directory to the specified path. os.chdir(project_config[data_path][path]) Python os.chdir() 方法 | 菜鸟教程...

    2024/3/6 3:53:45
  3. CF1594E1 Rubik‘s Cube Coloring (easy version)

    又是没弄懂的一题 #include<bits/stdc.h> #define int long long using namespace std;const int mod 1e9 7; signed main() {int n; cin >> n;int f[100005];f[1] 16;for (int i 2; i < n 1; i ){f[i] (f[i - 1] * f[i - 1]) % mod * 16 % mod;}f[0]…...

    2024/3/22 23:00:50
  4. 如何在 MacOS Monterey 菜单栏上显示电池百分比

    点击右上角【关注】我们&#xff0c;获取更多前沿科技信息。本文共663字&#xff0c;阅读全文约2分钟苹果的新系统 MacOS Monterey 默认是没有显示出电池的百分比&#xff0c;这让很多习惯在菜单栏中查看电池百分比的用户来说&#xff0c;有一些不适用。因为电池百分比是一种快…...

    2024/3/6 3:53:45
  5. 操作系统-互斥实现的硬件方法

    为了解决进程互斥进入临界区的问题&#xff0c;需要采取有效措施。利用硬件实现互斥的方法有禁止中断和专用机器指令两种方法。 1、禁止中断 在单处理机环境中&#xff0c;并发执行的进程不能在CPU上同时执行&#xff0c;只能交替执行。另外&#xff0c;对一个进程而言&#…...

    2024/3/6 3:53:42
  6. pip安装第三方库失败:WARNING: You are using pip version 20.2.3; however, version 21.3.1 is available.

    cmd输入 python -m pip install --upgrade pip -i https://pypi.douban.com/simple...

    2024/3/4 16:18:26
  7. MAMP Pro for Mac(PHP/MySQL开发环境)支持Monterey12.x系统

    mamp pro mac版是mac平台上最优秀的本地服务器搭配软件&#xff0c;也是最好的mysql开发环境和php开发环境&#xff0c;包含了acintosh、Apache、MySQL和PHP四大开发环境&#xff0c;用户只要轻松点选就能对架站、讨论区、论坛等必备的元件进行安装&#xff0c;让你轻松在mac平…...

    2024/3/4 16:18:26
  8. XSS-Payloads集合

    XSS-Payloads <!-- 仅适用于反射型XSS --!> <svg/onloadeval(name)><!-- 如果你控制了 URL --> <svg/onloadeval(URL)><!-- 如果你控制了名字&#xff0c;但是 unsafe-eval 没有启用 --> <svg/onloadlocationname><!-- 在 chrome 中…...

    2024/3/4 16:18:24
  9. git Bush使用openssl生成私钥和公钥

    生成私钥和公钥 $ ssh-keygen # 输入命令后回车。 Generating public/private rsa key pair. Enter file in which to save the key (/c/Users/Administrator/.ssh/id_rsa): # 保存路径和文件名&#xff0c;保持默认回车&#xff0c;如需修改可在&#xff1a;后输入 Created …...

    2024/3/4 16:18:23
  10. 2D激光雷达的多传感器拼接

    0.简介 为了保证激光雷达的360环境覆盖&#xff0c;我们常常需要用到多传感器的拼接&#xff0c;如果我们单纯的取读取激光雷达的信息会出现如下图的情况&#xff0c;两个激光雷达会发生重叠&#xff0c;这就需要我们去对激光雷达进行标定。 <arg name"device_ip1&qu…...

    2024/3/6 3:53:41
  11. MySql为什么选错了索引

    案例 线上环境&#xff0c;mysql&#xff0c;选错索引sql执行超过20分钟&#xff0c;导致cpu飙升到95%解决 强制走正确索引-------并非最佳选择 select * from table_name force index(index_name)复盘 1.mysql是如何选择索引的 扫描行数是影响执行代价的因素之一。扫描的行…...

    2024/3/6 3:53:41
  12. STM32之中断的使用

    本文内容&#xff1a;本文主要介绍STM32中的中断系统&#xff0c;并用中断进行点灯和串口通信。 一、何为中断 中断是当CPU在处理某一事件A时&#xff0c;发生了另一事件B&#xff0c;请求CPU迅速去处理&#xff0c;CPU暂停当前的工作&#xff0c;转去处理事件B&#xff0c;当…...

    2024/3/6 3:53:40
  13. python面向对象

    面向对象 1.概念 面向过程 ——C语言&#xff0c;Fortran面向对象 ——C、Java、python 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能、行为 面向对象&#xff1a;将功能封装进对象&#xff0c;强调具备了功能的对象 面向对象是基于…...

    2024/3/6 3:53:38
  14. finally块不被执行的情况

    finally块的作用 通常用于处理善后工作。当try块里出现异常时&#xff0c;会立即跳出try块&#xff0c;到catch块匹配对应的异常&#xff0c;执行catch块里的语句。此时&#xff0c;可能在try块里存在打开的文件没关闭&#xff0c;连接的网络没断开&#xff0c;这部分资源是GC…...

    2024/3/6 3:53:40
  15. 500. 键盘行

    500. 键盘行 给你一个字符串数组 words &#xff0c;只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。 美式键盘 中&#xff1a; 第一行由字符 “qwertyuiop” 组成。 第二行由字符 “asdfghjkl” 组成。 第三行由字符 “zxcvbnm” 组成。 示例 1&a…...

    2024/3/6 3:53:37
  16. JavaSE - 面向对象-类和对象

    JavaSE - 面向对象-类和对象 本节学习目标&#xff1a; 了解面向对象的概念&#xff1b;了解面向过程编程和面向对象编程的区别&#xff1b;了解类的三大特性&#xff1b;了解并掌握类的结构与编写方式&#xff1b;了解并掌握对象的概念及其操作&#xff1b; 1. 面向对象概述…...

    2024/3/6 3:53:36
  17. L1-075 强迫症 (10 分)

    小强在统计一个小区里居民的出生年月&#xff0c;但是发现大家填写的生日格式不统一&#xff0c;例如有的人写 199808&#xff0c;有的人只写 9808。有强迫症的小强请你写个程序&#xff0c;把所有人的出生年月都整理成 年年年年-月月 格式。对于那些只写了年份后两位的信息&am…...

    2024/3/6 3:53:34
  18. python编程比赛--将1-8几个数字填写下边表格,要求每一列数字比右边大,每一行数字比下边大,有几种填法?

    python编程比赛–将1-8几个数字填写下边表格&#xff0c;要求每一列数字比右边大&#xff0c;每一行数字比下边大&#xff0c;有几种填法&#xff1f; 题目描述&#xff1a; 题目&#xff1a;将1-8几个数字填写下边表格&#xff0c;要求每一列数字比右边大&#xff0c;每一行…...

    2024/3/19 8:10:38
  19. python中all函数的用法

    默认all函数可以判定一个元组或者列表中的元素是否都为真 默认的是元组中不存在0&#xff0c;空字符 none是都为True&#xff0c;其他的都为False 也可以添加判断条件&#xff0c;判断一个列表或者元组中的所有元素是否都满足条件 以下展示了使用 all() 方法的实例&#xff…...

    2024/3/6 3:53:33
  20. Java基础——第一周学习心得

    目录#一级目录Java的语言基础&#xff1a;数据类型包括4种&#xff0c;目前阶段只有整形和浮点型最常用&#xff1b;关键字和标识符都有着相关的格式规定和特点&#xff1b;常量即具体不变的值和字符&#xff1b;变量即可以改变的值&#xff0c;但必须遵循“先声明&#xff0c;…...

    2024/3/6 3:53:31

最新文章

  1. 谷歌浏览器驱动Chromedriver(114-120版本)文件以及驱动下载教程

    ChromeDriver 官方网站 GitHub || GoogleChromeLabs/chrome-for-testing Chrome Driver 113-125_JSONChrome for Testing availability 123-125 zip 白月黑羽 Python基础 | 进阶 | Qt图形界面 | Django| 自动化测试 | 性能测试 |JS语言 | JS前端 |原理与安装...

    2024/3/29 7:18:03
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. Python爬虫-批量爬取星巴克全国门店

    前言 本文是该专栏的第22篇,后面会持续分享python爬虫干货知识,记得关注。 本文笔者以星巴克为例,通过Python实现批量爬取目标城市的门店数据以及全国的门店数据。 具体的详细思路以及代码实现逻辑,跟着笔者直接往下看正文详细内容。(附带完整代码) 正文 地址:aHR0cHM…...

    2024/3/27 14:26:14
  4. Linux运维_Linux临时环境变量设置(bin和include以及lib)

    Linux运维_Linux临时环境变量设置(bin和include以及lib) 在 Linxu 系统上设置用户环境变量可以通过编辑用户的 profile 环境变量配置文件或者 .bashrc Shell配置文件来实现。 bashrc 与 profile 的区别: bashrc: 每个脚本执行前都执行一遍这个脚本。 profile: 在系统登录后执…...

    2024/3/27 20:52:49
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/3/27 10:21:24
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/3/24 20:11:25
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/3/29 2:45:46
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/3/24 20:11:23
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/3/29 5:19:52
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/3/28 17:01:12
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/3/24 5:55:47
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/3/29 1:13:26
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/3/26 23:04:51
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/3/26 11:20:25
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/3/24 20:11:18
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/3/28 9:10:53
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/3/29 0:49:46
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/3/24 20:11:15
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/3/27 7:12:50
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/3/24 20:11:13
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/3/26 11:21:23
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/3/28 18:26:34
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/3/28 12:42:28
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/3/28 20:09:10
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57