Swift 在Xcode中使用MLModels时如何重写更少的代码
抽象:当我将Swift 在Xcode中使用MLModels时如何重写更少的代码,swift,oop,coreml,createml,Swift,Oop,Coreml,Createml,抽象:当我将.mlModel拖入Xcode时,Xcode为模型生成一个类接口 我使用的所有模型输入都接受公共初始值设定项参数 返回唯一的输入类,这些类被传递到模型的predict(输入:UniqueInput)方法和 它们返回一个唯一的ModelOutput实例 它有一个公共的lazy-var-dependent:String属性 问题:每次拖动新的.mlModel时生成的唯一类要求我每次重写代码 目标:利用公共参数和从属属性,以便在拖动新.mlModels时尽可能减少需要重写的代码量 当前
.mlModel
拖入Xcode
时,Xcode
为模型生成一个类接口
- 我使用的所有模型输入都接受公共初始值设定项参数
- 返回唯一的输入类,这些类被传递到模型的
方法和predict(输入:UniqueInput)
- 它们返回一个唯一的
实例ModelOutput
- 它有一个公共的
属性lazy-var-dependent:String
.mlModel
时生成的唯一类要求我每次重写代码
目标:利用公共参数和从属属性,以便在拖动新.mlModels
时尽可能减少需要重写的代码量
当前失败尝试
我试图使自动生成的模型输入符合ModelVersion1
协议,以便新生成的模型输入具有共同的类型。但是,具有初始值设定项的协议要求初始值设定项实现对自动生成类中我无法控制的类具有required
关键字
func createRunningDataFrame() {
var transactions: [Transaction] = []
let model = try? MITO_1(configuration: MLModelConfiguration())
URLRequest.streamFor(ticker: "MITO") { (runningFrame: DataFrame, price, ticker) in
// ----------------------------> key line ----------------------
guard let dependent: Double = try? model?.prediction(input: runningFrame.modelInput()!).dependent.double,
// <-------------------------------------------------------------
let direction = Direction(dependent: dependent) else { return }
URLRequest.transact(direction, price, ticker) { transaction in
transactions.append(transaction)
}
}
}
数据帧
extension DataFrame {
func modelInput<T: ModelVersion1>() -> T? {
guard let daysOfWeek = self.cell(for: "daysOfWeek"),
let tradingsHours = self.cell(for: "tradingsHours"),
let quarters = self.cell(for: "quarters") else { return nil }
return T(
daysOfWeek: daysOfWeek,
tradingsHours: tradingsHours,
quarters: quarters
)
}
}
串
extension String {
var double: Double? {
Double(self)
}
}
将自动生成的类复制到您自己的Swift文件中。禁用自动生成。修改Swift文件以满足您的需要
请注意,自动生成的文件只是为了方便起见。它包装了
MLModel
API。您可以直接使用此API,因此不必使用自动生成的内容。如何禁用自动生成?在应用程序的设置中,只需搜索“CoreML编译器”,它就可以让您在Swift、Objective-C或不生成任何代码之间进行选择。我在项目的构建设置中找不到它,我在应用程序的目标构建设置中也找不到它。请确保选择了“所有”设置(而不仅仅是“基本”)。耶。在我的项目构建设置中,我找到了它。非常感谢。
extension MITO_1Input: ModelVersion1 {}
protocol ModelVersion1: AnyObject {
init(daysOfWeek: String, tradingsHours: String, quarters: String)
}
extension String {
var double: Double? {
Double(self)
}
}