我正在嘗試學習 Tensorflow 的基礎知識。所以我認為一個好的第一步是嘗試做一個簡單的線性回歸來確定來自噪聲資料的直線方程。
所以,我的第一步是生成資料:
import random;
import matplotlib.pyplot as pyplot
RAND_RANGE = range(-100,100);
X_RANGE = range(-10,10);
NOISINESS = 0.5;
NOISE_RANGE = range(int(RAND_RANGE.start * NOISINESS), int(RAND_RANGE.stop * NOISINESS));
m = random.randrange(RAND_RANGE.start, RAND_RANGE.stop); # Python devs... Why doesn't a function that gets something IN A RANGE have an overload that takes a range... Huh?!
c = random.randrange(RAND_RANGE.start, RAND_RANGE.stop);
n = [random.randrange(NOISE_RANGE.start, NOISE_RANGE.stop) for _ in X_RANGE];
real_x = [x for x in X_RANGE];
real_y = [m * x c for x in real_x];
noisy_y = [m * x c n for x, n in zip(real_x, n)];
這似乎作業得很好(為簡潔起見,不包括繪圖代碼):
那么我試圖將它加載到一個基本的張量流模型中,如下所示:
import tensorflow as tf;
import numpy as np;
from tensorflow import keras;
from tensorflow.keras import layers;
features = np.array(real_x);
labels = np.array(real_y);
line_model = tf.keras.Sequential(
[
layers.Dense(units=1)
]
)
line_model.build(input_shape=[len(real_y)]);
line_model.summary();
line_model.compile(
optimizer = tf.keras.optimizers.Adam(learning_rate=0.1), loss='mean_absolute_error'
)
history = line_model.fit(
features,
labels,
epochs=100,
verbose=0
)
但是,我在這里遇到了問題。我發現的每個 教程似乎只是使用 numpy 從 CSV 檔案中加載資料,然后只是盲目地將其扔到 Tensorflow 上,而沒有真正解釋它期望資料的形式。
我很可能在這里誤解了一些東西,但據我所知,我的real_x
價值觀是我的特征,real_y
價值觀是標簽。
所以我嘗試了以下方法:
- 將 XY 值放入單獨的 numpy 陣列中
- 將 XY 值放入單個 2D numpy 陣列中
- 的各種值
input_shape
(我認為它應該只是一個包含專案數量的單個值,但這給了我一個關于密集需要最少二維數量的錯誤)
在嘗試這些不同的事情時,我遇到了各種不同的錯誤。
我覺得我在這里遺漏了一些基本的東西,這不應該太復雜,但我不愿意只是從我不理解的教程中大量復制代碼(因此我為什么要自己做鍛煉是相鄰的,但與他們正在做的事情不同)。
我在這里做錯了什么,我應該如何將這些資料加載到模型中,以便讓我預測m
和c
(或一系列y
我可以計算的去噪值,然后m
作為c
額外的步驟)給定real_x
和noisy_y
?
uj5u.com熱心網友回復:
在為模型指定輸入形狀時,您需要考慮每個目標的特征數量,因此這是不正確的:
line_model.build(input_shape=[len(real_y)]);
在實體中使用
input_shape
引數:tf.keras.layers.Layer
line_model = tf.keras.Sequential( [layers.Dense(units=1, input_shape=(1, ))] )
使用
input_dim
:line_model = tf.keras.Sequential( [layers.Dense(units=1, input_dim=1)] )
input_shape = (1, )
因為每個目標都有一個功能,所以input_dim
也遵循相同的邏輯。
使用
delayed-build
有點不同的模式/方法:line_model.build(input_shape=[None, 1])
使用.build()
方法時,需要向模型提供批量大小,這里None
表示模型接受任何批量大小。這被稱為batch_input_shape
。
假設您有 100 個樣本,并通過 40 作為批量大小。最后一批將有 20 個元素(40-40-20),因此模型可以接受最后 20 個元素,如果它通過None
,否則會導致錯誤。
如果您在第一層使用input_shape
or input_dim
,則無需擔心指定batch_size
.
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/507400.html
上一篇:InferSchemanumpy.float32PySpark
下一篇:如何沿陣列維度映射克羅內克積?