Coding01

Coding 点滴

0%

本文学习使用 zh_segmentation:基于 Chinese Treebank 6.0 构建的中文分词模型。

安装插件

本模型需要安装 2.4.0b0 或更高版本的 tensorflow_text

1
pip install "tensorflow_text>=2.4.0b0"

分词

对字符串:「新华社北京」分词:

1
2
3
4
5
6
7
8
9
10
import tensorflow_text as text
import tensorflow as tf

# 设定模型的 UR
MODEL_HANDLE = "https://hub.tensorflow.google.cn/google/zh_segmentation/1"
segmenter = text.HubModuleTokenizer(MODEL_HANDLE)

# 分割[新华社北京]。
input_text = ["新华社北京"]
tokens, starts, ends = segmenter.tokenize_with_offsets(input_text)

打印 tokens 看看:

1
print(tokens.to_list())

需要对数组内容进行解析,输出数组:

1
2
3
4
5
first = tokens.to_list()[0][0]
second = tokens.to_list()[0][1]

print(first.decode('utf-8'))
print(second.decode('utf-8'))
Read more »

本文根据 Tensorflow 官网和公众号文章 学习 tensorflow-recommenders。

下载 tensorflow-recommenders

在环境里下载 tensorflow-recommenders

1
2
pip install -q tensorflow-recommenders
pip install -q --upgrade tensorflow-datasets

引入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import os
import pprint
import tempfile

from typing import Dict, Text

import numpy as np
import tensorflow as tf
import tensorflow_datasets as tfds
import tensorflow_recommenders as tfrs
import ssl

os.environ['HTTP_PROXY'] = 'http://0.0.0.0:8888'
os.environ['HTTPS_PROXY'] = 'http://0.0.0.0:8888'
ssl._create_default_https_context = ssl._create_unverified_context

载入数据集

由于MovieLens数据集没有预定义的拆分,因此所有数据都处于train拆分中。

1
2
3
4
# Ratings data.
ratings = tfds.load('movielens/100k-ratings', split="train", data_dir = os.path.join(os.getcwd(), "data"))
# Features of all the available movies.
movies = tfds.load('movielens/100k-movies', split="train", data_dir = os.path.join(os.getcwd(), "data"))
Read more »

引入 Python:

Swift For TensorFlow supports Python interoperability.

You can import Python modules from Swift, call Python functions, and convert values between Swift and Python.

1
2
import PythonKit
print(Python.version)

MNIST 数据集识别

本文主要学习如何利用 S4TF 训练和识别 MNIST。

读取数据集

在 Swift 版本里:

先引入组件:

1
2
3
4
5
6
7
import TensorFlow
import PythonKit
import Foundation

let os = Python.import("os")
let np = Python.import("numpy")
let metrics = Python.import("sklearn.metrics")

在之前的文章使用 MNIST 集入门 Tensoflow 中 Python 版本读数据集:

1
2
3
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data(
path = os.path.join(os.getcwd(), "data/mnist.npz")
)

在 Swift 版本调入数据集:

1
2
3
4
5
if !Bool(os.path.exists("mnist.npz"))! {
os.popen("wget https://s3.amazonaws.com/img-datasets/mnist.npz").read()
}

let mnist = np.load("mnist.npz")
Read more »

CIFAR-10 图像识别

本文主要学习获取 CIFAR-10 数据集,通过简单的模型对数据集进行训练和识别。

下载数据集

和之前一样,使用 http_proxy 代理:

1
2
3
4
5
6
7
8
9
10
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.keras import layers, models
import tensorflow_datasets as tfds
import os
import ssl

os.environ['HTTP_PROXY'] = 'http://0.0.0.0:8888'
os.environ['HTTPS_PROXY'] = 'http://0.0.0.0:8888'
ssl._create_default_https_context = ssl._create_unverified_context

下载 CIFAR-10 数据集

1
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()

返回值

Tuple of Numpy arrays: (x_train, y_train), (x_test, y_test).
x_train, x_test: uint8 arrays of RGB image data with shape (num_samples, 3, 32, 32) if tf.keras.backend.image_data_format() is ‘channels_first’, or (num_samples, 32, 32, 3) if the data format is ‘channels_last’.

y_train, y_test: uint8 arrays of category labels (integers in range 0-9) each with shape (num_samples, 1).

数据集中包含 50000 张 32*32 的彩色图片和这些图相对应的类别标签的训练集,10000 张测试图像。

其中,x_train 是训练集图片,y_train 是对应的标签,x_test 是测试集图片,y_test 是测试集对应的标签。

Read more »

本文主要记录如何在 VSCode 关联 Laradock 容器,配置和使用容器的 PHP 环境和一些插件,如:phpcs

由于 VSCode 已经继承了很多工具,不用我们怎么设置,就可以达到我们的目标。

从容器中打开代码

首先必须保证我们已经启动我们的容器了:

然后启动 VSCode,使用命令 F1,选择 Remote Explorer: Focus on Containers View

选择我们的 workspace 容器:

这时候会重新打开新的页面让你选择代码所在的路径,OK 后即可打开代码,和从本地路径选择效果一样:

Read more »

开篇

最近学习 Swift 开发 WidgetKit,再加上学习 TensorFlow,也就有了两者的结合。

learn-swift-hero

Swift for TensorFlow 是深度学习和可微分计算的新一代系统。,开源代码:tensorflow/swift

运行原理

S4TF 安装

首先下载 swift 对应的版本:

Install Swift for TensorFlow

安装完之后,在 ~/.zshrc 加入 bin 路径:

1
$ export PATH=/Library/Developer/Toolchains/swift-latest/usr/bin:"${PATH}"

验证

写一个 test.swift:

1
2
3
4
import TensorFlow

var x = Tensor<Float>([[1, 2], [3, 4]])
print(x + x)

在命令行执行运行看看输出结果:

每日步数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
class StepsInteractor {
let healthStore = HKHealthStore()
let stepCountType = HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.stepCount)!
// Access Step Count
let healthKitTypes: Set = [ HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.stepCount)! ]

func retrieveStepsWithAuth(completion: @escaping (Double) -> Void) {
// Check for Authorization
if (healthStore.authorizationStatus(for: stepCountType) != HKAuthorizationStatus.sharingAuthorized) {
healthStore.requestAuthorization(toShare: healthKitTypes, read: healthKitTypes) { (success, error) in
if (success) {
// Authorization Successful
self.getSteps { (result) in
completion(result)
}
} else {
completion(-1)
}
}
} else {
self.getSteps { (result) in
completion(result)
}
}
}

func getSteps(completion: @escaping (Double) -> Void) {
let stepsQuantityType = HKQuantityType.quantityType(forIdentifier: .stepCount)!

let now = Date()
let startOfDay = now - 2.days
var interval = DateComponents()
interval.day = 1

let query = HKStatisticsCollectionQuery(
quantityType: stepsQuantityType,
quantitySamplePredicate: nil,
options: [.cumulativeSum],
anchorDate: startOfDay,
intervalComponents: interval)

query.initialResultsHandler = { _, result, error in
var resultCount = 0.0
result!.enumerateStatistics(from: startOfDay, to: now) { statistics, _ in
if let sum = statistics.sumQuantity() {
// Get steps (they are of double type)
resultCount = sum.doubleValue(for: HKUnit.count())
} // end if
// Return
completion(resultCount)
}
}

query.statisticsUpdateHandler = {
query, statistics, statisticsCollection, error in
// If new statistics are available
if let sum = statistics?.sumQuantity() {
let resultCount = sum.doubleValue(for: HKUnit.count())
// Return
completion(resultCount)
} // end if
}

healthStore.execute(query)
}
}
Read more »

本文主要学习到:

  1. App Group 数据共享知识
  2. Widget 获取 Location 权限

为了达到如上图的位置信息,需要做到两点:

  1. 在主 App 上使用 Location;
  2. 在 Widget 小组件上使用 Location。

关于第一点,可以直接在 APP 的 Info.plist 增加:

1
2
<key>NSLocationWhenInUseUsageDescription</key>
<string>Use Location</string>

在 Widget target 的 Info.plist 增加:

1
2
<key>NSWidgetWantsLocation</key>
<true/>

Read more »

对标 Widget

主要对标天气的 Widget 如下图所示:

7561606730867_.pic

参考内容主要有:

  1. 所在位置:裕华区
  2. 当前温度:1 摄氏度,实况温度,默认单位:摄氏度
  3. 实况风向和实况风力等级:东北风 1 级,
  4. 实况相对湿度,百分比数值
  5. 实况天气状况的文字描述,包括阴晴雨雪等天气状态的描述
  6. 实况观测时间
  7. 实时空气质量指数和实时空气质量指数级别
  8. 未来三天的天气预报

整个 widget 主要分成左右结构,左边结构采用上中下三层布局,右边结构采用列表形式展示未来几天天气预报内容。

天气 API

本文结合国内外一些好的天气接口提供商,最后选择使用和风天气开发平台

主要是其提供的「开发者方案」完全符合我们这种目前处于自学和少用户量的开发者,特别的友好,并且对于「认证个人开发者」提供的 API 日访问量 (16700 次/天) 足够使用了,而且如果是集成官方 SDK,访问量是无限制的。

注:本文是开发 Widget,和风天气提供的 iOS SDK 是基于 OC 的,个人想还是纯 Swift 开发,且不想 APP 包过大,所以本文当前采用 API 接口形式。

Read more »