机器学习中的模型生成与实现详解
立即解锁
发布时间: 2025-08-30 00:33:56 阅读量: 11 订阅数: 13 AIGC 

### 机器学习中的模型生成与实现详解
#### 1. 马尔可夫链与单词生成
马尔可夫链在单词生成方面有独特的应用。当面临多种选择时,它就像掷骰子一样随机选择路径。例如,如果运行某个图,我们期望“he”和“hi”出现的数量大致相等。通过为输入集中的每个字符计算转移及其概率,最终会得到一个完整的马尔可夫链图。
沿着这个图,我们可以生成如“he”“hi”“here”“the”“there”等单词。若对图进行微小改动,比如去除空格作为有效节点,还能得到“hit”“hither”等单词;再添加一些额外的语料单词,像连接“i”节点和“r”节点,就能生成“their”。可见,即使是一个小例子,通过遍历图也能快速生成大量单词,并且给予更多输入,能得到更出色的结果。
不过,马尔可夫链虽然简单令人印象深刻,但它缺乏上下文理解能力。这意味着它在生成单词时,既可以生成有效的单词,也可能生成像“ererererere”或“ther”这样无意义的组合。它只知道从一个状态转移到另一个状态的概率,所以不能盲目依赖马尔可夫链。
#### 2. 生成对抗网络(GANs)
生成对抗网络(GANs)是神经网络工具包中最新且可能最酷的工具之一。它在生成内容方面取得了巨大成功,当需要神经网络生成东西时,它是当前的首选方法。
“对抗”在这里指的是生成的内容会由一个评估器(也称为判别器)与已知的正确内容进行比较。生成器会不断努力生成评估器无法区分的内容。生成器和判别器都是GAN的组成部分,本质上,GAN是在与自身竞争,不断创建更好的模型来试图欺骗自己。
GAN在生成逼真的人类图像、音频和视频方面非常成功,但也引发了对其被恶意使用的担忧。我们不应将GAN用于不良目的。
生成器的工作方式与CNN自动编码器类似,通常以CNN为基本构建块。它会捕捉训练内容中的潜在变量,然后根据这些变量生成相似的新内容。在接收到观测数据后,生成器开始从训练数据中提取特征,最终创建一个巨大的多维潜在变量或特征空间。当需要创建内容时,生成器会结合输入,在这个潜在空间中提取特征并生成新内容。若训练不佳,生成的特征会导致奇怪、嘈杂且无用的数据;而训练得当,就能生成与原始内容难以区分的新内容。
判别器也会学习训练数据中的潜在空间,但与生成器不同的是,它将这些信息用于分类。对于输入的所有内容,判别器会进行两种分类:真实的或生成的。根据具体需求,可以复用生成器的部分组件作为判别器的基础。
在训练过程中,生成器和判别器会相互竞争。生成器生成新内容并提供真实的训练内容,判别器对它们进行分类。判别器会根据正确标记的输入提高分类能力,生成器则根据判别结果改进生成效果。一个训练完美的GAN,判别器将无法区分真实和生成的内容,对它们给予相同的权重,但实际上并不一定需要达到完美状态。
在我们的GAN中,生成组件使用密集层和卷积层的组合,评估器使用卷积层、池化层和密集层,每个组件大约有六层。不过,这个GAN仅适用于MNIST图像的有限尺寸和颜色空间,对于更大的数据领域,需要更大型和复杂的GAN。
#### 3. CoreML 3的新特性
在2019年的全球开发者大会(WWDC)上推出的CoreML 3中,苹果引入了一种使用CoreML处理图像的新方式。在CoreML 3之前,若要使用CoreML的.mlmodel文件处理图像,需要使用CVPixelBuffer对象(涉及图像转换),或者借助苹果的Vision框架与CoreML配合使用。
而在CoreML 3中,可以使用MLFeatureValue。MLFeatureValue允许将CGImage对象(即图像文件)直接传入CoreML模型。通过查看将CoreML模型拖入Xcode项目时自动生成的类内容,就能了解如何使用MLFeatureValue。
例如,之前构建的水果检测模型的自动生成代码中,`WhatsMyFruitInput`类和`WhatsMyFruitOutput`类都遵循`MLFeatureProvider`协议。`WhatsMyFruitInput`类的`featureValue`函数返回一个包含图像的`MLFeatureValue`,该图像会通过`CVPixelBuffer`自动转换。
```swift
class WhatsMyFruitInput : MLFeatureProvider {
/// Input image to be classified as color (kCVPixelFormatType_32BGRA)
/// image buffer, 299 pixels wide by 299 pixels high
var image: CVPixelBuffer
var featureNames: Set<String> {
get {
return ["image"]
}
}
func featureValue(for featureName: String) -> MLFeatureValue? {
if (featureName == "image") {
return MLFeatureValue(pixelBuffer: image)
}
return nil
}
init(image: CVPixelBuffer) {
self.image = image
}
}
class WhatsMyFruitOutput : MLFeatureProvider {
/// Source provided by CoreML
private let provider : MLFeatureProvider
/// Probability of each category as dictionary of strings to doubles
lazy var classLabelProbs: [String : Double] = {
[unowned self] in return self.provider.featureValue(for:
"classLabelProbs")!.dictionaryValue as! [String : Double]
}()
/// Most likely image category as s
```
0
0
复制全文
相关推荐










