unet是残差网络吗_基于UNet神经网络的城市人流预测

[原创]

1 利用手机信令数据计算人口流动数据

手机信令数据是研究人口的整体流动情况的重要数据来源。移动运营商在为手机用户提供实时通讯服务时,积累了大量的基站与设备的服务配对数据。根据配对和唤醒发生的时间以及基站的地理位置,可以很自然划定一定时间和空间范围,统计每一个时间范围内在特定空间区域内手机设备的停留,进入和离开数据,并据此估算相应的人流数据。

传统的人口网格分析过程一般只关注单个网格内某个时间点人口流动的截面数据以及城市当中不同区域的人口分布统计情况;没有将时间和空间融合考虑,不能对城市整体的人口流动形成一个完整连续的直观描述。但是,作为城市安全运营管理者和规划人员职责是需要把握好城市人口流动规律,建立有效的时空数据分析模型,从而为城市安全运行管理做好相应的人口短时预测与应急管理服务。

2 人口流动数据网格图像流处理

2.1 流处理思路

原始手机信令数据,按照一定的时间间隔(例如15分钟),划分出每个时间段的信令数据情况。主要包括:时间,格网ID,格网中心点经度,格网中心点维度,时间段内格网的停留人数,进入人数,离开人数。

根据原始数据的时空关系,将原始数据转化为4维向量空间矩阵,维度分别为时间维度、空间维度横坐标,空间维度纵坐标以及停留,进入或离开的类别:Matrix[t,i,j,k]=p意味着在t时刻,第i行第j列的空间栅格位置,k=0时则停留人数为p,k=1时则进入人数为p,k=2时则离开人数为p。

在这样的转换关系下,可以将源数据处理为3通道的时空数据。考虑到单个人员流动的时空连续性,可以认为表示人口流通的整体统计量的时空矩阵也具备一定局部关联性,换而言之,一个栅格点的人口流动数据会与该栅格附近的人口流行数据相互关联,也会与前后时间段该栅格的人口流动数据相互关联。而具体的关联形式和影响强度,则需要我们利用卷积神经,对历史数据进行学习来发现和记录相应的关联关系。

更进一步地,通过数据洞察注意到,不同栅格网络间人口流动的时间变化曲线往往倾向于若干种固定模式,直观上,商业区,住宅区,办公区域会呈现出不同的人流曲线变化模式。这种模式与地理位置,用地规划,交通路网信息等属性息息相关。本模型后续将进一步讨论不同用地类型的栅格人口流动模式的比较分析。

TIME

TAZID

STAY

ENTER

EXIT

2017-04-05 00:00:00

1009897

460

460

52

2.2 人口栅格数据矢量化

基于一定的空间距离间隔(例如250m),将分析的目标空间划分为若干网格(141*137)。统计T时间内,属于网格M_(p,q)的手机设备停留、进入和离开的数据。按照业务需求,将手机设备数扩样为人口数量,将停留、进入和离开的数据标准化到(0,255)的空间,并将标准化后的数据作为图像的3个颜色通道,据此将T时间的整体网格数据转化为一张三通道格式的图片数据。按照时间维度将经过上述处理的图像作为视频的每一帧图像。

import pandas as pd

import numpy as np

import h5py

# 数据转换成张量类型

data_enter_exit_sz = pd.read_csv('data/sz/data/TBL_ENTER_EXIT_SZ20170401-20170431.csv')

time_list = data_enter_exit_sz['TIME'].unique()

N = len(time_list)

string_to_ix = {string:i for i,string in enumerate(time_list)}

tensor_data = np.zeros([N,141,137,3])

for _,line in data_enter_exit_sz.iterrows():

if int(line['TAZID']) <= 1000000:

continue

x,y = divmod(int(line['TAZID'])-1000000,144)

x = x - 2

y = y - 2

t = string_to_ix[line['TIME']]

tensor_data[t][x][y][0] = line['STAY']

tensor_data[t][x][y][1] = line['ENTER']

tensor_data[t][x][y][2] = line['EXIT']

# 数据保存成h5类型

h5 = h5py.File('model_data/tensor_data_sz.h5','w')

h5.create_dataset('dataset_1', data = tensor_data)

h5.close()

# 数据准备:区分X和Y

h5 = h5py.File('model_data/tensor_data_sz.h5','r')

tensor_data = h5['dataset_1'][:]

h5.close()

M = len(tensor_data)

X = []

Y = []

for i in range(M - 8):

X.append(tensor_data[i:i+8]) # 延迟预测前8个时段预测下1时段

Y.append([tensor_data[i+8][20:120,20:116]]) # 取部分城区

X = np.array(X)

Y = np.array(Y)

# print(X.shape) # (2104, 8, 141, 137, 3)

# print(Y.shape) # (2104, 1, 100, 96, 3)

h5 = h5py.File('./drive/model_data/model_data_sz.h5','w')

h5.create_dataset('date_sz', data=X)

h5.create_dataset('data_sz', data=Y)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抱歉,作为AI语言模型,我不能编写代码。但是,我可以为您提供一些关于使用残差网络编写Unet网络的信息。 Unet网络是一种用于图像分割的卷积神经网络,它通常包含一个编码器和一个解码器。编码器将原始图像通过卷积和池化操作降采样为一个较小的特征图,而解码器则通过上采样和卷积操作将特征图恢复为原始图像大小,并输出像素级别的分类结果。 使用残差网络可以提高Unet网络的性能。残差网络是一种深度神经网络结构,它通过跨层连接来解决梯度消失问题,并使得网络更加容易训练。在Unet网络中,可以使用残差块来代替常规的卷积层,以增加网络的深度和性能。 下面是一个示例代码,其中使用了残差块来编写Unet网络: ``` import tensorflow as tf def residual_block(x, filters): shortcut = x x = tf.keras.layers.Conv2D(filters, 3, padding='same', activation='relu')(x) x = tf.keras.layers.BatchNormalization()(x) x = tf.keras.layers.Conv2D(filters, 3, padding='same', activation='relu')(x) x = tf.keras.layers.BatchNormalization()(x) x = tf.keras.layers.Add()([x, shortcut]) x = tf.keras.layers.Activation('relu')(x) return x def encoder_block(x, filters): x = tf.keras.layers.Conv2D(filters, 3, padding='same', activation='relu')(x) x = tf.keras.layers.BatchNormalization()(x) x = residual_block(x, filters) pool = tf.keras.layers.MaxPooling2D()(x) return pool, x def decoder_block(x, skip, filters): x = tf.keras.layers.Conv2DTranspose(filters, 2, strides=2, padding='same')(x) x = tf.keras.layers.concatenate([skip, x]) x = tf.keras.layers.Conv2D(filters, 3, padding='same', activation='relu')(x) x = tf.keras.layers.BatchNormalization()(x) x = residual_block(x, filters) return x def build_unet(input_shape): inputs = tf.keras.layers.Input(shape=input_shape) # Encoder e1, skip1 = encoder_block(inputs, 64) e2, skip2 = encoder_block(e1, 128) e3, skip3 = encoder_block(e2, 256) e4, skip4 = encoder_block(e3, 512) # Bridge b1 = residual_block(e4, 1024) # Decoder d1 = decoder_block(b1, skip4, 512) d2 = decoder_block(d1, skip3, 256) d3 = decoder_block(d2, skip2, 128) d4 = decoder_block(d3, skip1, 64) outputs = tf.keras.layers.Conv2D(1, 1, activation='sigmoid')(d4) model = tf.keras.models.Model(inputs=inputs, outputs=outputs) return model ``` 在这个Unet网络中,残差块被用来代替常规的卷积层,以增加网络的深度。编码器和解码器都是由多个残差块组成。使用残差网络可以显著提高Unet网络的性能,特别是在处理大型图像时。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值