我正在使用 IMDB 数据集在 Keras 中训练模型。对于这个带有 LSTM 层的模型,准确率约为 50%:
model = Sequential()
model.add(Embedding(max_features, 32))
model.add(LSTM(32, return_sequences=True))
model.add(LSTM(32, return_sequences=True))
model.add(LSTM(32))
model.add(Dense(1, activation='sigmoid'))
Run Code Online (Sandbox Code Playgroud)
准确性:
loss: 0.6933 - acc: 0.5007 - val_loss: 0.6932 - val_acc: 0.4947
Run Code Online (Sandbox Code Playgroud)
我也尝试过使用单个 LSTM 层,但它也提供了类似的准确性。
然而,如果我不使用 LSTM 层,准确率会达到 82% 左右
model = models.Sequential()
model.add(layers.Dense(16, kernel_regularizer=regularizers.l1(0.001), activation='relu', input_shape=(10000,)))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(16, kernel_regularizer=regularizers.l1(0.001), activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(1, activation='sigmoid'))
Run Code Online (Sandbox Code Playgroud)
准确性:
loss: 0.6738 - acc: 0.8214 - val_loss: 0.6250 - val_acc: 0.8320
Run Code Online (Sandbox Code Playgroud)
这就是我编译和拟合模型的方式:
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])
model.fit(partial_x_train, partial_y_train, epochs=Numepochs, batch_size=Batchsize, validation_data=(x_val, y_val))
Run Code Online (Sandbox Code Playgroud)
这该如何解释呢?我认为 LSTM 对于顺序文本数据非常有效?
I wanted to generate more images using Keras as you can see in here, using this code (almost the same as source>Random Rotations):
# Random Rotations
from keras.datasets import mnist
from keras.preprocessing.image import ImageDataGenerator
from matplotlib import pyplot
from keras import backend as K
datagen = ImageDataGenerator(rotation_range=90)
# fit parameters from data
datagen.fit(cats["images"])
print(np.asarray(cats["label"]).shape) #output=(12464,)
print(np.asarray(cats["images"]).shape) #output=(12464, 60, 60, 1)
# configure batch size and retrieve one batch of images
for X_batch, y_batch in datagen.flow(cats["images"], cats["label"], batch_size=9):
# …Run Code Online (Sandbox Code Playgroud) 目前,我正在尝试在 Python 中加载 280,000 个 MP3 音频文件,其中文件的平均持续时间约为 5 秒。我将Librosa用于此目的以及后续阶段的进一步处理(例如计算频谱图)。
但是,我意识到加载文件非常慢,因为加载、解压缩和重新采样每个文件平均需要 370 毫秒。如果我关闭重新采样(即librosa.load(..., sr=None)),大约需要 200 毫秒,但考虑到我拥有的大量文件,这仍然不是很好。不出所料,无需重新采样即可加载 wav 文件非常快(< 1 ms);但是如果我们执行重新采样,大约需要 160 毫秒。
现在我想知道是否有任何更快的方法来做到这一点,无论是直接在 Python 中还是在 Linux 中使用外部工具,条件是我以后可以将结果加载回 Python。
顺便说一下,我尝试使用multiprocessing大小为 4 的池并实现了 2-3 倍的加速,但我正在寻找更多(最好 > 10 倍)。
注:原始文件为人声,采样率为48KHz,码率为64Kbps;我想将它们下采样到 16KHz。
假设我有以下内容:
image_data_generator = ImageDataGenerator(rescale=1./255)
train_generator = image_data_generator.flow_from_directory(
'my_directory',
target_size=(28, 28),
batch_size=32,
class_mode='categorical'
)
Run Code Online (Sandbox Code Playgroud)
然后 mytrain_generator填充来自 的数据my_directory,其中包含两个子文件夹,将数据分为类0和1.
假设我还有另一个目录that_directory,也将数据拆分为类0和1. 我想train_generator用这个额外的数据来增强我的。
运行train_generator = image_data_generator.flow_from_directory('that_directory', ...)会从 中删除先前的数据my_directory。
有没有办法在DirectoryIterator不改变文件夹结构本身的情况下将两组数据增加或附加到一个生成器或一个像 a 一样操作的对象中?
我一直在这里关注这个例子,我想知道这个精度函数到底是如何工作的:
def compute_accuracy(y_true, y_pred):
'''Compute classification accuracy with a fixed threshold on distances.
'''
pred = y_pred.ravel() < 0.5
return np.mean(pred == y_true)
Run Code Online (Sandbox Code Playgroud)
据我所知,在这种情况下网络的输出将是两对之间的距离。那么在这种情况下我们如何计算准确率呢?“0.5”阈值指的是什么?另外,如何计算错误率?
我有一个使用 TensorFlow 1 运行 Keras 的代码。该代码修改了损失函数以进行深度强化学习:
import os
import gym
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
env = gym.make("CartPole-v0").env
env.reset()
n_actions = env.action_space.n
state_dim = env.observation_space.shape
from tensorflow import keras
import random
from tensorflow.keras import layers as L
import tensorflow as tf
from tensorflow.python.keras.backend import set_session
sess = tf.compat.v1.Session()
graph = tf.compat.v1.get_default_graph()
init = tf.global_variables_initializer()
sess.run(init)
network = keras.models.Sequential()
network.add(L.InputLayer(state_dim))
# let's create a network for approximate q-learning following guidelines above
network.add(L.Dense(5, activation='elu'))
network.add(L.Dense(5, …Run Code Online (Sandbox Code Playgroud) 我正在使用Imagenet上预先训练的Keras Inception_v3:
base_model = InceptionV3(weights='imagenet', include_top=True)
Run Code Online (Sandbox Code Playgroud)
当我从生成的图像预测,我得到具有形状的输出向量(n,1000)与n报错图像的数量。因此,现在如果我想解释结果,我需要用于训练模型的1000个输出类的名称...但是我找不到它!
任何的想法 ?
我使用Keras模拟神经网络,我试图用一个图来评估它acc和val_acc。我在以下代码行中有 3 个错误:
print(history.keys())错误是function' object has not attribute 'keys'y_pred = classifier.predict(X_test)错误是name 'classifier' is not definedplt.plot(history.history['acc'])错误是 'History' object is not subscriptable我也在尝试绘制 ROC 曲线,我该怎么做?
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import keras
from keras.models import Sequential
from keras.layers import Dense
from sklearn import cross_validation
from matplotlib import pyplot
from keras.utils import plot_model
dataset = pd.read_csv('Data_BP.csv')
X = dataset.iloc[:, 0:11].values
y = …Run Code Online (Sandbox Code Playgroud) 我正在尝试将 LSTM 与 CNN 结合使用,但由于错误而卡住了。这是我试图实现的模型:
model=Sequential()
model.add(Conv2D(32, (3, 3), input_shape=(28, 28,3), activation='relu'))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(32, activation='relu'))
model.add(LSTM(128, return_sequences=True,input_shape=(1,32), activation='relu'))
model.add(LSTM(256))
model.add(Dropout(0.25))
model.add(Dense(37))
model.compile(loss='categorical_crossentropy', optimizer='adam')
Run Code Online (Sandbox Code Playgroud)
错误发生在第一个 LSTM 层:
ERROR: Input 0 is incompatible with layer lstm_12: expected ndim=3, found ndim=2
Run Code Online (Sandbox Code Playgroud) 我发现keras.backendor 中有很多相同的名称keras.layers,例如keras.backend.concatenate和keras.layers.Concatenate。我隐约知道一个是张量,另一个是层。但是,当代码太大时,那么多函数使我感到困惑,即张量或层。有人有解决这个问题的好主意吗?
我发现的一种方法是首先在一个函数中定义所有占位符,但是该函数将其视为变量可能会在最后返回层,而另一个函数将这一层视为变量可能会返回另一个变量。
我正在学习 TensorFlow 和 LSTM,我想知道为什么当我训练它返回一个值时,我的预测输出有多个值。我的目标是在使用数组进行情感分析训练后获得 0 到 1 之间的单个值。
训练输入数据如下所示:
[[59, 21, ... 118, 194], ... [12, 110, ... 231, 127]]
Run Code Online (Sandbox Code Playgroud)
所有输入数组的长度相同,用 0 填充。训练目标数据如下所示:
[1.0, 0.5, 0.0, 1.0, 0.0 ...]
Run Code Online (Sandbox Code Playgroud)
模型:
model = Sequential()
model.add(Embedding(input_length, 64, mask_zero=True))
model.add(LSTM(100))
model.add(Dense(1, activation=tf.nn.sigmoid))
Run Code Online (Sandbox Code Playgroud)
为什么预测似乎一次评估每个单独的值而不是整个数组?
model.predict([192])
# Returns [[0.5491102]]
model.predict([192, 25])
# Returns [[0.5491102, 0.4923803]]
model.predict([192, 25, 651])
# Returns [[0.5491102, 0.4923803, 0.53853387]]
Run Code Online (Sandbox Code Playgroud)
我不想取输出的平均值,因为输入数组中的值之间的关系对于情感分析很重要。如果我正在训练预测单个值,我不明白为什么不输出单个值。我是 TensorFlow、Keras 和分层神经网络的新手,所以我确定我遗漏了一些明显的东西。
keras ×10
python ×8
tensorflow ×5
lstm ×3
audio ×1
generator ×1
imagenet ×1
keras-layer ×1
librosa ×1
mp3 ×1
roc ×1
scikit-learn ×1
tf.keras ×1