使用tensorflow搭建分类神经网络以及迁移学习(训练过程)

***************************************************

码字不易,收藏之余,别忘了给我点个赞吧!

***************************************************

---------Start

本文不涉及tensorflow环境配置过程,只讲解整个项目代码大致内容。至于每个函数的每个参数意义,同学们可以百度了解或私信我,见谅!

第一部分(自定义模型结构)

数据集:二分类数据集,每个类别包含一个文件夹,文件夹中都保存了对应类别的图像数据。

在这里插入图片描述
Normal类
在这里插入图片描述
Tuberculosis类
在这里插入图片描述

1、项目结构

train.py:训练文件
test.py:测试文件
class_indices.json 类别信息文件(训练网络时自动生成)
our_model.py 模型文件
weights:权重文件(训练完毕之后,自动生成权重文件)
在这里插入图片描述
预先解释一下,训练一次:表示一部分(batch_size)数据送入网路,输出结果。
训练一轮:表示将训练集中的全部数据都训练一次。epoch表示训练的轮数。

2、train.py

2.1 配置路径

在这里插入图片描述

2.2 参数配置

在这里插入图片描述

2.3 声明训练集和验证集数据增强器

增强器的作用是对数据进行预处理(归一化,翻转,旋转等等)
在这里插入图片描述

2.4 根据增强器生成打包后的数据

对数据集中的图像数据应用增强器生成网络所需要格式的数据
在这里插入图片描述

2.5 将数据集读取的标签形式写入文件

在这里插入图片描述
写入文件的内容如下图所示。本文任务是两个类别,0,1分别代表两个类别的编码,Normal和Tuberculosis分别代表两个类别的名称。

在这里插入图片描述

2.6 创建模型,损失函数,优化器和评价指标

在这里插入图片描述
在这里插入图片描述

2.7 训练一次模型的函数

执行过程为:模型训练一次,计算损失,计算并更新梯度,计算精度。
在这里插入图片描述

2.8 验证一次模型的函数

执行过程为:模型训练一轮完毕后进行验证,计算损失,计算精度。验证过程不更新梯度。
在这里插入图片描述

2.9 开始epoch轮的训练

在这里插入图片描述

2.10 训练一轮后进行验证

在这里插入图片描述

2.11 记录精度和损失并保存权重

验证完成后,记录训练和验证过程的精度和损失,并保存模型权重。
在这里插入图片描述

2.12 模型训练成功

若出现以下效果,表示模型训练成功。
在这里插入图片描述

2.13 全部代码(our_model.py)

from tensorflow.keras import layers,Modeldef get_model():#输入层input_image = layers.Input(shape=(128, 128, 3), dtype="float32")#卷积层(输出通道数,卷积核大小,卷积步长)x = layers.Conv2D(filters=16, kernel_size=3, strides=2,use_bias=False)(input_image)#归一化层x = layers.BatchNormalization(momentum=0.9, epsilon=1e-5)(x)#激活函数x = layers.ReLU()(x)x = layers.Conv2D(32, kernel_size=3, strides=2,use_bias=False)(x)x = layers.BatchNormalization(momentum=0.9, epsilon=1e-5)(x)x = layers.ReLU()(x)x = layers.Conv2D(64, kernel_size=3, strides=2,use_bias=False)(x)x = layers.BatchNormalization(momentum=0.9, epsilon=1e-5)(x)x = layers.ReLU()(x)x = layers.Conv2D(128, kernel_size=3, strides=2,use_bias=False)(x)x = layers.BatchNormalization(momentum=0.9, epsilon=1e-5)(x)x = layers.ReLU()(x)x = layers.Conv2D(256, kernel_size=3, strides=2,use_bias=False)(x)x = layers.BatchNormalization(momentum=0.9, epsilon=1e-5)(x)x = layers.ReLU()(x)x = layers.Conv2D(256, kernel_size=3, strides=2,use_bias=False)(x)x = layers.BatchNormalization(momentum=0.9, epsilon=1e-5)(x)x = layers.ReLU()(x)x = layers.GlobalAvgPool2D(name="avgPool")(x)  # 1*1*128 特征降维# DropOut层(失活比例)x = layers.Dropout(rate=0.5)(x)#全连接层(全连接层个数,激活函数)x= layers.Dense(units=100,activation="relu")(x)x= layers.Dropout(rate=0.5)(x)x = layers.Dense(2, name="logits")(x)#softmax层,保证输出的结果是[0,1]的概率值predict = layers.Softmax()(x)#构建模型model = Model(inputs=input_image, outputs=predict,name='tb_model')return model

2.14 全部代码(train.py)

import os
# os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"#使用cpu进行训练
# os.environ["CUDA_VISIBLE_DEVICES"] = "-1"
import json
import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tqdm import tqdm
from train_models import our_modeldef main():#设置数据集路径image_path = "G:\dataset\TB_Database22"#训练集路径train_dir = os.path.join(image_path, "train")#验证集路径validation_dir = os.path.join(image_path, "test")#权重路径weight_path = "weights"assert os.path.exists(weight_path), "cannot find {}".format(weight_path)assert os.path.exists(train_dir), "cannot find {}".format(train_dir)assert os.path.exists(validation_dir), "cannot find {}".format(validation_dir)#参数配置#送入网络的图像大小im_height = 256im_width = 256#一次送入多少张图像到网络中batch_size = 4#训练总次数epochs = 2#学习率lr = 0.001#训练数据增强器train_image_generator = ImageDataGenerator(horizontal_flip=True,rescale=1./255,vertical_flip=True,rotation_range=6,brightness_range=[0.1,2])#验证数据增强器validation_image_generator = ImageDataGenerator(rescale=1./255)#生成训练集数据加载器train_data_gen = train_image_generator.flow_from_directory(directory=train_dir,batch_size=batch_size,shuffle=True,target_size=(im_height, im_width),class_mode='categorical')#生成验证集数据加载器val_data_gen = validation_image_generator.flow_from_directory(directory=validation_dir,batch_size=batch_size,shuffle=True,target_size=(im_height, im_width),class_mode='categorical')#训练样本总个数total_train = train_data_gen.n#测试集样本总个数total_val = val_data_gen.n# 训练数据类别标签class_indices = train_data_gen.class_indices# 自定义类别标签名称inverse_dict = dict((val, key) for key, val in class_indices.items())#标签写入文件json_str = json.dumps(inverse_dict, indent=4)with open('class_indices.json', 'w') as json_file:json_file.write(json_str)print("using {} images for training, {} images for validation.".format(total_train,total_val))#创建模型model = our_model.get_model()#打印模型结构model.summary()# 损失函数:交叉熵loss_object = tf.keras.losses.CategoricalCrossentropy(from_logits=False)#优化器optimizer = tf.keras.optimizers.SGD(learning_rate=lr,momentum=0.9)#整体损失采用均值损失train_loss = tf.keras.metrics.Mean(name='train_loss')#训练集精度计算train_accuracy = tf.keras.metrics.CategoricalAccuracy(name='train_accuracy')#验证集损失val_loss = tf.keras.metrics.Mean(name='val_loss')#验证集精度计算val_accuracy = tf.keras.metrics.CategoricalAccuracy(name='val_accuracy')@tf.functiondef train_step(images, labels):with tf.GradientTape() as tape:#获得模型输出output = model(images, training=True)#计算损失loss = loss_object(labels,output)#计算梯度(求导)gradients = tape.gradient(loss, model.trainable_variables)#应用梯度(反向传播)optimizer.apply_gradients(zip(gradients, model.trainable_variables))# 对一个batch_size的loss求均值train_loss(loss)# 对一个batch_size的预测求准确率train_accuracy(labels, output)@tf.functiondef val_step(images, labels):output = model(images, training=False)loss = loss_object(labels, output)val_loss(loss)val_accuracy(labels, output)best_val_acc = 0.trainloss=[]trainaccuracy = []valloss=[]valaccuracy = []for epoch in range(epochs):train_loss.reset_states()  # clear history infotrain_accuracy.reset_states()  # clear history infoval_loss.reset_states()  # clear history infoval_accuracy.reset_states()  # clear history info# 训练一个epoch的迭代次数count = range(total_train // batch_size)train_bar = tqdm(count)for step in train_bar:# 每个step从训练集中取出一个打包好的数据images, labels = next(train_data_gen)train_step(images, labels)# print train processtrain_bar.desc = "train epoch[{}/{}] loss:{:.3f}, acc:{:.3f}".format(epoch + 1,epochs,train_loss.result(),train_accuracy.result())# 训练完成,进行验证val_bar = tqdm(range(total_val // batch_size))for step in val_bar:test_images, test_labels = next(val_data_gen)val_step(test_images, test_labels)# print val processval_bar.desc = "valid epoch[{}/{}] loss:{:.3f}, acc:{:.3f}".format(epoch + 1,epochs,val_loss.result(),val_accuracy.result())#一个epoch之后,记录loss和acctrainloss.append(train_loss.result().numpy())trainaccuracy.append(train_accuracy.result().numpy())valloss.append(val_loss.result().numpy())valaccuracy.append(val_accuracy.result().numpy())# 仅仅保存最优的权重if val_accuracy.result() > best_val_acc:best_val_acc = val_accuracy.result()model.save_weights(weight_path+"\epoch{}-acc{:.3f}-loss{:.3f}_newModel.ckpt".format(epoch,val_accuracy.result(),val_loss.result()),save_format='tf')print("trainloss:{}".format(trainloss))print("trainaccuracy:{}".format(trainaccuracy))print("valloss:{}".format(valloss))print("valaccuracy:{}".format(valaccuracy))
if __name__ == '__main__':main()

2.15 全部代码(test.py)

import glob
from time import timeimport numpy as np
import os
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, auc
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tqdm import tqdm
import tensorflow as tf
from train_models.our_model import get_model
from tool import genConfusionMatrix
from tool import roc_auc#加载测试集
rootpath=r"G:\dataset\TB_Database22\test"
assert os.path.exists(rootpath), "cannot find {}".format(rootpath)
tf.compat.v1.enable_eager_execution(config=None,device_policy=None,execution_mode=None
)im_height = 224
im_width = 224
batch_size = 2#创建模型
model =get_model()
weights_path = r'./weights/epoch0-acc0.500-loss0.717_newModel.ckpt'
assert len(glob.glob(weights_path + "*")), "cannot find {}".format(weights_path)#加载权重
model.load_weights(weights_path)#测试集数据归一化
test_image_generator = ImageDataGenerator(rescale=1./255)#创建数据集生成器,打包测试集数据
test_data_gen = test_image_generator.flow_from_directory(directory=rootpath,target_size=(im_height,im_width),batch_size=batch_size,class_mode='sparse',shuffle=False)
#获取所有的测试集样本数
total_test = test_data_gen.n#测试过程验证集进度条
val_bar = tqdm(range(total_test // batch_size))#预测类别
result = np.array([],dtype=int)
#真实类别
label = np.array([],dtype=int)times = 0.0for step in val_bar:#加载测试数据test_images, test_labels = next(test_data_gen)start = time()#将一个batch数据送入网络,获得输出data_numpy = model(test_images, training=False)#记录测试的时间times+=(time()-start)#转化成numpy格式data_numpy = data_numpy.numpy()#获取预测结果result = np.append(result,data_numpy.argmax(axis=1))#获得真实标签label = np.append(label,test_labels)end = time()print("耗费时间:",times/total_test)
#计算所需要的指标
label = label.astype(np.int8)
matrix = genConfusionMatrix(2,result,label)
matrix_se = matrix[1][1]/(matrix[1][0]+matrix[1][1])
matrix_sp = matrix[0][0]/(matrix[0][1]+matrix[0][0])
matrix_acc = (matrix[0][0]+matrix[1][1])/np.sum(matrix)
matrix_auc = roc_auc(label,result)
matrix_pre = matrix[1][1]/(matrix[0][1]+matrix[1][1])
matrix_youden = matrix_se+matrix_sp-1
print("混淆矩阵:")
print(matrix)
print("matrix_se",matrix_se)
print("matrix_sp",matrix_sp)
print("matrix_auc",matrix_auc)
print("matrix_acc",matrix_acc)
print("matric_pre",matrix_pre)
print("约登指数",matrix_youden)
print("weights_path:", weights_path)

第二部分(迁移学习)

第一部分是我们自定义的模型结构并实现了训练过程,这个部分我们使用tensorflow.keras自带的模型结构和预训练好的权重来实现迁移学习(transfer learning)。在预训练权重之上继续训练模型,既节省了训练时间又可以达到不错的准确率。

使用MobileNetV2实现迁移学习

此时,主要修改our_mode.py文件, 新增MobileNetV2模型结构,而train.py, test.py只需要修改模型调用的代码。在our_model.py新增如下代码:
修改的原理:去掉MobileNetV2的全连接分类部分,换成我们自定义的分类部分(根据分类任务确定),这样修改后的网络结构仍然可以使用官网的权重,实现迁移学习。

def get_MobileNetV2():feature = MobileNetV2(input_shape=(224,224,3),include_top=False,weights='imagenet')#冻结feature层不训练,只训练除feature层之外的层。feature.trainable=Falsemodel = Sequential([feature,layers.GlobalAveragePooling2D(),layers.Dense(1000, activation='relu'),layers.Dense(1000, activation='relu'),layers.Dense(2,activation='relu')layers.Softmax()],name='MobileNetV2')return model

导包代码:

from tensorflow.keras.applications import MobileNetV2,NASNetMobile,InceptionV3,ResNet50

在train.py,test.py中改变模型的调用:

    #创建模型model = get_MobileNetV2()

至此,迁移学习对于代码修改的部分已经完毕,执行train.py开始训练。

说明

tensorflow.keras提供了很多官方网路结构,通过语句from tensorflow.keras.applications import 模型名称 可以直接使用,初次调用模型时会自动联网下载好权重,再次调用模型时则不需要联网。在此,我将自己的our_model.py放在文末,需要的小伙伴可以直接拿去用哦。

from tensorflow.keras import layers,Model,Sequential
from tensorflow.keras.applications import MobileNetV2,NASNetMobile,InceptionV3,ResNet50,VGG16,ResNet101,DenseNet121def get_model():#输入层input_image = layers.Input(shape=(128, 128, 3), dtype="float32")#卷积层(输出通道数,卷积核大小,卷积步长)x = layers.Conv2D(filters=16, kernel_size=3, strides=2,use_bias=False)(input_image)#归一化层x = layers.BatchNormalization(momentum=0.9, epsilon=1e-5)(x)#激活函数x = layers.ReLU()(x)x = layers.Conv2D(32, kernel_size=3, strides=2,use_bias=False)(x)x = layers.BatchNormalization(momentum=0.9, epsilon=1e-5)(x)x = layers.ReLU()(x)x = layers.Conv2D(64, kernel_size=3, strides=2,use_bias=False)(x)x = layers.BatchNormalization(momentum=0.9, epsilon=1e-5)(x)x = layers.ReLU()(x)x = layers.Conv2D(128, kernel_size=3, strides=2,use_bias=False)(x)x = layers.BatchNormalization(momentum=0.9, epsilon=1e-5)(x)x = layers.ReLU()(x)x = layers.Conv2D(256, kernel_size=3, strides=2,use_bias=False)(x)x = layers.BatchNormalization(momentum=0.9, epsilon=1e-5)(x)x = layers.ReLU()(x)x = layers.Conv2D(256, kernel_size=3, strides=2,use_bias=False)(x)x = layers.BatchNormalization(momentum=0.9, epsilon=1e-5)(x)x = layers.ReLU()(x)x = layers.GlobalAvgPool2D(name="avgPool")(x)  # 1*1*128 特征降维# DropOut层(失活比例)x = layers.Dropout(rate=0.5)(x)#全连接层(全连接层个数,激活函数)x= layers.Dense(units=100,activation="relu")(x)x= layers.Dropout(rate=0.5)(x)x = layers.Dense(2, name="logits")(x)#softmax层,保证输出的结果是[0,1]的概率值predict = layers.Softmax()(x)#构建模型model = Model(inputs=input_image, outputs=predict,name='tb_model')return modeldef get_MobileNetV2():feature = MobileNetV2(input_shape=(224,224,3),include_top=False,weights='imagenet')feature.trainable=Falsemodel = Sequential([feature,layers.GlobalAveragePooling2D(),layers.Dense(1000,activation='relu'),layers.Dense(1000, activation='relu'),layers.Dense(2),layers.Softmax()],name='MobileNetV2')return modeldef get_NASNetMobile():feature = NASNetMobile(input_shape=(224,224,3),include_top=False,weights='imagenet')model = Sequential([feature,layers.GlobalAveragePooling2D(),layers.Dense(1000, activation='relu'),layers.Dense(1000, activation='relu'),layers.Dense(2),layers.Softmax()],name='NASNetMobile')return modeldef get_InceptionV3():feature = InceptionV3(input_shape=(299,299,3),include_top=False,weights='imagenet')model = Sequential([feature,layers.GlobalAveragePooling2D(),layers.Dense(1000, activation='relu'),layers.Dense(1000, activation='relu'),layers.Dense(2),layers.Softmax()],name='NASNetMobile')return modeldef get_ResNet50():feature = ResNet50(input_shape=(224, 224, 3), include_top=False, weights='imagenet')feature.trainable=Falsemodel = Sequential([feature,layers.GlobalAveragePooling2D(),layers.Dense(1000, activation='relu'),layers.Dense(1000, activation='relu'),layers.Dense(2),layers.Softmax()],name='ResNet50')return modeldef get_vgg16():feature = VGG16(input_shape=(224,224,3),include_top=False, weights='imagenet')feature.trainable=Falsemodel = Sequential([feature,layers.Flatten(),layers.Dense(1000, activation='relu'),layers.Dense(1000, activation='relu'),layers.Dense(2, activation='softmax')],name='Vgg16')return modeldef get_ResNet101():feature = ResNet101(input_shape=(224, 224, 3), include_top=False, weights='imagenet')feature.trainable=Falsemodel = Sequential([feature,layers.GlobalAveragePooling2D(),layers.Dense(1000, activation='relu'),layers.Dense(1000, activation='relu'),layers.Dense(2),layers.Softmax()],name='ResNet101')return modeldef get_DenseNet121():feature = DenseNet121(input_shape=(224, 224, 3), include_top=False, weights='imagenet')feature.trainable=Falsemodel = Sequential([feature,layers.GlobalAveragePooling2D(),layers.Dense(1000, activation='relu'),layers.Dense(1000, activation='relu'),layers.Dense(2),layers.Softmax()],name='ResNet101')return model

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/48861.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于卷积神经网络的图像识别技术从入门到深爱(理论思想与代码实践齐飞)

基于卷积神经网络的图像识别技术从入门到深爱(理论与代码实践齐飞!) 零、前言一、手写数字识别入门神经网络(入门篇)1. 手写数字数据集及神经网络数据概念介绍1.1 手写数字数据集1.2 神经网络数据集1.3 基于tensorflow…

卷积神经网络实现人脸识别微笑检测

一:卷积神经网络介绍: 1. 定义: 卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习&a…

【053】ImageDataGenerator() 介绍

内容目录 一、ImageDataGenerator() 介绍二、数据增强处理和类的构造函数参数1、数据增强处理(data augmentation)2、ImageDataGenerator类的构造函数参数三、一般的对图像的处理流程四、ImageDataGenerator的所有方法介绍1、fit方法2、flow方法3、flow_…

2020中国华录杯·数据湖算法大赛—定向算法赛(吸烟打电话检测)baseline-tensorflow2.3-python3.6

文章目录 1.赛事背景1.主办方2.赛事介绍 2.baseline2.1 文件夹结构2.2 demo1. 01_train_test_split.py2. 02_tf2_mobilev2_classes.py3. 03_predict.py 3.问题及改进4.修改记录 1.赛事背景 1.主办方 赛事链接训练集测试集验证集 2.赛事介绍 1. 【赛题描述】行为规范&#xf…

卷积神经网络实现表情识别

卷积神经网络实现表情识别 CNN人脸表情识别图片预处理原本效果处理后效果 图片数据集效果 CNN人脸识别创建模型归一化与数据增强创建网络 摄像头人脸识别图片识别 参考 CNN人脸表情识别 图片预处理 import dlib # 人脸识别的库dlib import numpy as np # 数据处理的库numpy…

Tensorflow 2.5 model.evaluate报错Invalid argument: required broadcastable shapes at loc(unknown)

Tensorflow 2.5使用model.evaluate进行模型评估时报错Invalid argument: required broadcastable shapes at loc unknown 1.软件环境⚙️2.问题描述🔍3.解决方法🐡4.结果预览🤔 ⚡插播一条老家自产的糖心苹果,多个品种&#xff0c…

推荐收藏!3.5万字图解 Pandas!

↓推荐关注↓ 大家好,在 Python 各个工具包中,最频繁使用的应该就是 Pandas 了。今天我以图解的方式给大家介绍 Pandas 中各种常用的操作,内容有点长,喜欢记得点赞、收藏、关注。 第一部分:Pandas 展示 请看下表: 它描…

ONLYOFFICE 文档 7.4 版本现已发布:新增绘图、雷达图、合并文档、另存为图片等功能

您现在可以使用我们最新版本的在线编辑器了,更新的功能包括:绘图、雷达图、合并文档、将某个对象或者整个文档/工作表保存为图片、更强大的编辑区域保护等等。继续阅读本文了解所有的更新。 在编辑器中绘图 尽情发挥创造力,使用画笔或荧光笔…

四十不惑-重头再来

四十不惑-重头再来 重装系统系统版本 卸载老毛桃自动安装的软件安装必备软件安装Docker DeskTop安装Docker Desktop后重启系统运行Power Shell切换环境重新运行PS DockerDesktop导入镜像启动DockeDesktop启动PS 新建容器搭建ChatGPT(pengzhile_pandora_latest_43f234c4e8a8)搭建…

大学生必备神器

大学生要掌握的办公软件因专业和工作需求而异,但是以下是一些普遍适用于大学生的办公软件,可以帮助提高学习和工作效率,今天就给大家推荐几款大学生常用的软件。 1.OneDrive 这是微软出品的云存储产品,与百度网盘有些类似&#…

北极九章CEO刘沂鑫:从自然语言一步直达数据洞察——数据驱动增长的新范式|量子位·视点分享回顾...

视点 发自 凹非寺量子位 | 公众号 QbitAI 今天,尽管人人都在谈论大数据,但数据实际价值和现有价值有巨大落差。 尽管企业采集和储存、计算数据的能力越来越强,但数据分析能力始终增长缓慢。据Forrester调研,约70%的企业数据从未被…

老胡的周刊(第089期)

老胡的信息周刊[1],记录这周我看到的有价值的信息,主要针对计算机领域,内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 🎯 项目 MOSS[2] 来自复旦大学的开源工具增强型会话语…

从网站流量指标开始,CSDN 如何洞察运营效果异动?丨评测来了

最近,CSDN组织了一次《人人都能简单上手的指标平台》开箱测评活动,邀请了三位嘉宾,分别是 Kyligence 联合创始人兼 CTO 李扬、CSDN 战略合作总监闫辉、CSDN 开发云 CTO 冯丙见。三位嘉宾根据真实的需求场景,详细评估了指标平台的最…

跟我看 Microsoft Build 2023

又是一年一度的 Microsoft Build 了,你有和我一样熬夜看了吗?如果没有,那么你就错过了一场精彩的技术盛宴。本次的 Microsoft Build ,有非常多的干货,围绕打造 Copilot 应用展开。我会将基于 Data AI 比较重要的内容列…

ChatGPT简介|人机交互的新时代|小智ai

ChatGPT丨小智ai丨chatgpt丨人工智能丨OpenAI丨聊天机器人丨AI语音助手丨GPT-3.5丨开源AI平台 导语:随着人工智能的迅猛发展,ChatGPT(Chat Generative Pre-trained Transformer)作为一种基于深度学习的自然语言处理模型&#xff0…

从春节后央行的首批罚单,看金融反欺诈反洗钱的复杂性

目录 个人信息保护的问题 征信管理的问题 反洗钱与反欺诈的问题 金融欺诈愈加复杂多变 金融机构如何增强反欺诈反洗钱 春节后,央行公示首批罚单。其中,厦门银行被中国人民银行福州中心支行给予警告,并没收违法所得767.17元,处…

2020微信对话截图生成器,各种截图一键制作!

前言 上次有朋友说想要个微商作图神器,找了几款觉得功能一般般,就没有发出来,今天又有朋友私信了,对比了这几款,选择中一款不错的给大家分享一下,软件是安卓版的,打开就是VIP,无需去登陆了,直接使用即可!嗯!拉下去看下详情介绍叭! // 软件…

呼唤正义的 AssangeDAO 众筹,会是一个骗局吗?

Jan. 2022, Sabrinafootprint.network Data Source: Footprint Analytics 目前 AssangeDAO 是JuiceBox 历史上最大的 DAO,超过了 ConstitutionDAO 的筹集。 AssangeDAO是在2021年12月10日由一群赛博朋克发起的。它累计募集了17,442.49 ETH ,所有资金都…

中国互联网众筹行业

近些年,中国互联网发展迅速,众筹这种起源于美国的新型互联网金融模式更是一直处于风口浪尖。在“大众创业、万众创新”的背景下,这种低门槛的融资模式也深受欢迎,加上阿里、京东、苏宁三大电商的巨头的相继入场,更令这…

海外众筹 | Kickstarter热门众筹项目汇总

筹集资金:$837,890(仍在筹集中) Backer数量:3,194 VELO推出了世界上第一款可在3种尺寸之间轻松切换的硬边可扩展行李箱,它可以转换为16英寸小型随身携带;22英寸中型托运行李;26英寸…